From 9d4f9aa21e24ebbada350bb5c9594543d3d21a64 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 15:38:45 -0700 Subject: [PATCH] final fixes to get ACs building again --- assignment-client/src/Agent.cpp | 32 ++++++----- assignment-client/src/AssignmentClient.cpp | 2 +- assignment-client/src/AssignmentFactory.cpp | 6 +- assignment-client/src/AssignmentFactory.h | 2 +- .../src/entities/EntityServer.cpp | 13 +++-- assignment-client/src/entities/EntityServer.h | 8 +-- assignment-client/src/octree/OctreeServer.cpp | 55 ++----------------- assignment-client/src/octree/OctreeServer.h | 9 +-- libraries/networking/src/NodeList.h | 1 - libraries/octree/src/JurisdictionSender.h | 2 +- 10 files changed, 42 insertions(+), 88 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 449d8b5362..a333f4afdd 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -60,34 +60,38 @@ Agent::Agent(NLPacket& packet) : } void Agent::handleOctreePacket(QSharedPointer packet, SharedNodePointer senderNode) { - QByteArray mutablePacket = QByteArray(packet->getData(), packet->getSizeWithHeader()); - int messageLength = mutablePacket.size(); - auto packetType = packet->getType(); if (packetType == PacketType::OctreeStats) { int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(packet, senderNode); - if (messageLength > statsMessageLength) { - mutablePacket = mutablePacket.mid(statsMessageLength); + if (packet->getSizeUsed() > statsMessageLength) { + // pull out the piggybacked packet and create a new QSharedPointer for it + int packetSizeWithHeader = packet->getSizeUsed() - statsMessageLength; + + std::unique_ptr buffer = std::unique_ptr(new char[packetSizeWithHeader]); + memcpy(buffer.get(), packet->getPayload() + statsMessageLength, packetSizeWithHeader); + + auto newPacket = NLPacket::fromReceivedPacket(std::move(buffer), packetSizeWithHeader, packet->getSenderSockAddr()); + packet = QSharedPointer(newPacket.release()); } else { return; // bail since no piggyback data } - packetType = packetTypeForPacket(mutablePacket); + packetType = packet->getType(); } // fall through to piggyback message if (packetType == PacketType::EntityData || packetType == PacketType::EntityErase) { - _entityViewer.processDatagram(mutablePacket, senderNode); + _entityViewer.processDatagram(*packet, senderNode); } } -void Agent::handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - QByteArray receivedPacket = QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader()); - int headerBytes = numBytesForPacketHeader(receivedPacket); - +void Agent::handleJurisdictionPacket(QSharedPointer packet, SharedNodePointer senderNode) { + NodeType_t nodeType; + packet->peek(reinterpret_cast(&nodeType), sizeof(nodeType)); + // PacketType_JURISDICTION, first byte is the node type... - switch (receivedPacket[headerBytes]) { + switch (nodeType) { case NodeType::EntityServer: DependencyManager::get()->getJurisdictionListener()-> queueReceivedPacket(packet, senderNode); @@ -95,8 +99,8 @@ void Agent::handleJurisdictionPacket(QSharedPointer packet, SharedNode } } -void Agent::handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - _receivedAudioStream.parseData(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); +void Agent::handleAudioPacket(QSharedPointer packet, SharedNodePointer senderNode) { + _receivedAudioStream.parseData(*packet, senderNode); _lastReceivedAudioLoudness = _receivedAudioStream.getNextOutputFrameLoudness(); diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 499ed93c89..e6934e8b1b 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -210,7 +210,7 @@ void AssignmentClient::handleCreateAssignmentPacket(QSharedPointer pac qDebug() << "Received a PacketType::CreateAssignment - attempting to unpack."; // construct the deployed assignment from the packet data - _currentAssignment = AssignmentFactory::unpackAssignment(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); + _currentAssignment = AssignmentFactory::unpackAssignment(*packet); if (_currentAssignment) { qDebug() << "Received an assignment -" << *_currentAssignment; diff --git a/assignment-client/src/AssignmentFactory.cpp b/assignment-client/src/AssignmentFactory.cpp index 4dafd64a92..705ff5179b 100644 --- a/assignment-client/src/AssignmentFactory.cpp +++ b/assignment-client/src/AssignmentFactory.cpp @@ -17,12 +17,10 @@ #include "avatars/AvatarMixer.h" #include "entities/EntityServer.h" -ThreadedAssignment* AssignmentFactory::unpackAssignment(const QByteArray& packet) { - QDataStream packetStream(packet); - packetStream.skipRawData(numBytesForPacketHeader(packet)); +ThreadedAssignment* AssignmentFactory::unpackAssignment(NLPacket& packet) { quint8 packedType; - packetStream >> packedType; + packet.peek(reinterpret_cast(&packedType), sizeof(packedType)); Assignment::Type unpackedType = (Assignment::Type) packedType; diff --git a/assignment-client/src/AssignmentFactory.h b/assignment-client/src/AssignmentFactory.h index 9c197f5747..3c1fef99ef 100644 --- a/assignment-client/src/AssignmentFactory.h +++ b/assignment-client/src/AssignmentFactory.h @@ -16,7 +16,7 @@ class AssignmentFactory { public: - static ThreadedAssignment* unpackAssignment(const QByteArray& packet); + static ThreadedAssignment* unpackAssignment(NLPacket& packet); }; #endif // hifi_AssignmentFactory_h diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index bdd619ccf1..3dee2af464 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -21,9 +21,10 @@ const char* MODEL_SERVER_NAME = "Entity"; const char* MODEL_SERVER_LOGGING_TARGET_NAME = "entity-server"; const char* LOCAL_MODELS_PERSIST_FILE = "resources/models.svo"; -EntityServer::EntityServer(const QByteArray& packet) - : OctreeServer(packet), _entitySimulation(NULL) { - +EntityServer::EntityServer(NLPacket& packet) : + OctreeServer(packet), + _entitySimulation(NULL) +{ auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerPacketListener(PacketType::EntityAdd, this, "handleEntityAddPacket"); packetReceiver.registerPacketListener(PacketType::EntityEdit, this, "handleEntityEditPacket"); @@ -40,19 +41,19 @@ EntityServer::~EntityServer() { tree->removeNewlyCreatedHook(this); } -void EntityServer::handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void EntityServer::handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode) { if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } } -void EntityServer::handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void EntityServer::handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode) { if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } } -void EntityServer::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void EntityServer::handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode) { if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->queueReceivedPacket(packet, senderNode); } diff --git a/assignment-client/src/entities/EntityServer.h b/assignment-client/src/entities/EntityServer.h index cacf8f3457..dde68dfebd 100644 --- a/assignment-client/src/entities/EntityServer.h +++ b/assignment-client/src/entities/EntityServer.h @@ -22,7 +22,7 @@ class EntityServer : public OctreeServer, public NewlyCreatedEntityHook { Q_OBJECT public: - EntityServer(const QByteArray& packet); + EntityServer(NLPacket& packet); ~EntityServer(); // Subclasses must implement these methods @@ -50,9 +50,9 @@ protected: virtual Octree* createTree(); private slots: - void handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleEntityAddPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleEntityEditPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleEntityErasePacket(QSharedPointer packet, SharedNodePointer senderNode); private: EntitySimulation* _entitySimulation; diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 3002474714..9b93b3895e 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -813,53 +813,11 @@ void OctreeServer::parsePayload() { } } -void OctreeServer::readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) { - auto nodeList = DependencyManager::get(); - - // If we know we're shutting down we just drop these packets on the floor. - // This stops us from initializing send threads we just shut down. - - if (!_isShuttingDown) { - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { - PacketType::Value packetType = packetTypeForPacket(receivedPacket); - SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); - if (packetType == getMyQueryMessageType()) { - // 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. - if (matchingNode) { - nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); - - OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); - if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { - nodeData->initializeOctreeSendThread(this, matchingNode); - } - } - } else if (packetType == PacketType::OctreeDataNack) { - // 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. - if (matchingNode) { - OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData(); - if (nodeData) { - nodeData->parseNackPacket(receivedPacket); - } - } - } else if (packetType == PacketType::JurisdictionRequest) { - _jurisdictionSender->queueReceivedPacket(matchingNode, receivedPacket); - } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { - _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, receivedPacket); - } else { - // let processNodeData handle it. - DependencyManager::get()->processNodeData(senderSockAddr, receivedPacket); - } - } - } -} - -void OctreeServer::handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void OctreeServer::handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode) { // 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. auto nodeList = DependencyManager::get(); - nodeList->updateNodeWithDataFromPacket(senderNode, packet->getData()); + nodeList->updateNodeWithDataFromPacket(packet, senderNode); OctreeQueryNode* nodeData = (OctreeQueryNode*)senderNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { @@ -867,7 +825,7 @@ void OctreeServer::handleOctreeQueryPacket(QSharedPointer packet, Shar } } -void OctreeServer::handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { +void OctreeServer::handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode) { // 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. OctreeQueryNode* nodeData = (OctreeQueryNode*)senderNode->getLinkedData(); @@ -876,8 +834,8 @@ void OctreeServer::handleOctreeDataNackPacket(QSharedPointer packet, S } } -void OctreeServer::handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr) { - _jurisdictionSender->queueReceivedPacket(senderNode, packet->getData()); +void OctreeServer::handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode) { + _jurisdictionSender->queueReceivedPacket(packet, senderNode); } void OctreeServer::setupDatagramProcessingThread() { @@ -902,9 +860,6 @@ void OctreeServer::setupDatagramProcessingThread() { connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, datagramProcessor, &OctreeServerDatagramProcessor::readPendingDatagrams); - // connect to the datagram processing thread signal that tells us we have to handle a packet - connect(datagramProcessor, &OctreeServerDatagramProcessor::packetRequiresProcessing, this, &OctreeServer::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); diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index e55af02715..bcc9f8cc43 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -125,13 +125,10 @@ public slots: void nodeKilled(SharedNodePointer node); void sendStatsPacket(); - void readPendingDatagrams() { }; // this will not be called since our datagram processing thread will handle - void readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr); - private slots: - void handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); - void handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); + void handleOctreeQueryPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleOctreeDataNackPacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleJurisdictionRequestPacket(QSharedPointer packet, SharedNodePointer senderNode); protected: virtual Octree* createTree() = 0; diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 6578326f4a..65bd6a6983 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -63,7 +63,6 @@ public: void resetNodeInterestSet() { _nodeTypesOfInterest.clear(); } void processReceivedPacket(std::unique_ptr, HifiSockAddr senderSockAddr); - void processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet); void setAssignmentServerSocket(const HifiSockAddr& serverSocket) { _assignmentServerSocket = serverSocket; } void sendAssignment(Assignment& assignment); diff --git a/libraries/octree/src/JurisdictionSender.h b/libraries/octree/src/JurisdictionSender.h index a9b6fb03b5..dd0ff44a11 100644 --- a/libraries/octree/src/JurisdictionSender.h +++ b/libraries/octree/src/JurisdictionSender.h @@ -38,7 +38,7 @@ public: void setNodeType(NodeType_t type) { _nodeType = type; } protected: - virtual void processPacket(QSharedPointer pack, SharedNodePointer sendingNode); + virtual void processPacket(QSharedPointer packet, SharedNodePointer sendingNode); /// Locks all the resources of the thread. void lockRequestingNodes() { _requestingNodeMutex.lock(); }