From bf3324fc6bad5e0cbfac6a6a4803b8766a1ba485 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 8 Apr 2016 15:28:12 -0700 Subject: [PATCH] hold download of ATP script if Asset Server isn't ready --- assignment-client/src/Agent.cpp | 39 +++++++++++++++++++++++++++++---- assignment-client/src/Agent.h | 5 ++++- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index dc35885f8d..3305beae35 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -144,6 +144,9 @@ void Agent::run() { connect(messagesThread, &QThread::started, messagesClient.data(), &MessagesClient::init); messagesThread->start(); + // make sure we hear about connected nodes so we can grab an ATP script if a request is pending + connect(nodeList.data(), &LimitedNodeList::nodeActivated, this, &Agent::nodeActivated); + nodeList->addSetOfNodeTypesToNodeInterestSet({ NodeType::AudioMixer, NodeType::AvatarMixer, NodeType::EntityServer, NodeType::MessagesMixer, NodeType::AssetServer }); @@ -181,20 +184,48 @@ void Agent::requestScript() { // setup a timeout for script request static const int SCRIPT_TIMEOUT_MS = 10000; - connect(&_scriptRequestTimeout, &QTimer::timeout, this, &Agent::scriptRequestFinished); - _scriptRequestTimeout.start(SCRIPT_TIMEOUT_MS); - + _scriptRequestTimeout = new QTimer; + connect(_scriptRequestTimeout, &QTimer::timeout, this, &Agent::scriptRequestFinished); + _scriptRequestTimeout->start(SCRIPT_TIMEOUT_MS); + connect(request, &ResourceRequest::finished, this, &Agent::scriptRequestFinished); + if (scriptURL.scheme() == URL_SCHEME_ATP) { + // we have an ATP URL for the script - if we're not currently connected to the AssetServer + // then wait for the nodeConnected signal to fire off the request + + auto assetServer = nodeList->soloNodeOfType(NodeType::AssetServer); + if (!assetServer || assetServer->getActiveSocket()) { + qDebug() << "Waiting to connect to Asset Server for ATP script download."; + _pendingScriptRequest = request; + + return; + } + } + qInfo() << "Requesting script at URL" << qPrintable(request->getUrl().toString()); request->send(); } +void Agent::nodeActivated(SharedNodePointer activatedNode) { + if (_pendingScriptRequest) { + qInfo() << "Requesting script at URL" << qPrintable(_pendingScriptRequest->getUrl().toString()); + + _pendingScriptRequest->send(); + + _pendingScriptRequest = nullptr; + } +} + void Agent::scriptRequestFinished() { auto request = qobject_cast(sender()); - _scriptRequestTimeout.stop(); + // stop the script request timeout, if it's running + if (_scriptRequestTimeout) { + QMetaObject::invokeMethod(_scriptRequestTimeout, "stop"); + _scriptRequestTimeout->deleteLater(); + } if (request && request->getResult() == ResourceRequest::Success) { _scriptContents = request->getData(); diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 8fb6c10f0b..2b0d22385d 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -69,6 +69,8 @@ private slots: void processAgentAvatarAndAudio(float deltaTime); + void nodeActivated(SharedNodePointer activatedNode); + private: std::unique_ptr _scriptEngine; EntityEditPacketSender _entityEditSender; @@ -83,7 +85,8 @@ private: void sendAvatarBillboardPacket(); QString _scriptContents; - QTimer _scriptRequestTimeout; + QTimer* _scriptRequestTimeout { nullptr }; + ResourceRequest* _pendingScriptRequest { nullptr }; bool _isListeningToAudioStream = false; SharedSoundPointer _avatarSound; int _numAvatarSoundSentBytes = 0;