From 94f04a98064f75c969a090ff6c967d4a31285e26 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 17 Sep 2013 13:24:25 -0700 Subject: [PATCH 1/3] add API to attach payloads to assignments --- libraries/shared/src/Assignment.cpp | 70 ++++++++++++++++++++++------- libraries/shared/src/Assignment.h | 5 +++ 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/libraries/shared/src/Assignment.cpp b/libraries/shared/src/Assignment.cpp index d794495c29..55837e4107 100644 --- a/libraries/shared/src/Assignment.cpp +++ b/libraries/shared/src/Assignment.cpp @@ -22,7 +22,9 @@ Assignment::Assignment(Assignment::Command command, Assignment::Type type, Assig _location(location), _attachedPublicSocket(NULL), _attachedLocalSocket(NULL), - _numberOfInstances(1) + _numberOfInstances(1), + _payload(NULL), + _numPayloadBytes(0) { // set the create time on this assignment gettimeofday(&_time, NULL); @@ -37,7 +39,9 @@ Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) : _location(GlobalLocation), _attachedPublicSocket(NULL), _attachedLocalSocket(NULL), - _numberOfInstances(1) + _numberOfInstances(1), + _payload(NULL), + _numPayloadBytes(0) { // set the create time on this assignment gettimeofday(&_time, NULL); @@ -65,23 +69,31 @@ Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) : if (numBytes > numBytesRead) { - sockaddr* newSocket = NULL; - - if (dataBuffer[numBytesRead++] == IPv4_ADDRESS_DESIGNATOR) { - // IPv4 address - newSocket = (sockaddr*) new sockaddr_in; - unpackSocket(dataBuffer + numBytesRead, newSocket); - } else { - // IPv6 address, or bad designator - qDebug("Received a socket that cannot be unpacked!\n"); + if (_command != Assignment::RequestCommand) { + sockaddr* newSocket = NULL; + + if (dataBuffer[numBytesRead++] == IPv4_ADDRESS_DESIGNATOR) { + // IPv4 address + newSocket = (sockaddr*) new sockaddr_in; + numBytesRead += unpackSocket(dataBuffer + numBytesRead, newSocket); + + if (_command == Assignment::CreateCommand) { + delete _attachedLocalSocket; + _attachedLocalSocket = newSocket; + } else { + delete _attachedPublicSocket; + _attachedPublicSocket = newSocket; + } + } else { + // IPv6 address, or bad designator + qDebug("Received a socket that cannot be unpacked!\n"); + } } - if (_command == Assignment::CreateCommand) { - delete _attachedLocalSocket; - _attachedLocalSocket = newSocket; - } else { - delete _attachedPublicSocket; - _attachedPublicSocket = newSocket; + _numPayloadBytes = numBytes - numBytesRead; + + if (_numPayloadBytes > 0) { + memcpy(_payload, dataBuffer + numBytesRead, numBytes - numBytesRead); } } } @@ -89,6 +101,25 @@ Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) : Assignment::~Assignment() { delete _attachedPublicSocket; delete _attachedLocalSocket; + delete _payload; + _numPayloadBytes = 0; +} + +const int MAX_PAYLOAD_BYTES = 1024; + +void Assignment::setPayload(uchar* payload, int numBytes) { + _payload = payload; + + if (numBytes > MAX_PAYLOAD_BYTES) { + qDebug("Set payload called with number of bytes greater than maximum (%d). Will only transfer %d bytes.\n", + MAX_PAYLOAD_BYTES, + MAX_PAYLOAD_BYTES); + + _numPayloadBytes = 1024; + } else { + _numPayloadBytes = numBytes; + } + } QString Assignment::getUUIDStringWithoutCurlyBraces() const { @@ -141,6 +172,11 @@ int Assignment::packToBuffer(unsigned char* buffer) { numPackedBytes += packSocket(buffer + numPackedBytes, socketToPack); } + if (_numPayloadBytes) { + memcpy(buffer + numPackedBytes, _payload, _numPayloadBytes); + numPackedBytes += _numPayloadBytes; + } + return numPackedBytes; } diff --git a/libraries/shared/src/Assignment.h b/libraries/shared/src/Assignment.h index 59e2c45db7..4f46ea9e7e 100644 --- a/libraries/shared/src/Assignment.h +++ b/libraries/shared/src/Assignment.h @@ -56,6 +56,9 @@ public: Assignment::Location getLocation() const { return _location; } const timeval& getTime() const { return _time; } + uchar* getPayload() { return _payload; } + void setPayload(uchar *payload, int numBytes); + int getNumberOfInstances() const { return _numberOfInstances; } void setNumberOfInstances(int numberOfInstances) { _numberOfInstances = numberOfInstances; } void decrementNumberOfInstances() { --_numberOfInstances; } @@ -83,6 +86,8 @@ private: sockaddr* _attachedLocalSocket; /// pointer to a local socket that relates to assignment, depends on direction timeval _time; /// time the assignment was created (set in constructor) int _numberOfInstances; /// the number of instances of this assignment + uchar *_payload; /// an optional payload attached to this assignment, a maximum for 1024 bytes will be packed + int _numPayloadBytes; /// number of bytes in the payload, up to a maximum of 1024 }; QDebug operator<<(QDebug debug, const Assignment &assignment); From 3f2dc7a28de07f3c67033d262ae4c02696bdd55b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 17 Sep 2013 13:27:17 -0700 Subject: [PATCH 2/3] add a getter for the number of bytes in the payload --- libraries/shared/src/Assignment.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/shared/src/Assignment.h b/libraries/shared/src/Assignment.h index 4f46ea9e7e..325cca1c8e 100644 --- a/libraries/shared/src/Assignment.h +++ b/libraries/shared/src/Assignment.h @@ -57,6 +57,7 @@ public: const timeval& getTime() const { return _time; } uchar* getPayload() { return _payload; } + int getNumPayloadBytes() const { return _numPayloadBytes; } void setPayload(uchar *payload, int numBytes); int getNumberOfInstances() const { return _numberOfInstances; } From fb7927d32677506c70977f10a885a02b6b7c1506 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 17 Sep 2013 13:28:19 -0700 Subject: [PATCH 3/3] cleanup check for attached socket --- libraries/shared/src/Assignment.cpp | 40 +++++++++++++---------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/libraries/shared/src/Assignment.cpp b/libraries/shared/src/Assignment.cpp index 55837e4107..3a02408a7b 100644 --- a/libraries/shared/src/Assignment.cpp +++ b/libraries/shared/src/Assignment.cpp @@ -67,34 +67,30 @@ Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) : memcpy(&_type, dataBuffer + numBytesRead, sizeof(Assignment::Type)); numBytesRead += sizeof(Assignment::Type); - if (numBytes > numBytesRead) { + if (_command != Assignment::RequestCommand) { + sockaddr* newSocket = NULL; - if (_command != Assignment::RequestCommand) { - sockaddr* newSocket = NULL; + if (dataBuffer[numBytesRead++] == IPv4_ADDRESS_DESIGNATOR) { + // IPv4 address + newSocket = (sockaddr*) new sockaddr_in; + numBytesRead += unpackSocket(dataBuffer + numBytesRead, newSocket); - if (dataBuffer[numBytesRead++] == IPv4_ADDRESS_DESIGNATOR) { - // IPv4 address - newSocket = (sockaddr*) new sockaddr_in; - numBytesRead += unpackSocket(dataBuffer + numBytesRead, newSocket); - - if (_command == Assignment::CreateCommand) { - delete _attachedLocalSocket; - _attachedLocalSocket = newSocket; - } else { - delete _attachedPublicSocket; - _attachedPublicSocket = newSocket; - } + if (_command == Assignment::CreateCommand) { + delete _attachedLocalSocket; + _attachedLocalSocket = newSocket; } else { - // IPv6 address, or bad designator - qDebug("Received a socket that cannot be unpacked!\n"); + delete _attachedPublicSocket; + _attachedPublicSocket = newSocket; } + } else { + // IPv6 address, or bad designator + qDebug("Received a socket that cannot be unpacked!\n"); } - + } + + if (numBytes > numBytesRead) { _numPayloadBytes = numBytes - numBytesRead; - - if (_numPayloadBytes > 0) { - memcpy(_payload, dataBuffer + numBytesRead, numBytes - numBytesRead); - } + memcpy(_payload, dataBuffer + numBytesRead, numBytes - numBytesRead); } }