From 85aa3b3f83d9412aaf4dc7dffb07fdfff789e7fa Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Tue, 17 Nov 2015 14:28:51 -0800 Subject: [PATCH] handle subscribe when messages mixer is not available --- examples/example/messagesExample.js | 40 ++++++++++----------- examples/example/messagesReceiverExample.js | 20 ++--------- libraries/networking/src/MessagesClient.cpp | 16 ++++----- libraries/networking/src/MessagesClient.h | 5 ++- 4 files changed, 33 insertions(+), 48 deletions(-) diff --git a/examples/example/messagesExample.js b/examples/example/messagesExample.js index f5d8dea2d3..390549a135 100644 --- a/examples/example/messagesExample.js +++ b/examples/example/messagesExample.js @@ -12,29 +12,25 @@ Script.update.connect(function (deltaTime) { subscribedForTime += deltaTime; } - if (totalTime > 5) { - - // if we've been unsubscribed for SWITCH_SUBSCRIPTION_TIME seconds, subscribe - if (!subscribed && unsubscribedForTime > SWITCH_SUBSCRIPTION_TIME) { - print("---- subscribing ----"); - Messages.subscribe(channel); - subscribed = true; - subscribedForTime = 0; - } - - // if we've been subscribed for SWITCH_SUBSCRIPTION_TIME seconds, unsubscribe - if (subscribed && subscribedForTime > SWITCH_SUBSCRIPTION_TIME) { - print("---- unsubscribing ----"); - Messages.unsubscribe(channel); - subscribed = false; - unsubscribedForTime = 0; - } - - // Even if not subscribed, still publish - var message = "update() deltaTime:" + deltaTime; - //print(message); - Messages.sendMessage(channel, message); + // if we've been unsubscribed for SWITCH_SUBSCRIPTION_TIME seconds, subscribe + if (!subscribed && unsubscribedForTime > SWITCH_SUBSCRIPTION_TIME) { + print("---- subscribing ----"); + Messages.subscribe(channel); + subscribed = true; + subscribedForTime = 0; } + + // if we've been subscribed for SWITCH_SUBSCRIPTION_TIME seconds, unsubscribe + if (subscribed && subscribedForTime > SWITCH_SUBSCRIPTION_TIME) { + print("---- unsubscribing ----"); + Messages.unsubscribe(channel); + subscribed = false; + unsubscribedForTime = 0; + } + + // Even if not subscribed, still publish + var message = "update() deltaTime:" + deltaTime; + Messages.sendMessage(channel, message); }); diff --git a/examples/example/messagesReceiverExample.js b/examples/example/messagesReceiverExample.js index caab270783..2239ab1fc3 100644 --- a/examples/example/messagesReceiverExample.js +++ b/examples/example/messagesReceiverExample.js @@ -1,21 +1,7 @@ -var totalTime = 0; -var subscribed = false; -var WAIT_FOR_SUBSCRIPTION_TIME = 10; -function myUpdate(deltaTime) { - var channel = "example"; - totalTime += deltaTime; - - if (totalTime > WAIT_FOR_SUBSCRIPTION_TIME && !subscribed) { - - print("---- subscribing ----"); - Messages.subscribe(channel); - subscribed = true; - Script.update.disconnect(myUpdate); - } -} - -Script.update.connect(myUpdate); +print("---- subscribing ----"); +Messages.subscribe(channel); Messages.messageReceived.connect(function (channel, message, senderID) { print("message received on channel:" + channel + ", message:" + message + ", senderID:" + senderID); }); + diff --git a/libraries/networking/src/MessagesClient.cpp b/libraries/networking/src/MessagesClient.cpp index 81e9c3abdf..88d64adcdd 100644 --- a/libraries/networking/src/MessagesClient.cpp +++ b/libraries/networking/src/MessagesClient.cpp @@ -27,7 +27,7 @@ MessagesClient::MessagesClient() { auto nodeList = DependencyManager::get(); auto& packetReceiver = nodeList->getPacketReceiver(); packetReceiver.registerMessageListener(PacketType::MessagesData, this, "handleMessagesPacket"); - connect(nodeList.data(), &LimitedNodeList::nodeKilled, this, &MessagesClient::handleNodeKilled); + connect(nodeList.data(), &LimitedNodeList::nodeAdded, this, &MessagesClient::handleNodeAdded); } void MessagesClient::init() { @@ -75,10 +75,8 @@ void MessagesClient::sendMessage(const QString& channel, const QString& message) } } -// FIXME - we should keep track of the channels we are subscribed to locally, and -// in the event that they mixer goes away and/or comes back we should automatically -// resubscribe to those channels void MessagesClient::subscribe(const QString& channel) { + _subscribedChannels << channel; auto nodeList = DependencyManager::get(); SharedNodePointer messagesMixer = nodeList->soloNodeOfType(NodeType::MessagesMixer); @@ -90,6 +88,7 @@ void MessagesClient::subscribe(const QString& channel) { } void MessagesClient::unsubscribe(const QString& channel) { + _subscribedChannels.remove(channel); auto nodeList = DependencyManager::get(); SharedNodePointer messagesMixer = nodeList->soloNodeOfType(NodeType::MessagesMixer); @@ -100,9 +99,10 @@ void MessagesClient::unsubscribe(const QString& channel) { } } -void MessagesClient::handleNodeKilled(SharedNodePointer node) { - if (node->getType() != NodeType::MessagesMixer) { - return; +void MessagesClient::handleNodeAdded(SharedNodePointer node) { + if (node->getType() == NodeType::MessagesMixer) { + for (const auto& channel : _subscribedChannels) { + subscribe(channel); + } } - // FIXME - do we need to do any special bookkeeping for when the messages mixer is no longer available } diff --git a/libraries/networking/src/MessagesClient.h b/libraries/networking/src/MessagesClient.h index 4eb63c3e74..695e7e789e 100644 --- a/libraries/networking/src/MessagesClient.h +++ b/libraries/networking/src/MessagesClient.h @@ -37,7 +37,10 @@ signals: private slots: void handleMessagesPacket(QSharedPointer packetList, SharedNodePointer senderNode); - void handleNodeKilled(SharedNodePointer node); + void handleNodeAdded(SharedNodePointer node); + +protected: + QSet _subscribedChannels; }; #endif