From b988308a8d4e3e13aaf535b9fdc2555edf550f3b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 7 Feb 2014 09:49:54 -0800 Subject: [PATCH] leverage writeDatagram helper in NodeList, ping if no active socket --- interface/src/Audio.cpp | 2 +- interface/src/ui/VoxelStatsDialog.cpp | 2 +- libraries/audio/src/AudioInjector.cpp | 8 +++-- libraries/octree/src/JurisdictionListener.cpp | 2 +- .../octree/src/OctreeEditPacketSender.cpp | 4 +-- libraries/shared/src/NodeList.cpp | 36 +++++++++++-------- libraries/shared/src/NodeList.h | 7 ++-- 7 files changed, 35 insertions(+), 26 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 4acda2fe9b..e7fdcd32c7 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -388,7 +388,7 @@ void Audio::handleAudioInput() { NodeList* nodeList = NodeList::getInstance(); SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); - if (audioMixer && nodeList->getNodeActiveSocketOrPing(audioMixer.data())) { + if (audioMixer && nodeList->getNodeActiveSocketOrPing(audioMixer)) { MyAvatar* interfaceAvatar = Application::getInstance()->getAvatar(); glm::vec3 headPosition = interfaceAvatar->getHead().getPosition(); glm::quat headOrientation = interfaceAvatar->getHead().getOrientation(); diff --git a/interface/src/ui/VoxelStatsDialog.cpp b/interface/src/ui/VoxelStatsDialog.cpp index 27b7f788ec..1d94705504 100644 --- a/interface/src/ui/VoxelStatsDialog.cpp +++ b/interface/src/ui/VoxelStatsDialog.cpp @@ -265,7 +265,7 @@ void VoxelStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t serv std::stringstream extraDetails(""); std::stringstream linkDetails(""); - if (nodeList->getNodeActiveSocketOrPing(node.data())) { + if (nodeList->getNodeActiveSocketOrPing(node)) { serverDetails << "active "; } else { serverDetails << "inactive "; diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 6dd7342eba..905c1ecfc6 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -93,9 +93,11 @@ void AudioInjector::injectAudio() { // grab our audio mixer from the NodeList, if it exists SharedNodePointer audioMixer = nodeList->soloNodeOfType(NodeType::AudioMixer); - if (audioMixer && nodeList->getNodeActiveSocketOrPing(audioMixer.data())) { - // send off this audio packet - nodeList->writeDatagram(injectAudioPacket, audioMixer); + // send off this audio packet + nodeList->writeDatagram(injectAudioPacket, audioMixer); + + if (audioMixer && nodeList->getNodeActiveSocketOrPing(audioMixer)) { + } currentSendPosition += bytesToCopy; diff --git a/libraries/octree/src/JurisdictionListener.cpp b/libraries/octree/src/JurisdictionListener.cpp index fb364c7483..a15c72cc5e 100644 --- a/libraries/octree/src/JurisdictionListener.cpp +++ b/libraries/octree/src/JurisdictionListener.cpp @@ -45,7 +45,7 @@ bool JurisdictionListener::queueJurisdictionRequest() { NodeList* nodeList = NodeList::getInstance(); foreach (const SharedNodePointer& node, nodeList->getNodeHash()) { - if (nodeList->getNodeActiveSocketOrPing(node.data()) && node->getType() == getNodeType()) { + if (nodeList->getNodeActiveSocketOrPing(node) && node->getType() == getNodeType()) { _packetSender.queuePacketForSending(node, QByteArray(reinterpret_cast(bufferOut), sizeOut)); nodeCount++; } diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index f7b60b3d3f..ca3ffc707f 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -61,7 +61,7 @@ bool OctreeEditPacketSender::serversExist() const { foreach (const SharedNodePointer& node, nodeList->getNodeHash()) { // only send to the NodeTypes that are getMyNodeType() if (node->getType() == getMyNodeType()) { - if (nodeList->getNodeActiveSocketOrPing(node.data())) { + if (nodeList->getNodeActiveSocketOrPing(node)) { QUuid nodeUUID = node->getUUID(); // If we've got Jurisdictions set, then check to see if we know the jurisdiction for this server if (_serverJurisdictions) { @@ -91,7 +91,7 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, unsigned c // only send to the NodeTypes that are getMyNodeType() if (node->getType() == getMyNodeType() && ((node->getUUID() == nodeUUID) || (nodeUUID.isNull()))) { - if (nodeList->getNodeActiveSocketOrPing(node.data())) { + if (nodeList->getNodeActiveSocketOrPing(node)) { queuePacketForSending(node, QByteArray(reinterpret_cast(buffer), length)); // debugging output... diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 1810acb6f8..6b9ef4f406 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -94,7 +94,7 @@ qint64 NodeList::writeDatagram(const QByteArray& datagram, const SharedNodePoint // if we don't have an ovveriden address, assume they want to send to the node's active socket const HifiSockAddr* destinationSockAddr = &overridenSockAddr; if (overridenSockAddr.isNull()) { - if (destinationNode->getActiveSocket()) { + if (getNodeActiveSocketOrPing(destinationNode)) { // use the node's active socket as the destination socket destinationSockAddr = destinationNode->getActiveSocket(); } else { @@ -196,7 +196,7 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr case PacketTypePing: { // send back a reply QByteArray replyPacket = constructPingReplyPacket(packet); - _nodeSocket.writeDatagram(replyPacket, senderSockAddr.getAddress(), senderSockAddr.getPort()); + writeDatagram(replyPacket, sendingNodeForPacket(packet), senderSockAddr); break; } case PacketTypePingReply: { @@ -251,6 +251,14 @@ SharedNodePointer NodeList::nodeWithUUID(const QUuid& nodeUUID) { return _nodeHash.value(nodeUUID); } +SharedNodePointer NodeList::sendingNodeForPacket(const QByteArray& packet) { + QUuid nodeUUID; + deconstructPacketHeader(packet, nodeUUID); + + // return the matching node, or NULL if there is no match + return nodeWithUUID(nodeUUID); +} + NodeHash NodeList::getNodeHash() { QMutexLocker locker(&_nodeHashMutex); return NodeHash(_nodeHash); @@ -606,12 +614,12 @@ QByteArray NodeList::constructPingReplyPacket(const QByteArray& pingPacket) { return replyPacket; } -void NodeList::pingPublicAndLocalSocketsForInactiveNode(Node* node) { +void NodeList::pingPublicAndLocalSocketsForInactiveNode(const SharedNodePointer& node) { QByteArray pingPacket = constructPingPacket(); // send the ping packet to the local and public sockets for this node - _nodeSocket.writeDatagram(pingPacket, node->getLocalSocket().getAddress(), node->getLocalSocket().getPort()); - _nodeSocket.writeDatagram(pingPacket, node->getPublicSocket().getAddress(), node->getPublicSocket().getPort()); + writeDatagram(pingPacket, node); + writeDatagram(pingPacket, node); } SharedNodePointer NodeList::addOrUpdateNode(const QUuid& uuid, char nodeType, @@ -668,11 +676,8 @@ unsigned NodeList::broadcastToNodes(const QByteArray& packet, const NodeSet& des foreach (const SharedNodePointer& node, getNodeHash()) { // only send to the NodeTypes we are asked to send to. if (destinationNodeTypes.contains(node->getType())) { - if (getNodeActiveSocketOrPing(node.data())) { - // we know which socket is good for this node, send there - _nodeSocket.writeDatagram(packet, node->getActiveSocket()->getAddress(), node->getActiveSocket()->getPort()); - ++n; - } + writeDatagram(packet, node); + ++n; } } @@ -683,18 +688,19 @@ void NodeList::pingInactiveNodes() { foreach (const SharedNodePointer& node, getNodeHash()) { if (!node->getActiveSocket()) { // we don't have an active link to this node, ping it to set that up - pingPublicAndLocalSocketsForInactiveNode(node.data()); + pingPublicAndLocalSocketsForInactiveNode(node); } } } -const HifiSockAddr* NodeList::getNodeActiveSocketOrPing(Node* node) { - if (node->getActiveSocket()) { +const HifiSockAddr* NodeList::getNodeActiveSocketOrPing(const SharedNodePointer& node) { + if (node && node->getActiveSocket()) { return node->getActiveSocket(); - } else { + } else if (node) { pingPublicAndLocalSocketsForInactiveNode(node); - return NULL; } + + return NULL; } void NodeList::activateSocketFromNodeCommunication(const HifiSockAddr& nodeAddress) { diff --git a/libraries/shared/src/NodeList.h b/libraries/shared/src/NodeList.h index d3c3dfcbac..1a035e91d1 100644 --- a/libraries/shared/src/NodeList.h +++ b/libraries/shared/src/NodeList.h @@ -102,10 +102,11 @@ public: QByteArray constructPingPacket(); QByteArray constructPingReplyPacket(const QByteArray& pingPacket); - void pingPublicAndLocalSocketsForInactiveNode(Node* node); + void pingPublicAndLocalSocketsForInactiveNode(const SharedNodePointer& node); SharedNodePointer nodeWithUUID(const QUuid& nodeUUID); - + SharedNodePointer sendingNodeForPacket(const QByteArray& packet); + SharedNodePointer addOrUpdateNode(const QUuid& uuid, char nodeType, const HifiSockAddr& publicSocket, const HifiSockAddr& localSocket); void processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet); @@ -119,7 +120,7 @@ public: void loadData(QSettings* settings); void saveData(QSettings* settings); - const HifiSockAddr* getNodeActiveSocketOrPing(Node* node); + const HifiSockAddr* getNodeActiveSocketOrPing(const SharedNodePointer& node); public slots: void sendDomainServerCheckIn(); void pingInactiveNodes();