From 84ef757af43ed022919b4fc37437b4aa43e63783 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 30 Jan 2014 09:45:09 -0800 Subject: [PATCH 1/4] fix avatar count, HandData crash (closes #1754) --- interface/src/Application.cpp | 3 ++- interface/src/avatar/AvatarManager.cpp | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2efcd5b121..b30fc37591 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3225,7 +3225,8 @@ void Application::displayStats() { glPointSize(1.0f); - int totalAvatars = _avatarManager.size(); + // we need to take one avatar out so we don't include ourselves + int totalAvatars = _avatarManager.size() - 1; int totalServers = NodeList::getInstance()->size(); if (mirrorEnabled) { diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 06b550b9d6..57f187603b 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -234,7 +234,11 @@ void AvatarManager::processAvatarMixerDatagram(const QByteArray& datagram, const // copy the rest of the packet to the avatarData holder so we can read the next Avatar from there dummyAvatarByteArray.resize(numDummyByteArrayHeaderBytes); - dummyAvatarByteArray += datagram.mid(bytesRead); + + // make this Avatar's UUID the UUID in the packet and tack the remaining data onto the end + dummyAvatarByteArray.replace(numDummyByteArrayHeaderBytes - NUM_BYTES_RFC4122_UUID, + NUM_BYTES_RFC4122_UUID + datagram.size() - bytesRead, + datagram.mid(bytesRead)); // have the matching (or new) avatar parse the data from the packet bytesRead += matchingAvatar->parseData(dummyAvatarByteArray); From 49d04ce14e02bf1030e8836e1d83b9e88ae90407 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 30 Jan 2014 10:42:29 -0800 Subject: [PATCH 2/4] data-server repairs for get responses --- data-server/src/DataServer.cpp | 36 ++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/data-server/src/DataServer.cpp b/data-server/src/DataServer.cpp index 91d2b7f496..98b3f9c298 100644 --- a/data-server/src/DataServer.cpp +++ b/data-server/src/DataServer.cpp @@ -133,17 +133,26 @@ void DataServer::readPendingDatagrams() { // setup a send packet with the returned data // leverage the packetData sent by overwriting and appending QByteArray sendPacket = byteArrayWithPopluatedHeader(PacketTypeDataServerSend, _uuid); - sendPacket.append(sequenceNumber); + QDataStream sendPacketStream(&sendPacket, QIODevice::Append); - if (!receivedPacket.mid(numReceivedHeaderBytes + sizeof(sequenceNumber)).startsWith("uuid")) { + sendPacketStream << sequenceNumber; + + // pull the key list that specifies the data the user is putting/getting + QString keyListString; + packetStream >> keyListString; + + if (keyListString != "uuid") { + + // copy the parsed UUID + sendPacketStream << uuidStringWithoutCurlyBraces(parsedUUID); const char MULTI_KEY_VALUE_SEPARATOR = '|'; - // pull the key that specifies the data the user is putting/getting, null terminate it - QString keyListString; - packetStream >> keyListString; + // append the keyListString back to the sendPacket + sendPacketStream << keyListString; QStringList keyList = keyListString.split(MULTI_KEY_VALUE_SEPARATOR); + QString valueList; foreach (const QString& dataKey, keyList) { qDebug("Sending command to redis: GET uuid:%s:%s", @@ -155,25 +164,26 @@ void DataServer::readPendingDatagrams() { if (reply->len) { // copy the value that redis returned - sendPacket.append(reply->str, reply->len); - + valueList.append(reply->str); } else { // didn't find a value - insert a space - sendPacket.append(' '); + valueList.append(' '); } // add the multi-value separator - sendPacket.append(MULTI_KEY_VALUE_SEPARATOR); + valueList.append(MULTI_KEY_VALUE_SEPARATOR); freeReplyObject(reply); } // null terminate the packet we're sending back (erases the trailing separator) - sendPacket[sendPacket.size() - 1] = '\0'; + valueList[valueList.size() - 1] = '\0'; + sendPacketStream << valueList; } else { - // user is asking for a UUID matching username, copy the UUID we found - sendPacket.append(uuidStringWithoutCurlyBraces(parsedUUID)); - sendPacket.append('\0'); + // user was asking for their UUID + sendPacketStream << userString; + sendPacketStream << QString("uuid"); + sendPacketStream << uuidStringWithoutCurlyBraces(parsedUUID); } // reply back with the send packet From 2294b3a2cd398ce8795be0f020818abde4ae4c39 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 30 Jan 2014 12:14:28 -0800 Subject: [PATCH 3/4] use a proper string list in DataServer for values --- data-server/src/DataServer.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/data-server/src/DataServer.cpp b/data-server/src/DataServer.cpp index 98b3f9c298..48462040d5 100644 --- a/data-server/src/DataServer.cpp +++ b/data-server/src/DataServer.cpp @@ -152,7 +152,7 @@ void DataServer::readPendingDatagrams() { sendPacketStream << keyListString; QStringList keyList = keyListString.split(MULTI_KEY_VALUE_SEPARATOR); - QString valueList; + QStringList valueList; foreach (const QString& dataKey, keyList) { qDebug("Sending command to redis: GET uuid:%s:%s", @@ -164,21 +164,17 @@ void DataServer::readPendingDatagrams() { if (reply->len) { // copy the value that redis returned - valueList.append(reply->str); + valueList << reply->str; } else { // didn't find a value - insert a space - valueList.append(' '); + valueList << QChar(' '); } - // add the multi-value separator - valueList.append(MULTI_KEY_VALUE_SEPARATOR); - freeReplyObject(reply); } - // null terminate the packet we're sending back (erases the trailing separator) - valueList[valueList.size() - 1] = '\0'; - sendPacketStream << valueList; + // append the value QStringList using the right separator + sendPacketStream << valueList.join(MULTI_KEY_VALUE_SEPARATOR); } else { // user was asking for their UUID sendPacketStream << userString; From ac780df8a63be17a705bb88f85a83fa6ff0bce92 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 30 Jan 2014 12:44:43 -0800 Subject: [PATCH 4/4] fix appending of QString value to valueList --- data-server/src/DataServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data-server/src/DataServer.cpp b/data-server/src/DataServer.cpp index 48462040d5..43fc52fb06 100644 --- a/data-server/src/DataServer.cpp +++ b/data-server/src/DataServer.cpp @@ -164,7 +164,7 @@ void DataServer::readPendingDatagrams() { if (reply->len) { // copy the value that redis returned - valueList << reply->str; + valueList << QString(reply->str); } else { // didn't find a value - insert a space valueList << QChar(' ');