add the sender IP as a parameter of OnOscReceived events.

This commit is contained in:
monsieurgustav
2016-03-15 23:40:16 +01:00
parent 69b6b05d2d
commit 7358d0baf2
8 changed files with 29 additions and 22 deletions
+1
View File
@@ -17,5 +17,6 @@
#include <algorithm> #include <algorithm>
#include <memory> #include <memory>
#include <tuple>
DECLARE_LOG_CATEGORY_EXTERN(LogOSC, Log, All); DECLARE_LOG_CATEGORY_EXTERN(LogOSC, Log, All);
@@ -86,7 +86,9 @@ void UOscDispatcher::UnregisterReceiver(IOscReceiverInterface * receiver)
_receivers.Remove(receiver); _receivers.Remove(receiver);
} }
static void SendMessage(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct>>> & _pendingMessages, const osc::ReceivedMessage & message) static void SendMessage(TCircularQueue<std::tuple<FName, TArray<FOscDataElemStruct>, FIPv4Address>> & _pendingMessages,
const osc::ReceivedMessage & message,
const FIPv4Address & senderIp)
{ {
if(message.State() != osc::SUCCESS) if(message.State() != osc::SUCCESS)
{ {
@@ -132,7 +134,7 @@ static void SendMessage(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruc
} }
// save it in pending messages // save it in pending messages
const auto added = _pendingMessages.Enqueue(std::make_pair(address, data)); const auto added = _pendingMessages.Enqueue(std::make_tuple(address, data, senderIp));
// the circular buffer may be full. // the circular buffer may be full.
if(!added) if(!added)
@@ -141,7 +143,9 @@ static void SendMessage(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruc
} }
} }
static void SendBundle(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct>>> & _pendingMessages, const osc::ReceivedBundle & bundle) static void SendBundle(TCircularQueue<std::tuple<FName, TArray<FOscDataElemStruct>, FIPv4Address>> & _pendingMessages,
const osc::ReceivedBundle & bundle,
const FIPv4Address & senderIp)
{ {
if(bundle.State() != osc::SUCCESS) if(bundle.State() != osc::SUCCESS)
{ {
@@ -155,16 +159,16 @@ static void SendBundle(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct
{ {
if(it->IsBundle()) if(it->IsBundle())
{ {
SendBundle(_pendingMessages, osc::ReceivedBundle(*it)); SendBundle(_pendingMessages, osc::ReceivedBundle(*it), senderIp);
} }
else else
{ {
SendMessage(_pendingMessages, osc::ReceivedMessage(*it)); SendMessage(_pendingMessages, osc::ReceivedMessage(*it), senderIp);
} }
} }
} }
void UOscDispatcher::Callback(const FArrayReaderPtr& data, const FIPv4Endpoint&) void UOscDispatcher::Callback(const FArrayReaderPtr& data, const FIPv4Endpoint& endpoint)
{ {
const osc::ReceivedPacket packet((const char *)data->GetData(), data->Num()); const osc::ReceivedPacket packet((const char *)data->GetData(), data->Num());
if(packet.State() != osc::SUCCESS) if(packet.State() != osc::SUCCESS)
@@ -175,11 +179,11 @@ void UOscDispatcher::Callback(const FArrayReaderPtr& data, const FIPv4Endpoint&)
if(packet.IsBundle()) if(packet.IsBundle())
{ {
SendBundle(_pendingMessages, osc::ReceivedBundle(packet)); SendBundle(_pendingMessages, osc::ReceivedBundle(packet), endpoint.GetAddress());
} }
else else
{ {
SendMessage(_pendingMessages, osc::ReceivedMessage(packet)); SendMessage(_pendingMessages, osc::ReceivedMessage(packet), endpoint.GetAddress());
} }
// Set a single callback in the main thread per frame. // Set a single callback in the main thread per frame.
@@ -213,12 +217,14 @@ void UOscDispatcher::CallbackMainThread()
FScopeLock ScopeLock(&_receiversMutex); FScopeLock ScopeLock(&_receiversMutex);
std::pair<FName, TArray<FOscDataElemStruct>> message; std::tuple<FName, TArray<FOscDataElemStruct>, FIPv4Address> message;
while(_pendingMessages.Dequeue(message)) while(_pendingMessages.Dequeue(message))
{ {
const FIPv4Address & senderIp = std::get<2>(message);
FString senderIpStr = FString::Printf(TEXT("%i.%i.%i.%i"), senderIp.GetByte(3), senderIp.GetByte(2), senderIp.GetByte(1), senderIp.GetByte(0));
for(auto receiver : _receivers) for(auto receiver : _receivers)
{ {
receiver->SendEvent(message.first, message.second); receiver->SendEvent(std::get<0>(message), std::get<1>(message), senderIpStr);
} }
} }
} }
@@ -49,7 +49,7 @@ private:
std::pair<FIPv4Address, uint32_t> _listening; std::pair<FIPv4Address, uint32_t> _listening;
FSocket * _socket; FSocket * _socket;
FUdpSocketReceiver * _socketReceiver; FUdpSocketReceiver * _socketReceiver;
TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct>>> _pendingMessages; TCircularQueue<std::tuple<FName, TArray<FOscDataElemStruct>, FIPv4Address>> _pendingMessages;
int32 _taskSpawned; int32 _taskSpawned;
/// Protects _receivers /// Protects _receivers
@@ -17,7 +17,7 @@ public:
FString AddressFilter; FString AddressFilter;
UFUNCTION(BlueprintImplementableEvent, Category=OSC) UFUNCTION(BlueprintImplementableEvent, Category=OSC)
void OnOscReceived(const FName & Address, const TArray<FOscDataElemStruct> & Data); void OnOscReceived(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp);
public: public:
@@ -31,9 +31,9 @@ public:
return AddressFilter; return AddressFilter;
} }
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data) void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp)
{ {
OnOscReceived(Address, Data); OnOscReceived(Address, Data, SenderIp);
} }
private: private:
@@ -7,7 +7,7 @@
// declare the OnOscReceived event type // declare the OnOscReceived event type
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FComponentOscReceivedSignature, const FName &, Address, const TArray<FOscDataElemStruct> &, Data); DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FComponentOscReceivedSignature, const FName &, Address, const TArray<FOscDataElemStruct> &, Data, const FString &, SenderIp);
UCLASS(ClassGroup=OSC, meta = (BlueprintSpawnableComponent)) UCLASS(ClassGroup=OSC, meta = (BlueprintSpawnableComponent))
@@ -35,9 +35,9 @@ public:
return AddressFilter; return AddressFilter;
} }
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data) void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp)
{ {
OnOscReceived.Broadcast(Address, Data); OnOscReceived.Broadcast(Address, Data, SenderIp);
} }
private: private:
@@ -36,7 +36,7 @@ void OscReceiverInputKey::RegisterKey() const
} }
} }
void OscReceiverInputKey::SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data) void OscReceiverInputKey::SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp)
{ {
if(Address != _addressName) if(Address != _addressName)
{ {
@@ -24,7 +24,7 @@ private:
return _address; return _address;
} }
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data) override; void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp) override;
private: private:
FString _address; FString _address;
@@ -7,7 +7,7 @@
struct IOscReceiverInterface struct IOscReceiverInterface
{ {
virtual const FString & GetAddressFilter() const = 0; virtual const FString & GetAddressFilter() const = 0;
virtual void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data) = 0; virtual void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp) = 0;
}; };
@@ -26,8 +26,8 @@ struct BasicOscReceiver : IOscReceiverInterface
return _impl->GetAddressFilter(); return _impl->GetAddressFilter();
} }
void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data) final void SendEvent(const FName & Address, const TArray<FOscDataElemStruct> & Data, const FString & SenderIp) final
{ {
_impl->SendEvent(Address, Data); _impl->SendEvent(Address, Data, SenderIp);
} }
}; };