From f342f915f423b8b251d33cffc88cc94e596c0547 Mon Sep 17 00:00:00 2001 From: monsieurgustav Date: Fri, 3 Nov 2017 15:46:03 +0100 Subject: [PATCH] validate the "SendTargets" setting --- OSC/Source/OSC/Private/OscModule.cpp | 2 +- OSC/Source/OSC/Private/OscSettings.cpp | 66 ++++++++++++++++--- OSC/Source/OSC/Private/OscSettings.h | 16 ++++- .../OSC/Public/Common/OscFunctionLibrary.h | 2 +- 4 files changed, 74 insertions(+), 12 deletions(-) diff --git a/OSC/Source/OSC/Private/OscModule.cpp b/OSC/Source/OSC/Private/OscModule.cpp index 030bf43..3b28c21 100644 --- a/OSC/Source/OSC/Private/OscModule.cpp +++ b/OSC/Source/OSC/Private/OscModule.cpp @@ -103,7 +103,7 @@ public: { FIPv4Address receiveAddress(0); uint32_t receivePort; - if(UOscSettings::Parse(settings->ReceiveFrom, &receiveAddress, &receivePort)) + if(UOscSettings::Parse(settings->ReceiveFrom, &receiveAddress, &receivePort, UOscSettings::ParseOption::OptionalAddress)) { _dispatcher->Listen(receiveAddress, receivePort, settings->MulticastLoopback); } diff --git a/OSC/Source/OSC/Private/OscSettings.cpp b/OSC/Source/OSC/Private/OscSettings.cpp index a61473d..ab3fc44 100644 --- a/OSC/Source/OSC/Private/OscSettings.cpp +++ b/OSC/Source/OSC/Private/OscSettings.cpp @@ -54,7 +54,7 @@ int32 UOscSettings::AddSendTarget(const FString & ip_port) FIPv4Address address(0); uint32_t port; - if(Parse(ip_port, &address, &port) && address != FIPv4Address::Any) + if(Parse(ip_port, &address, &port, ParseOption::Strict)) { target->SetIp(address.Value); target->SetPort(port); @@ -142,30 +142,54 @@ void UOscSettings::Send(const uint8 *buffer, int32 length, int32 targetIndex) } } -bool UOscSettings::Parse(const FString & ip_port, FIPv4Address * address, uint32_t * port) +bool UOscSettings::Parse(const FString & ip_port, FIPv4Address * address, uint32_t * port, ParseOption option) { if(ip_port.IsEmpty()) { return false; } - FIPv4Address addressResult(0); - uint32_t portResult; + FIPv4Address addressResult = FIPv4Address::Any; + uint32_t portResult = 0; int32 sep = -1; - if(ip_port.FindChar(TEXT(':'), sep)) + const bool hasSep = ip_port.FindChar(TEXT(':'), sep); + + if(hasSep) { + portResult = FCString::Atoi(&ip_port.GetCharArray()[sep+1]); + if(portResult == 0) + { + return false; + } + const auto ip = ip_port.Left(sep).Trim(); if(!FIPv4Address::Parse(ip, addressResult)) { return false; } } - - portResult = FCString::Atoi(&ip_port.GetCharArray()[sep+1]); - if(portResult == 0) + else { - return false; + if(option == ParseOption::Strict) + { + return false; + } + else if(option == ParseOption::OptionalAddress) + { + portResult = FCString::Atoi(ip_port.GetCharArray().GetData()); + if(portResult == 0) + { + return false; + } + } + else if(option == ParseOption::OptionalPort) + { + if(!FIPv4Address::Parse(ip_port, addressResult)) + { + return false; + } + } } *address = addressResult; @@ -194,3 +218,27 @@ void UOscSettings::UpdateKeyInputs(UOscDispatcher & dispatcher) _keyReceivers.Add(std::move(receiver)); } } + +void UOscSettings::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent) +{ + static const FName SendTargetsName("SendTargets"); + + if( PropertyChangedEvent.GetPropertyName() == SendTargetsName ) + { + for(auto & target : SendTargets) + { + FIPv4Address address; + uint32_t port; + if( !Parse(target, &address, &port, ParseOption::OptionalPort) || address == FIPv4Address::Any ) + { + target = "127.0.0.1:8000"; + } + else if( port == 0 ) + { + target = address.ToString() + ":8000"; + } + } + } + + Super::PostEditChangeProperty(PropertyChangedEvent); +} diff --git a/OSC/Source/OSC/Private/OscSettings.h b/OSC/Source/OSC/Private/OscSettings.h index 95ce3ee..ccdd5fc 100644 --- a/OSC/Source/OSC/Private/OscSettings.h +++ b/OSC/Source/OSC/Private/OscSettings.h @@ -32,6 +32,11 @@ public: UPROPERTY(Config, EditAnywhere, Category=Receive) FString ReceiveFrom; + /** + * Specify the addresses (ip:port) to send messages to. + * + * Addresses can also be added at runtime with the AddSendOscTarget function. + */ UPROPERTY(Config, EditAnywhere, Category=Send) TArray SendTargets; @@ -58,13 +63,22 @@ public: void UpdateKeyInputs(UOscDispatcher & dispatcher); + void PostEditChangeProperty( struct FPropertyChangedEvent& PropertyChangedEvent) override; + public: + enum class ParseOption + { + Strict, /// "192.168.0.12:8000" + OptionalPort, /// "192.168.0.12" or "192.168.0.12:8000" + OptionalAddress, /// "8000" or "192.168.0.12:8000" + }; + /** * @brief Parse "8000" and "192.168.0.12" to IP and port values. * @return true if succeed */ - static bool Parse(const FString & ip_port, FIPv4Address * address, uint32_t * port); + static bool Parse(const FString & ip_port, FIPv4Address * address, uint32_t * port, ParseOption option); private: int32 AddSendTarget(const FString & ip_port); diff --git a/OSC/Source/OSC/Public/Common/OscFunctionLibrary.h b/OSC/Source/OSC/Public/Common/OscFunctionLibrary.h index 48bf900..e7d71e7 100644 --- a/OSC/Source/OSC/Public/Common/OscFunctionLibrary.h +++ b/OSC/Source/OSC/Public/Common/OscFunctionLibrary.h @@ -124,5 +124,5 @@ public: * @see SendOsc */ UFUNCTION(BlueprintCallable, Category=OSC) - static int32 AddSendOscTarget(FString IpPort); + static int32 AddSendOscTarget(FString IpPort = "127.0.0.1:8000"); };