add breaking of marshaled buffer to QStringList

This commit is contained in:
Stephen Birarda 2015-04-29 11:20:07 -07:00
parent 85919972e3
commit 24576574ae
4 changed files with 36 additions and 10 deletions

View file

@ -13,6 +13,7 @@
#include <QtCore/QJsonObject> #include <QtCore/QJsonObject>
#include <QtCore/QVariant> #include <QtCore/QVariant>
#include <JSONBreakableMarshal.h>
#include <PacketHeaders.h> #include <PacketHeaders.h>
#include "DomainServerNodeData.h" #include "DomainServerNodeData.h"
@ -31,16 +32,9 @@ DomainServerNodeData::DomainServerNodeData() :
} }
void DomainServerNodeData::parseJSONStatsPacket(const QByteArray& statsPacket) { void DomainServerNodeData::parseJSONStatsPacket(const QByteArray& statsPacket) {
// push past the packet header QJsonObject packetJson = JSONBreakableMarshal::fromStringBuffer(statsPacket.mid(numBytesForPacketHeader(statsPacket)));
QDataStream packetStream(statsPacket);
packetStream.skipRawData(numBytesForPacketHeader(statsPacket));
QVariantMap unpackedVariantMap; // _statsJSONObject = mergeJSONStatsFromNewObject(unpackedStatsJSON, _statsJSONObject);
packetStream >> unpackedVariantMap;
QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(unpackedVariantMap);
_statsJSONObject = mergeJSONStatsFromNewObject(unpackedStatsJSON, _statsJSONObject);
} }
QJsonObject DomainServerNodeData::mergeJSONStatsFromNewObject(const QJsonObject& newObject, QJsonObject destinationObject) { QJsonObject DomainServerNodeData::mergeJSONStatsFromNewObject(const QJsonObject& newObject, QJsonObject destinationObject) {

View file

@ -96,3 +96,33 @@ QString JSONBreakableMarshal::toString(const QJsonValue& jsonValue, const QStrin
return QString("%1=%2").arg(keypath, valueAsString); 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;
}

View file

@ -22,6 +22,7 @@ class JSONBreakableMarshal {
public: public:
static QStringList toStringList(const QJsonValue& jsonValue, const QString& keypath); static QStringList toStringList(const QJsonValue& jsonValue, const QString& keypath);
static QString toString(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 #endif // hifi_JSONBreakableMarshal_h

View file

@ -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 // enumerate the resulting strings - pack them and send off packets once we hit MTU size
foreach(const QString& statsItem, statsStringList) { foreach(const QString& statsItem, statsStringList) {
QByteArray utf8String = statsItem.toUtf8(); QByteArray utf8String = statsItem.toUtf8();
utf8String.append('\0');
if (numBytesWritten + utf8String.size() > MAX_PACKET_SIZE) { if (numBytesWritten + utf8String.size() > MAX_PACKET_SIZE) {
// send off the current packet since the next string will make us too big // send off the current packet since the next string will make us too big