From 84b86c17b7d75a76d6afc1d4e6a03b7e537058b9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 28 Jul 2014 15:16:59 -0700 Subject: [PATCH] use common settings retreival code to block before run in AudioMixer --- assignment-client/src/audio/AudioMixer.cpp | 43 +++++++--------------- libraries/networking/src/DomainHandler.cpp | 29 +++++++++------ libraries/networking/src/DomainHandler.h | 3 ++ 3 files changed, 33 insertions(+), 42 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index ad4787b407..91ecee76e2 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -408,41 +408,24 @@ void AudioMixer::run() { nodeList->linkedDataCreateCallback = attachNewBufferToNode; - // setup a NetworkAccessManager to ask the domain-server for our settings - NetworkAccessManager& networkManager = NetworkAccessManager::getInstance(); + // wait until we have the domain-server settings, otherwise we bail + DomainHandler& domainHandler = nodeList->getDomainHandler(); - QUrl settingsJSONURL; - settingsJSONURL.setScheme("http"); - settingsJSONURL.setHost(nodeList->getDomainHandler().getHostname()); - settingsJSONURL.setPort(DOMAIN_SERVER_HTTP_PORT); - settingsJSONURL.setPath("/settings.json"); - settingsJSONURL.setQuery(QString("type=%1").arg(_type)); + qDebug() << "Waiting for domain settings from domain-server."; - QNetworkReply *reply = NULL; + // block until we get the settingsRequestComplete signal + QEventLoop loop; + loop.connect(&domainHandler, &DomainHandler::settingsRequestComplete, &loop, &QEventLoop::quit); + domainHandler.requestDomainSettings(); + loop.exec(); - int failedAttempts = 0; - const int MAX_SETTINGS_REQUEST_FAILED_ATTEMPTS = 5; - - qDebug() << "Requesting settings for assignment from domain-server at" << settingsJSONURL.toString(); - - while (!reply || reply->error() != QNetworkReply::NoError) { - reply = networkManager.get(QNetworkRequest(settingsJSONURL)); - - QEventLoop loop; - QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); - - loop.exec(); - - ++failedAttempts; - - if (failedAttempts == MAX_SETTINGS_REQUEST_FAILED_ATTEMPTS) { - qDebug() << "Failed to get settings from domain-server. Bailing on assignment."; - setFinished(true); - return; - } + if (domainHandler.getSettingsObject().isEmpty()) { + qDebug() << "Failed to retreive settings object from domain-server. Bailing on assignment."; + setFinished(true); + return; } - QJsonObject settingsObject = QJsonDocument::fromJson(reply->readAll()).object(); + const QJsonObject& settingsObject = domainHandler.getSettingsObject(); // check the settings object to see if we have anything we can parse out const QString AUDIO_GROUP_KEY = "audio"; diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index ce6a264b34..0f37160512 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -128,18 +128,21 @@ void DomainHandler::setIsConnected(bool isConnected) { } void DomainHandler::requestDomainSettings() const { - - // setup the URL required to grab settings JSON - QUrl settingsJSONURL; - settingsJSONURL.setScheme("http"); - settingsJSONURL.setHost(_hostname); - settingsJSONURL.setPort(DOMAIN_SERVER_HTTP_PORT); - settingsJSONURL.setPath("/settingz.json/"); - Assignment::Type assignmentType = Assignment::typeForNodeType(NodeList::getInstance()->getOwnerType()); - settingsJSONURL.setQuery(QString("type=%1").arg(assignmentType)); - - QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(settingsJSONURL)); - connect(reply, &QNetworkReply::finished, this, &DomainHandler::settingsRequestFinished); + if (_settingsObject.isEmpty()) { + // setup the URL required to grab settings JSON + QUrl settingsJSONURL; + settingsJSONURL.setScheme("http"); + settingsJSONURL.setHost(_hostname); + settingsJSONURL.setPort(DOMAIN_SERVER_HTTP_PORT); + settingsJSONURL.setPath("/settings.json"); + Assignment::Type assignmentType = Assignment::typeForNodeType(NodeList::getInstance()->getOwnerType()); + settingsJSONURL.setQuery(QString("type=%1").arg(assignmentType)); + + qDebug() << "Requesting domain-server settings at" << settingsJSONURL.toString(); + + QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(settingsJSONURL)); + connect(reply, &QNetworkReply::finished, this, &DomainHandler::settingsRequestFinished); + } } const int MAX_SETTINGS_REQUEST_FAILED_ATTEMPTS = 5; @@ -154,6 +157,7 @@ void DomainHandler::settingsRequestFinished() { _settingsObject = QJsonDocument::fromJson(settingsReply->readAll()).object(); qDebug() << "Received domain settings."; + emit settingsRequestComplete(true); // reset failed settings requests to 0, we got them _failedSettingsRequests = 0; @@ -166,6 +170,7 @@ void DomainHandler::settingsRequestFinished() { qDebug() << "Failed to retreive domain-server settings" << MAX_SETTINGS_REQUEST_FAILED_ATTEMPTS << "times. Re-setting connection to domain."; clearSettings(); clearConnectionInfo(); + emit settingsRequestComplete(false); } else { requestDomainSettings(); } diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 6761b8eb84..67edd64172 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -58,6 +58,7 @@ public: bool hasSettings() const { return !_settingsObject.isEmpty(); } void requestDomainSettings() const; + const QJsonObject& getSettingsObject() const { return _settingsObject; } void parseDTLSRequirementPacket(const QByteArray& dtlsRequirementPacket); @@ -68,6 +69,8 @@ signals: void hostnameChanged(const QString& hostname); void connectedToDomain(const QString& hostname); + void settingsRequestComplete(bool wasSuccessful); + private: void reset();