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 <memory>
#include <tuple>
DECLARE_LOG_CATEGORY_EXTERN(LogOSC, Log, All);
@@ -86,7 +86,9 @@ void UOscDispatcher::UnregisterReceiver(IOscReceiverInterface * 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)
{
@@ -132,7 +134,7 @@ static void SendMessage(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruc
}
// 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.
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)
{
@@ -155,16 +159,16 @@ static void SendBundle(TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct
{
if(it->IsBundle())
{
SendBundle(_pendingMessages, osc::ReceivedBundle(*it));
SendBundle(_pendingMessages, osc::ReceivedBundle(*it), senderIp);
}
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());
if(packet.State() != osc::SUCCESS)
@@ -175,11 +179,11 @@ void UOscDispatcher::Callback(const FArrayReaderPtr& data, const FIPv4Endpoint&)
if(packet.IsBundle())
{
SendBundle(_pendingMessages, osc::ReceivedBundle(packet));
SendBundle(_pendingMessages, osc::ReceivedBundle(packet), endpoint.GetAddress());
}
else
{
SendMessage(_pendingMessages, osc::ReceivedMessage(packet));
SendMessage(_pendingMessages, osc::ReceivedMessage(packet), endpoint.GetAddress());
}
// Set a single callback in the main thread per frame.
@@ -213,12 +217,14 @@ void UOscDispatcher::CallbackMainThread()
FScopeLock ScopeLock(&_receiversMutex);
std::pair<FName, TArray<FOscDataElemStruct>> message;
std::tuple<FName, TArray<FOscDataElemStruct>, FIPv4Address> 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)
{
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;
FSocket * _socket;
FUdpSocketReceiver * _socketReceiver;
TCircularQueue<std::pair<FName, TArray<FOscDataElemStruct>>> _pendingMessages;
TCircularQueue<std::tuple<FName, TArray<FOscDataElemStruct>, FIPv4Address>> _pendingMessages;
int32 _taskSpawned;
/// Protects _receivers
@@ -17,7 +17,7 @@ public:
FString AddressFilter;
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:
@@ -31,9 +31,9 @@ public:
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:
@@ -7,7 +7,7 @@
// 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))
@@ -35,9 +35,9 @@ public:
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:
@@ -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)
{
@@ -24,7 +24,7 @@ private:
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:
FString _address;
@@ -7,7 +7,7 @@
struct IOscReceiverInterface
{
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();
}
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);
}
};