diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 0576a0d4f0..0037f989ef 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -48,75 +48,53 @@ Agent::Agent(const QByteArray& packet) : DependencyManager::set(); DependencyManager::set(); - auto& packetReceiver = DependencyManager::get()->getPackingReceiver(); + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerPacketListener(PacketType::MixedAudio, this, "handleAudioPacket"); packetReceiver.registerPacketListener(PacketType::SilentAudioFrame, this, "handleAudioPacket"); + packetReceiver.registerPacketListener(PacketType::OctreeStats, this, "handleOctreePacket"); + packetReceiver.registerPacketListener(PacketType::EntityData, this, "handleOctreePacket"); + packetReceiver.registerPacketListener(PacketType::EntityErase, this, "handleOctreePacket"); + packetReceiver.registerPacketListener(PacketType::Jurisdiction, this, "handleJurisdictionPacket"); } -void Agent::readPendingDatagrams() { - QByteArray receivedPacket; - HifiSockAddr senderSockAddr; - auto nodeList = DependencyManager::get(); +void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + QByteArray mutablePacket = QByteArray(packet->getData(), packet->getSizeWithHeader()); + int messageLength = mutablePacket.size(); - while (readAvailableDatagram(receivedPacket, senderSockAddr)) { - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - PacketType::Value datagramPacketType = packetTypeForPacket(receivedPacket); + auto packetType = packet->getType(); - if (datagramPacketType == PacketType::Jurisdiction) { - int headerBytes = numBytesForPacketHeader(receivedPacket); + if (packetType == PacketType::OctreeStats) { - SharedNodePointer matchedNode = nodeList->sendingNodeForPacket(receivedPacket); - - if (matchedNode) { - // PacketType_JURISDICTION, first byte is the node type... - switch (receivedPacket[headerBytes]) { - case NodeType::EntityServer: - DependencyManager::get()->getJurisdictionListener()-> - queueReceivedPacket(matchedNode, receivedPacket); - break; - } - } - - } else if (datagramPacketType == PacketType::OctreeStats - || datagramPacketType == PacketType::EntityData - || datagramPacketType == PacketType::EntityErase - ) { - // Make sure our Node and NodeList knows we've heard from this node. - SharedNodePointer sourceNode = nodeList->sendingNodeForPacket(receivedPacket); - sourceNode->setLastHeardMicrostamp(usecTimestampNow()); - - QByteArray mutablePacket = receivedPacket; - int messageLength = mutablePacket.size(); - - if (datagramPacketType == PacketType::OctreeStats) { - - int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(mutablePacket, sourceNode); - if (messageLength > statsMessageLength) { - mutablePacket = mutablePacket.mid(statsMessageLength); - - // TODO: this needs to be fixed, the goal is to test the packet version for the piggyback, but - // this is testing the version and hash of the original packet - // need to use numBytesArithmeticCodingFromBuffer()... - if (!DependencyManager::get()->packetVersionAndHashMatch(receivedPacket)) { - return; // bail since piggyback data doesn't match our versioning - } - } else { - return; // bail since no piggyback data - } - - datagramPacketType = packetTypeForPacket(mutablePacket); - } // fall through to piggyback message - - if (datagramPacketType == PacketType::EntityData || datagramPacketType == PacketType::EntityErase) { - _entityViewer.processDatagram(mutablePacket, sourceNode); - } - } + int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(packet, senderNode); + if (messageLength > statsMessageLength) { + mutablePacket = mutablePacket.mid(statsMessageLength); + } else { + return; // bail since no piggyback data } + + packetType = packetTypeForPacket(mutablePacket); + } // fall through to piggyback message + + if (packetType == PacketType::EntityData || packetType == PacketType::EntityErase) { + _entityViewer.processDatagram(mutablePacket, senderNode); + } +} + +void Agent::handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + QByteArray receivedPacket = QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader()); + int headerBytes = numBytesForPacketHeader(receivedPacket); + + // PacketType_JURISDICTION, first byte is the node type... + switch (receivedPacket[headerBytes]) { + case NodeType::EntityServer: + DependencyManager::get()->getJurisdictionListener()-> + queueReceivedPacket(packet, senderNode); + break; } } void Agent::handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - _receivedAudioStream.parseData(receivedPacket); + _receivedAudioStream.parseData(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); _lastReceivedAudioLoudness = _receivedAudioStream.getNextOutputFrameLoudness(); diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index bee043f6f4..3e202f2d0d 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -52,11 +52,12 @@ public: public slots: void run(); - void readPendingDatagrams(); void playAvatarSound(Sound* avatarSound) { _scriptEngine.setAvatarSound(avatarSound); } private slots: void handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); private: ScriptEngine _scriptEngine; diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index dda505429d..499ed93c89 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -122,7 +122,7 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri } auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerPacketListener(PacketType::CreateAssignment, this, "handleCreateAssignmentPacket"); - packetReceiver.registerPacketListener(PacketType::CreateAssignment, this, "handleStopNodePacket"); + packetReceiver.registerPacketListener(PacketType::StopNode, this, "handleStopNodePacket"); } diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 6796c122dc..5498322f58 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -53,7 +53,9 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen auto addressManager = DependencyManager::set(); auto nodeList = DependencyManager::set(); - connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, this, &AssignmentClientMonitor::readPendingDatagrams); + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsPacket"); + packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsUnknownNodePacket"); // use QProcess to fork off a process for each of the child assignment clients for (unsigned int i = 0; i < _numAssignmentClientForks; i++) { @@ -201,63 +203,43 @@ void AssignmentClientMonitor::checkSpares() { } } +void AssignmentClientMonitor::handleNodeJsonStatsPacket(QSharedPointer packet, SharedNodePointer senderNode) { + auto senderSockAddr = packet->getSenderSockAddr(); -void AssignmentClientMonitor::readPendingDatagrams() { - auto nodeList = DependencyManager::get(); + // update our records about how to reach this child + senderNode->setLocalSocket(senderSockAddr); - QByteArray receivedPacket; - HifiSockAddr senderSockAddr; + QVariantMap packetVariantMap = JSONBreakableMarshal::fromStringBuffer(packet->getPayload()); + QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap); - while (nodeList->getNodeSocket().hasPendingDatagrams()) { - receivedPacket.resize(nodeList->getNodeSocket().pendingDatagramSize()); - nodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(), - senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); + // get child's assignment type out of the decoded json + QString childType = unpackedStatsJSON["assignment_type"].toString(); + AssignmentClientChildData *childData = + static_cast(senderNode->getLinkedData()); + childData->setChildType(childType); + // note when this child talked + senderNode->setLastHeardMicrostamp(usecTimestampNow()); +} - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - if (packetTypeForPacket(receivedPacket) == PacketType::NodeJsonStats) { - QUuid packetUUID = uuidFromPacketHeader(receivedPacket); - SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); - if (!matchingNode) { - // The parent only expects to be talking with prorams running on this same machine. - if (senderSockAddr.getAddress() == QHostAddress::LocalHost || - senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { - if (!packetUUID.isNull()) { - matchingNode = DependencyManager::get()->addOrUpdateNode - (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); - AssignmentClientChildData *childData = new AssignmentClientChildData("unknown"); - matchingNode->setLinkedData(childData); - } else { - // tell unknown assignment-client child to exit. - qDebug() << "asking unknown child to exit."; +void AssignmentClientMonitor::handleNodeJsonStatsUnknownNodePacket(QSharedPointer packet, SharedNodePointer senderNode) { + auto senderSockAddr = packet->getSenderSockAddr(); - auto diePacket = NLPacket::create(PacketType::StopNode, 0); - nodeList->sendPacket(std::move(diePacket), senderSockAddr); - } - } - } + // The parent only expects to be talking with prorams running on this same machine. + if (senderSockAddr.getAddress() == QHostAddress::LocalHost || + senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { + QUuid packetUUID = uuidFromPacketHeader(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); + if (!packetUUID.isNull()) { + senderNode = DependencyManager::get()->addOrUpdateNode + (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); + AssignmentClientChildData *childData = new AssignmentClientChildData("unknown"); + senderNode->setLinkedData(childData); + } else { + // tell unknown assignment-client child to exit. + qDebug() << "asking unknown child to exit."; - if (matchingNode) { - // update our records about how to reach this child - matchingNode->setLocalSocket(senderSockAddr); - - QVariantMap packetVariantMap = - JSONBreakableMarshal::fromStringBuffer(receivedPacket.mid(numBytesForPacketHeader(receivedPacket))); - QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap); - - // get child's assignment type out of the decoded json - QString childType = unpackedStatsJSON["assignment_type"].toString(); - AssignmentClientChildData *childData = - static_cast(matchingNode->getLinkedData()); - childData->setChildType(childType); - // note when this child talked - matchingNode->setLastHeardMicrostamp(usecTimestampNow()); - } - } else { - // have the NodeList attempt to handle it - nodeList->processNodeData(senderSockAddr, receivedPacket); - } + auto diePacket = NLPacket::create(PacketType::StopNode, 0); + auto nodeList = DependencyManager::get(); + nodeList->sendPacket(std::move(diePacket), senderSockAddr); } } } - - diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index f05ed3e661..0c2b958f5c 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -35,9 +35,10 @@ public: void stopChildProcesses(); private slots: - void readPendingDatagrams(); void checkSpares(); void childProcessFinished(); + void handleNodeJsonStatsPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleNodeJsonStatsUnknownNodePacket(QSharedPointer packet, SharedNodePointer senderNode); public slots: void aboutToQuit(); diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index ec9998c881..018f946771 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -543,44 +543,43 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { } } -void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) { - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - nodeList->processNodeData(senderSockAddr, receivedPacket); - } -} - void AudioMixer::handleMicrophoneAudioNoEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); + auto nodeList = DependencyManager::get(); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); } void AudioMixer::handleMicrophoneAudioWithEchoPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); + auto nodeList = DependencyManager::get(); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); } void AudioMixer::handleInjectAudioPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); + auto nodeList = DependencyManager::get(); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); } void AudioMixer::handleSilentAudioFramePacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); + auto nodeList = DependencyManager::get(); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); } void AudioMixer::handleAudioStreamStatsPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - nodeList->findNodeAndUpdateWithDataFromPacket(packet->getData()); + auto nodeList = DependencyManager::get(); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); } void AudioMixer::handleMuteEnvironmentPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { auto nodeList = DependencyManager::get(); SharedNodePointer sendingNode = nodeList->nodeWithUUID(packet->getSourceID()); if (sendingNode->getCanAdjustLocks()) { - auto packet = NLPacket::create(PacketType::MuteEnvironment); + auto newPacket = NLPacket::create(PacketType::MuteEnvironment); // Copy payload - packet->write(receivedPacket.mid(numBytesForPacketHeader(receivedPacket))); + newPacket->write(newPacket->getPayload()); nodeList->eachNode([&](const SharedNodePointer& node){ if (node->getType() == NodeType::Agent && node->getActiveSocket() && node->getLinkedData() && node != sendingNode) { - nodeList->sendPacket(std::move(packet), node); + nodeList->sendPacket(std::move(newPacket), node); } }); } @@ -680,28 +679,6 @@ void AudioMixer::run() { _datagramProcessingThread = new QThread(this); _datagramProcessingThread->setObjectName("Datagram Processor Thread"); - // create an AudioMixerDatagramProcessor and move it to that thread - AudioMixerDatagramProcessor* datagramProcessor = new AudioMixerDatagramProcessor(nodeList->getNodeSocket(), thread()); - datagramProcessor->moveToThread(_datagramProcessingThread); - - // remove the NodeList as the parent of the node socket - nodeList->getNodeSocket().setParent(NULL); - nodeList->getNodeSocket().moveToThread(_datagramProcessingThread); - - // let the datagram processor handle readyRead from node socket - connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, - datagramProcessor, &AudioMixerDatagramProcessor::readPendingDatagrams); - - // connect to the datagram processing thread signal that tells us we have to handle a packet - connect(datagramProcessor, &AudioMixerDatagramProcessor::packetRequiresProcessing, this, &AudioMixer::readPendingDatagram); - - // delete the datagram processor and the associated thread when the QThread quits - connect(_datagramProcessingThread, &QThread::finished, datagramProcessor, &QObject::deleteLater); - connect(datagramProcessor, &QObject::destroyed, _datagramProcessingThread, &QThread::deleteLater); - - // start the datagram processing thread - _datagramProcessingThread->start(); - nodeList->addNodeTypeToInterestSet(NodeType::Agent); nodeList->linkedDataCreateCallback = [](Node* node) { diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index c88c5a6242..50ec3c6d18 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -35,8 +35,6 @@ public slots: /// threaded run of assignment void run(); - void readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); - void sendStatsPacket(); static const InboundAudioStream::Settings& getStreamSettings() { return _streamSettings; } diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 0d4e5b5934..3559793ff5 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -46,6 +46,12 @@ AvatarMixer::AvatarMixer(const QByteArray& packet) : { // make sure we hear about node kills so we can tell the other nodes connect(DependencyManager::get().data(), &NodeList::nodeKilled, this, &AvatarMixer::nodeKilled); + + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(PacketType::AvatarData, this, "handleAvatarDataPacket"); + packetReceiver.registerPacketListener(PacketType::AvatarIdentity, this, "handleAvatarIdentityPacket"); + packetReceiver.registerPacketListener(PacketType::AvatarBillboard, this, "handleAvatarBillboardPacket"); + packetReceiver.registerPacketListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); } AvatarMixer::~AvatarMixer() { @@ -394,65 +400,43 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { } } -void AvatarMixer::readPendingDatagrams() { - QByteArray receivedPacket; - HifiSockAddr senderSockAddr; - +void AvatarMixer::handleAvatarDataPacket(QSharedPointer packet, SharedNodePointer senderNode) { auto nodeList = DependencyManager::get(); + nodeList->findNodeAndUpdateWithDataFromPacket(packet); +} - while (readAvailableDatagram(receivedPacket, senderSockAddr)) { - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - switch (packetTypeForPacket(receivedPacket)) { - case PacketType::AvatarData: { - nodeList->findNodeAndUpdateWithDataFromPacket(receivedPacket); - break; - } - case PacketType::AvatarIdentity: { - // check if we have a matching node in our list - SharedNodePointer avatarNode = nodeList->sendingNodeForPacket(receivedPacket); +void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer packet, SharedNodePointer senderNode) { + if (senderNode->getLinkedData()) { + AvatarMixerClientData* nodeData = reinterpret_cast(senderNode->getLinkedData()); + AvatarData& avatar = nodeData->getAvatar(); - if (avatarNode && avatarNode->getLinkedData()) { - AvatarMixerClientData* nodeData = reinterpret_cast(avatarNode->getLinkedData()); - AvatarData& avatar = nodeData->getAvatar(); - - // parse the identity packet and update the change timestamp if appropriate - if (avatar.hasIdentityChangedAfterParsing(receivedPacket)) { - QMutexLocker nodeDataLocker(&nodeData->getMutex()); - nodeData->setIdentityChangeTimestamp(QDateTime::currentMSecsSinceEpoch()); - } - } - break; - } - case PacketType::AvatarBillboard: { - // check if we have a matching node in our list - SharedNodePointer avatarNode = nodeList->sendingNodeForPacket(receivedPacket); - - if (avatarNode && avatarNode->getLinkedData()) { - AvatarMixerClientData* nodeData = static_cast(avatarNode->getLinkedData()); - AvatarData& avatar = nodeData->getAvatar(); - - // parse the billboard packet and update the change timestamp if appropriate - if (avatar.hasBillboardChangedAfterParsing(receivedPacket)) { - QMutexLocker nodeDataLocker(&nodeData->getMutex()); - nodeData->setBillboardChangeTimestamp(QDateTime::currentMSecsSinceEpoch()); - } - - } - break; - } - case PacketType::KillAvatar: { - nodeList->processKillNode(receivedPacket); - break; - } - default: - // hand this off to the NodeList - nodeList->processNodeData(senderSockAddr, receivedPacket); - break; - } + // parse the identity packet and update the change timestamp if appropriate + if (avatar.hasIdentityChangedAfterParsing(*packet)) { + QMutexLocker nodeDataLocker(&nodeData->getMutex()); + nodeData->setIdentityChangeTimestamp(QDateTime::currentMSecsSinceEpoch()); } } } +void AvatarMixer::handleAvatarBillboardPacket(QSharedPointer packet, SharedNodePointer senderNode) { + if (senderNode->getLinkedData()) { + AvatarMixerClientData* nodeData = static_cast(senderNode->getLinkedData()); + AvatarData& avatar = nodeData->getAvatar(); + + // parse the billboard packet and update the change timestamp if appropriate + if (avatar.hasBillboardChangedAfterParsing(*packet)) { + QMutexLocker nodeDataLocker(&nodeData->getMutex()); + nodeData->setBillboardChangeTimestamp(QDateTime::currentMSecsSinceEpoch()); + } + + } +} + +void AvatarMixer::handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer senderNode) { + auto nodeList = DependencyManager::get(); + nodeList->processKillNode(*packet); +} + void AvatarMixer::sendStatsPacket() { QJsonObject statsObject; statsObject["average_listeners_last_second"] = (float) _sumListeners / (float) _numStatFrames; diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index 7505c4324e..90473f754f 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -29,9 +29,13 @@ public slots: void nodeAdded(SharedNodePointer nodeAdded); void nodeKilled(SharedNodePointer killedNode); - void readPendingDatagrams(); - void sendStatsPacket(); + +private slots: + void handleAvatarDataPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleAvatarIdentityPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleAvatarBillboardPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer senderNode); private: void broadcastAvatarData(); diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index c09e068b21..bdd619ccf1 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -42,19 +42,19 @@ EntityServer::~EntityServer() { void EntityServer::handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, receivedPacket->getData()); + _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } } void EntityServer::handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, receivedPacket->getData()); + _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } } void EntityServer::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { if (_octreeInboundPacketProcessor) { - _octreeInboundPacketProcessor->queueReceivedPacket(senderNode, receivedPacket->getData()); + _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } } diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 55d6f0be81..2488c92439 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -248,10 +248,10 @@ OctreeServer::OctreeServer(const QByteArray& packet) : AccountManager::getInstance().setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL); - auto packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver->registerPacketListener(getMyQueryMessageType(), this, "handleOctreeQueryPacket"); - packetReceiver->registerPacketListener(PacketType::OctreeDataNack, this, "handleOctreeDataNackPacket"); - packetReceiver->registerPacketListener(PacketType::JurisdictionRequest, this, "handleJurisdictionRequestPacket"); + auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); + packetReceiver.registerPacketListener(getMyQueryMessageType(), this, "handleOctreeQueryPacket"); + packetReceiver.registerPacketListener(PacketType::OctreeDataNack, this, "handleOctreeDataNackPacket"); + packetReceiver.registerPacketListener(PacketType::JurisdictionRequest, this, "handleJurisdictionRequestPacket"); } OctreeServer::~OctreeServer() { @@ -860,35 +860,29 @@ void OctreeServer::readPendingDatagram(const QByteArray& receivedPacket, const H } } -void handleOctreeQueryPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { +void OctreeServer::handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { // If we got a query packet, then we're talking to an agent, and we // need to make sure we have it in our nodeList. - SharedNodePointer matchingNode = nodeList->nodeWithUUID(packet->getSourceID()); - if (matchingNode) { - nodeList->updateNodeWithDataFromPacket(matchingNode, packet->getData()); + auto nodeList = DependencyManager::get(); + nodeList->updateNodeWithDataFromPacket(senderNode, packet->getData()); - OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); - if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { - nodeData->initializeOctreeSendThread(this, matchingNode); - } + OctreeQueryNode* nodeData = (OctreeQueryNode*)senderNode->getLinkedData(); + if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { + nodeData->initializeOctreeSendThread(this, senderNode); } } -void handleOctreeDataNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { +void OctreeServer::handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { // If we got a nack packet, then we're talking to an agent, and we // need to make sure we have it in our nodeList. - SharedNodePointer matchingNode = nodeList->nodeWithUUID(packet->getSourceID()); - if (matchingNode) { - OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData(); - if (nodeData) { - nodeData->parseNackPacket(packet->getData()); - } + OctreeQueryNode* nodeData = (OctreeQueryNode*)senderNode->getLinkedData(); + if (nodeData) { + nodeData->parseNackPacket(packet->getData()); } } -void handleJurisdictionRequestPacket(QSharedPointer packet, HifiSockAddr senderSockAddr) { - SharedNodePointer matchingNode = nodeList->nodeWithUUID(packet->getSourceID()); - _jurisdictionSender->queueReceivedPacket(matchingNode, packet->getData()); +void OctreeServer::handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { + _jurisdictionSender->queueReceivedPacket(senderNode, packet->getData()); } void OctreeServer::setupDatagramProcessingThread() { diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index d25ef3183b..df36580f57 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -129,9 +129,9 @@ public slots: void readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); private slots: - void handleOctreeQueryPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleOctreeDataNackPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); - void handleJurisdictionRequestPacket(QSharedPointer packet, HifiSockAddr senderSockAddr); + void handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); protected: virtual Octree* createTree() = 0; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 01a7a1c1dd..25a1247691 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -867,9 +867,8 @@ void AvatarData::clearJointsData() { } } -bool AvatarData::hasIdentityChangedAfterParsing(const QByteArray &packet) { - QDataStream packetStream(packet); - packetStream.skipRawData(numBytesForPacketHeader(packet)); +bool AvatarData::hasIdentityChangedAfterParsing(NLPacket& packet) { + QDataStream packetStream(&packet); QUuid avatarUUID; QUrl faceModelURL, skeletonModelURL; @@ -911,8 +910,8 @@ QByteArray AvatarData::identityByteArray() { return identityData; } -bool AvatarData::hasBillboardChangedAfterParsing(const QByteArray& packet) { - QByteArray newBillboard = packet.mid(numBytesForPacketHeader(packet)); +bool AvatarData::hasBillboardChangedAfterParsing(NLPacket& packet) { + QByteArray newBillboard = QByteArray(packet.getPayload()); if (newBillboard == _billboard) { return false; } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index ad6be52a61..a020be0f7a 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -47,6 +47,7 @@ typedef unsigned long long quint64; #include #include +#include #include #include #include @@ -260,10 +261,10 @@ public: return false; } - bool hasIdentityChangedAfterParsing(const QByteArray& packet); + bool hasIdentityChangedAfterParsing(NLPacket& packet); QByteArray identityByteArray(); - bool hasBillboardChangedAfterParsing(const QByteArray& packet); + bool hasBillboardChangedAfterParsing(NLPacket& packet); const QUrl& getFaceModelURL() const { return _faceModelURL; } QString getFaceModelURLString() const { return _faceModelURL.toString(); } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index d269db8bed..a91076d6ca 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -301,6 +301,10 @@ void LimitedNodeList::killNodeWithUUID(const QUuid& nodeUUID) { } } +void LimitedNodeList::processKillNode(NLPacket& packet) { + processKillNode(QByteArray::fromRawData(packet.getData(), packet.getSizeWithHeader())); +} + void LimitedNodeList::processKillNode(const QByteArray& dataByteArray) { // read the node id QUuid nodeUUID = QUuid::fromRfc4122(dataByteArray.mid(numBytesForPacketHeader(dataByteArray), NUM_BYTES_RFC4122_UUID)); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 44d853919a..07d1eed644 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -153,6 +153,7 @@ public: const HifiSockAddr& getLocalSockAddr() const { return _localSockAddr; } const HifiSockAddr& getSTUNSockAddr() const { return _stunSockAddr; } + void processKillNode(NLPacket& packet); void processKillNode(const QByteArray& datagram); int updateNodeWithDataFromPacket(QSharedPointer packet, SharedNodePointer matchingNode);