diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 216d249858..86bc557a74 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -603,6 +603,11 @@ void DomainServer::readAvailableDatagrams() { if (noisyMessage) { lastNoisyMessage = timeNow; } + } else if (requestType == PacketTypeNodeJsonStats) { + SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); + if (matchingNode) { + reinterpret_cast(matchingNode->getLinkedData())->parseJSONStatsPacket(receivedPacket); + } } } } diff --git a/domain-server/src/DomainServerNodeData.cpp b/domain-server/src/DomainServerNodeData.cpp index 2e32903712..4f943c85db 100644 --- a/domain-server/src/DomainServerNodeData.cpp +++ b/domain-server/src/DomainServerNodeData.cpp @@ -6,11 +6,44 @@ // Copyright (c) 2014 HighFidelity, Inc. All rights reserved. // +#include +#include +#include + +#include + #include "DomainServerNodeData.h" DomainServerNodeData::DomainServerNodeData() : _sessionSecretHash(), - _staticAssignmentUUID() + _staticAssignmentUUID(), + _statsJSONObject() { +} + +void DomainServerNodeData::parseJSONStatsPacket(const QByteArray& statsPacket) { + // push past the packet header + QDataStream packetStream(statsPacket); + packetStream.skipRawData(numBytesForPacketHeader(statsPacket)); + + QVariantMap unpackedVariantMap; + + packetStream >> unpackedVariantMap; + + QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(unpackedVariantMap); + _statsJSONObject = mergeJSONStatsFromNewObject(unpackedStatsJSON, _statsJSONObject); +} + + +QJsonObject DomainServerNodeData::mergeJSONStatsFromNewObject(const QJsonObject& newObject, QJsonObject destinationObject) { + foreach(const QString& key, newObject.keys()) { + if (newObject[key].isObject() && destinationObject.contains(key)) { + destinationObject[key] = mergeJSONStatsFromNewObject(newObject[key].toObject(), destinationObject[key].toObject()); + } else { + destinationObject[key] = newObject[key]; + } + } + + return destinationObject; } \ No newline at end of file diff --git a/domain-server/src/DomainServerNodeData.h b/domain-server/src/DomainServerNodeData.h index 6686b9120f..8035147bef 100644 --- a/domain-server/src/DomainServerNodeData.h +++ b/domain-server/src/DomainServerNodeData.h @@ -19,13 +19,18 @@ public: DomainServerNodeData(); int parseData(const QByteArray& packet) { return 0; } + void parseJSONStatsPacket(const QByteArray& statsPacket); + void setStaticAssignmentUUID(const QUuid& staticAssignmentUUID) { _staticAssignmentUUID = staticAssignmentUUID; } const QUuid& getStaticAssignmentUUID() const { return _staticAssignmentUUID; } QHash& getSessionSecretHash() { return _sessionSecretHash; } private: + QJsonObject mergeJSONStatsFromNewObject(const QJsonObject& newObject, QJsonObject destinationObject); + QHash _sessionSecretHash; QUuid _staticAssignmentUUID; + QJsonObject _statsJSONObject; }; #endif /* defined(__hifi__DomainServerNodeData__) */