diff --git a/assignment-client/src/main.cpp b/assignment-client/src/main.cpp index 81bfc3d1ed..31c989e92c 100644 --- a/assignment-client/src/main.cpp +++ b/assignment-client/src/main.cpp @@ -61,7 +61,9 @@ int main(int argc, char* const argv[]) { qDebug() << "Received an assignment - " << assignmentType << "\n"; - AudioMixer::run(); + // pull the creator sockaddr_in from the assignment and change our domain IP to that + +// AudioMixer::run(); // reset our NodeList by switching back to unassigned and clearing the list nodeList->setOwnerType(NODE_TYPE_UNASSIGNED); diff --git a/assignment-server/src/main.cpp b/assignment-server/src/main.cpp index 5d074e1d18..fcc312e649 100644 --- a/assignment-server/src/main.cpp +++ b/assignment-server/src/main.cpp @@ -30,7 +30,7 @@ int main(int argc, const char* argv[]) { UDPSocket serverSocket(ASSIGNMENT_SERVER_PORT); unsigned char assignmentPacket[MAX_PACKET_SIZE_BYTES]; - int numSendHeaderBytes = populateTypeAndVersion(assignmentPacket, PACKET_TYPE_CREATE_ASSIGNMENT); + int numSendHeaderBytes = populateTypeAndVersion(assignmentPacket, PACKET_TYPE_DEPLOY_ASSIGNMENT); while (true) { if (serverSocket.receive((sockaddr*) &senderSocket, &senderData, &receivedBytes)) { @@ -42,26 +42,30 @@ int main(int argc, const char* argv[]) { Assignment firstAssignment = assignmentQueue.front(); assignmentQueue.pop(); - *(assignmentPacket + numSendHeaderBytes) = firstAssignment.getType(); - + int numAssignmentBytes = firstAssignment.packToBuffer(assignmentPacket + numSendHeaderBytes); // send the assignment - serverSocket.send((sockaddr*) &senderSocket, assignmentPacket, numSendHeaderBytes + sizeof(unsigned char)); + serverSocket.send((sockaddr*) &senderSocket, assignmentPacket, numSendHeaderBytes + numAssignmentBytes); } } else if (senderData[0] == PACKET_TYPE_CREATE_ASSIGNMENT && packetVersionMatch(senderData)) { // memcpy the sent assignment - Assignment createdAssignment(senderData + numBytesForPacketHeader(senderData)); + int numHeaderBytes = numBytesForPacketHeader(senderData); + Assignment createdAssignment(senderData + numHeaderBytes, receivedBytes - numHeaderBytes); qDebug() << "Received an assignment:" << createdAssignment; // assignment server is on a public server // assume that the address we now have for the sender is the public address/port // and store that with the assignment so it can be given to the requestor later + createdAssignment.setDomainSocket((sockaddr*) &senderSocket); - + // until we have a GUID setup just keep the latest assignment + if (assignmentQueue.size() > 0) { + assignmentQueue.pop(); + } // add this assignment to the queue -// assignmentQueue.push(newAssignment); + assignmentQueue.push(createdAssignment); } } } diff --git a/libraries/shared/src/Assignment.cpp b/libraries/shared/src/Assignment.cpp index 112d19b9fe..8385fced63 100644 --- a/libraries/shared/src/Assignment.cpp +++ b/libraries/shared/src/Assignment.cpp @@ -10,7 +10,8 @@ Assignment::Assignment(Assignment::Direction direction, Assignment::Type type, const char* pool) : _direction(direction), - _type(type) + _type(type), + _domainSocket(NULL) { // copy the pool, if we got one if (pool) { @@ -22,7 +23,9 @@ Assignment::Assignment(Assignment::Direction direction, Assignment::Type type, c } } -Assignment::Assignment(const unsigned char* dataBuffer) { +Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) : + _domainSocket(NULL) +{ int numBytesRead = 0; memcpy(&_direction, dataBuffer, sizeof(Assignment::Direction)); @@ -34,6 +37,11 @@ Assignment::Assignment(const unsigned char* dataBuffer) { int poolLength = strlen((const char*) dataBuffer + numBytesRead); _pool = new char[poolLength + sizeof(char)]; strcpy(_pool, (char*) dataBuffer + numBytesRead); + numBytesRead += poolLength + sizeof(char); + + if (numBytes > numBytesRead) { + memcpy(_domainSocket, dataBuffer + numBytesRead, sizeof(sockaddr)); + } } int Assignment::packToBuffer(unsigned char* buffer) { @@ -48,9 +56,36 @@ int Assignment::packToBuffer(unsigned char* buffer) { strcpy((char*) buffer + numPackedBytes, _pool); numPackedBytes += strlen(_pool) + sizeof(char); + if (_domainSocket) { + memcpy(buffer + numPackedBytes, _domainSocket, sizeof(sockaddr)); + numPackedBytes += sizeof(sockaddr); + } + return numPackedBytes; } +void Assignment::setDomainSocket(const sockaddr* domainSocket) { + + if (_domainSocket) { + // delete the old _domainSocket if it exists + delete _domainSocket; + _domainSocket = NULL; + } + + if (!_domainSocket) { + // create a new sockaddr or sockaddr_in depending on what type of address this is + if (domainSocket->sa_family == AF_INET) { + sockaddr_in* newSocket = new sockaddr_in; + memcpy(newSocket, domainSocket, sizeof(sockaddr_in)); + _domainSocket = (sockaddr*) newSocket; + } else { + sockaddr_in6* newSocket = new sockaddr_in6; + memcpy(newSocket, domainSocket, sizeof(sockaddr_in6)); + _domainSocket = (sockaddr*) newSocket; + } + } +} + QDebug operator<<(QDebug debug, const Assignment &assignment) { debug << "T:" << assignment.getType() << "P:" << assignment.getPool(); return debug.nospace(); diff --git a/libraries/shared/src/Assignment.h b/libraries/shared/src/Assignment.h index 99acd6924d..59c551b86d 100644 --- a/libraries/shared/src/Assignment.h +++ b/libraries/shared/src/Assignment.h @@ -25,18 +25,22 @@ public: }; Assignment(Assignment::Direction direction, Assignment::Type type, const char* pool = NULL); - Assignment(const unsigned char* dataBuffer); + Assignment(const unsigned char* dataBuffer, int numBytes); Assignment::Direction getDirection() const { return _direction; } Assignment::Type getType() const { return _type; } const char* getPool() const { return _pool; } + const sockaddr* getDomainSocket() { return _domainSocket; } + void setDomainSocket(const sockaddr* domainSocket); + int packToBuffer(unsigned char* buffer); private: Assignment::Direction _direction; Assignment::Type _type; char* _pool; + sockaddr* _domainSocket; }; QDebug operator<<(QDebug debug, const Assignment &assignment); diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 745ab450db..5e2d3f48a6 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -31,7 +31,7 @@ const char SOLO_NODE_TYPES[2] = { }; const char DEFAULT_DOMAIN_HOSTNAME[MAX_HOSTNAME_BYTES] = "root.highfidelity.io"; -const char DEFAULT_DOMAIN_IP[INET_ADDRSTRLEN] = "10.0.0.20"; // IP Address will be re-set by lookup on startup +const char DEFAULT_DOMAIN_IP[INET_ADDRSTRLEN] = ""; // IP Address will be re-set by lookup on startup const int DEFAULT_DOMAINSERVER_PORT = 40102; bool silentNodeThreadStopFlag = false; diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index ca3e3d4f7f..7efc639067 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -37,6 +37,7 @@ const PACKET_TYPE PACKET_TYPE_DOMAIN_LIST_REQUEST = 'L'; const PACKET_TYPE PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY = 'C'; const PACKET_TYPE PACKET_TYPE_REQUEST_ASSIGNMENT = 'r'; const PACKET_TYPE PACKET_TYPE_CREATE_ASSIGNMENT = 's'; +const PACKET_TYPE PACKET_TYPE_DEPLOY_ASSIGNMENT = 'd'; const PACKET_TYPE PACKET_TYPE_VOXEL_STATS = '#'; const PACKET_TYPE PACKET_TYPE_VOXEL_JURISDICTION = 'J'; const PACKET_TYPE PACKET_TYPE_VOXEL_JURISDICTION_REQUEST = 'j';