diff --git a/domain-server/src/DomainServerNodeData.cpp b/domain-server/src/DomainServerNodeData.cpp index fd95ea9a67..43bf36014a 100644 --- a/domain-server/src/DomainServerNodeData.cpp +++ b/domain-server/src/DomainServerNodeData.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include "DomainServerNodeData.h" @@ -31,16 +32,9 @@ DomainServerNodeData::DomainServerNodeData() : } void DomainServerNodeData::parseJSONStatsPacket(const QByteArray& statsPacket) { - // push past the packet header - QDataStream packetStream(statsPacket); - packetStream.skipRawData(numBytesForPacketHeader(statsPacket)); + QJsonObject packetJson = JSONBreakableMarshal::fromStringBuffer(statsPacket.mid(numBytesForPacketHeader(statsPacket))); - QVariantMap unpackedVariantMap; - - packetStream >> unpackedVariantMap; - - QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(unpackedVariantMap); - _statsJSONObject = mergeJSONStatsFromNewObject(unpackedStatsJSON, _statsJSONObject); + // _statsJSONObject = mergeJSONStatsFromNewObject(unpackedStatsJSON, _statsJSONObject); } QJsonObject DomainServerNodeData::mergeJSONStatsFromNewObject(const QJsonObject& newObject, QJsonObject destinationObject) { diff --git a/libraries/networking/src/JSONBreakableMarshal.cpp b/libraries/networking/src/JSONBreakableMarshal.cpp index f620d53be3..67125606ed 100644 --- a/libraries/networking/src/JSONBreakableMarshal.cpp +++ b/libraries/networking/src/JSONBreakableMarshal.cpp @@ -96,3 +96,33 @@ QString JSONBreakableMarshal::toString(const QJsonValue& jsonValue, const QStrin return QString("%1=%2").arg(keypath, valueAsString); } + +QJsonObject JSONBreakableMarshal::fromStringBuffer(const QByteArray& buffer) { + QJsonObject result; + + // this is a packet of strings sep by null terminators - pull out each string and create a stringlist + QStringList packetList; + int currentIndex = 0; + int currentSeparator = buffer.indexOf('\0'); + + while (currentIndex < buffer.size() - 1) { + packetList << QString::fromUtf8(buffer.mid(currentIndex, currentSeparator)); + + if (currentSeparator == -1) { + // no more separators to be found, break out of here so we're not looping for nothing + break; + } + + // bump the currentIndex up to the last found separator + currentIndex = currentSeparator + 1; + + // find the index of the next separator, assuming this one wasn't the last one in the packet + if (currentSeparator < buffer.size() - 1) { + currentSeparator = buffer.indexOf('\0', currentIndex); + } + } + + + + return result; +} diff --git a/libraries/networking/src/JSONBreakableMarshal.h b/libraries/networking/src/JSONBreakableMarshal.h index 11d2072ee2..28e305902a 100644 --- a/libraries/networking/src/JSONBreakableMarshal.h +++ b/libraries/networking/src/JSONBreakableMarshal.h @@ -22,6 +22,7 @@ class JSONBreakableMarshal { public: static QStringList toStringList(const QJsonValue& jsonValue, const QString& keypath); static QString toString(const QJsonValue& jsonValue, const QString& keyPath); + static QJsonObject fromStringBuffer(const QByteArray& buffer); }; #endif // hifi_JSONBreakableMarshal_h diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index d6fe311c59..04ae1b0b2b 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -78,7 +78,8 @@ qint64 NodeList::sendStats(const QJsonObject& statsObject, const HifiSockAddr& d // enumerate the resulting strings - pack them and send off packets once we hit MTU size foreach(const QString& statsItem, statsStringList) { - QByteArray utf8String = statsItem.toUtf8(); + QByteArray utf8String = statsItem.toUtf8(); + utf8String.append('\0'); if (numBytesWritten + utf8String.size() > MAX_PACKET_SIZE) { // send off the current packet since the next string will make us too big