diff --git a/modules/juce_osc/juce_osc.h b/modules/juce_osc/juce_osc.h index 6195b449b2..d171c10355 100644 --- a/modules/juce_osc/juce_osc.h +++ b/modules/juce_osc/juce_osc.h @@ -60,6 +60,12 @@ #pragma once #define JUCE_OSC_H_INCLUDED +/** Config: JUCE_IP_AND_PORT_DETECTION + If enabled, this will add remoteIP and remotePort variables to osc packets, corresponding to the sender's ip and port when receiving messages. +*/ +#ifndef JUCE_IP_AND_PORT_DETECTION +#define JUCE_IP_AND_PORT_DETECTION 0 +#endif #include #include diff --git a/modules/juce_osc/osc/juce_OSCMessage.cpp b/modules/juce_osc/osc/juce_OSCMessage.cpp index 47f0021cab..4a6da3d4d3 100644 --- a/modules/juce_osc/osc/juce_OSCMessage.cpp +++ b/modules/juce_osc/osc/juce_OSCMessage.cpp @@ -50,6 +50,26 @@ OSCAddressPattern OSCMessage::getAddressPattern() const noexcept return addressPattern; } +#if JUCE_IP_AND_PORT_DETECTION +String OSCMessage::getSenderIPAddress() const noexcept +{ + return senderIPAddress; +} + +void OSCMessage::setSenderIPAddress(const String& ip) noexcept +{ + senderIPAddress = ip; +} + +int OSCMessage::getSenderPortNumber() const noexcept +{ + return senderPortNumber; +} +void OSCMessage::setSenderPortNumber(int port) noexcept +{ + senderPortNumber = port; +} +#endif //============================================================================== int OSCMessage::size() const noexcept { diff --git a/modules/juce_osc/osc/juce_OSCMessage.h b/modules/juce_osc/osc/juce_OSCMessage.h index f49e931c61..b07eac5c5a 100644 --- a/modules/juce_osc/osc/juce_OSCMessage.h +++ b/modules/juce_osc/osc/juce_OSCMessage.h @@ -91,6 +91,16 @@ public: /** Returns the address pattern of the OSCMessage. */ OSCAddressPattern getAddressPattern() const noexcept; +#if JUCE_IP_AND_PORT_DETECTION + /** Returns the sender's IP Address. */ + String getSenderIPAddress() const noexcept; + void setSenderIPAddress(const String& ip) noexcept; + + /** Returns the sender's port number. */ + int getSenderPortNumber() const noexcept; + void setSenderPortNumber(int port) noexcept; +#endif + /** Returns the number of OSCArgument objects that belong to this OSCMessage. */ int size() const noexcept; @@ -178,6 +188,11 @@ private: //============================================================================== OSCAddressPattern addressPattern; Array arguments; + +#if JUCE_IP_AND_PORT_DETECTION + String senderIPAddress; + int senderPortNumber = 0; +#endif }; diff --git a/modules/juce_osc/osc/juce_OSCReceiver.cpp b/modules/juce_osc/osc/juce_OSCReceiver.cpp index 545a289299..f0510ba5d3 100644 --- a/modules/juce_osc/osc/juce_OSCReceiver.cpp +++ b/modules/juce_osc/osc/juce_OSCReceiver.cpp @@ -56,9 +56,18 @@ namespace @param sourceData the block of data to use as the stream's source @param sourceDataSize the number of bytes in the source data block */ + +#if JUCE_IP_AND_PORT_DETECTION + OSCInputStream (const void* sourceData, size_t sourceDataSize, const String& senderIPAddress, const int& senderPortNumber) : + input(sourceData, sourceDataSize, false), + senderIPAddress(senderIPAddress), + senderPortNumber(senderPortNumber) + {} +#else OSCInputStream (const void* sourceData, size_t sourceDataSize) : input (sourceData, sourceDataSize, false) {} +#endif //============================================================================== /** Returns a pointer to the source data block from which this stream is reading. */ @@ -273,6 +282,11 @@ namespace private: MemoryInputStream input; +#if JUCE_IP_AND_PORT_DETECTION + String senderIPAddress; + int senderPortNumber; +#endif + //============================================================================== void readPaddingZeros (size_t bytesRead) { @@ -427,10 +441,15 @@ struct OSCReceiver::Pimpl : private Thread, }; //============================================================================== - void handleBuffer (const char* data, size_t dataSize) +#if JUCE_IP_AND_PORT_DETECTION + void handleBuffer(const char* data, size_t dataSize, const String& senderIPAddress, const int& senderPortNumber) { - OSCInputStream inStream (data, dataSize); - + OSCInputStream inStream(data, dataSize, senderIPAddress, senderPortNumber); +#else + void handleBuffer(const char* data, size_t dataSize) + { + OSCInputStream inStream(data, dataSize); +#endif try { auto content = inStream.readElementWithKnownSize (dataSize); @@ -477,10 +496,19 @@ private: if (ready == 0) continue; + +#if JUCE_IP_AND_PORT_DETECTION + String senderIPAddress = ""; + int senderPortNumber = 0; + auto bytesRead = (size_t) socket->read (oscBuffer.getData(), bufferSize, false, senderIPAddress, senderPortNumber); + if (bytesRead >= 4) + handleBuffer(oscBuffer.getData(), bytesRead, senderIPAddress, senderPortNumber); +#else auto bytesRead = (size_t) socket->read (oscBuffer.getData(), bufferSize, false); if (bytesRead >= 4) handleBuffer (oscBuffer.getData(), bytesRead); +#endif } }