From 29976d7861f041322f11ccdf29b92bab26470c30 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:17:34 -0700 Subject: [PATCH 01/22] Created base for wrapper singleton class NetworkAccessManager --- .../networking/src/NetworkAccessManager.cpp | 20 ++++++++++++++ .../networking/src/NetworkAccessManager.h | 27 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 libraries/networking/src/NetworkAccessManager.cpp create mode 100644 libraries/networking/src/NetworkAccessManager.h diff --git a/libraries/networking/src/NetworkAccessManager.cpp b/libraries/networking/src/NetworkAccessManager.cpp new file mode 100644 index 0000000000..a33817b50d --- /dev/null +++ b/libraries/networking/src/NetworkAccessManager.cpp @@ -0,0 +1,20 @@ +// +// NetworkAccessManager.cpp +// +// +// Created by Clement on 7/1/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "NetworkAccessManager.h" + +NetworkAccessManager& NetworkAccessManager::getInstance() { + static NetworkAccessManager sharedInstance; + return sharedInstance; +} + +NetworkAccessManager::NetworkAccessManager() { +} \ No newline at end of file diff --git a/libraries/networking/src/NetworkAccessManager.h b/libraries/networking/src/NetworkAccessManager.h new file mode 100644 index 0000000000..c7cc74340a --- /dev/null +++ b/libraries/networking/src/NetworkAccessManager.h @@ -0,0 +1,27 @@ +// +// NetworkAccessManager.h +// +// +// Created by Clement on 7/1/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_NetworkAccessManager_h +#define hifi_NetworkAccessManager_h + +#include + +class NetworkAccessManager : public QNetworkAccessManager { + Q_OBJECT +public: + static NetworkAccessManager& getInstance(); + + +private: + NetworkAccessManager(); +}; + +#endif // hifi_NetworkAccessManager_h \ No newline at end of file From 231557a12c2c9a61ff6f94633811a2119b6f72e8 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:35:34 -0700 Subject: [PATCH 02/22] Switched Agent to NetworkAccessManager --- assignment-client/src/Agent.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 5720ecaaf5..1805a414b5 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -13,13 +13,13 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -208,12 +208,12 @@ void Agent::run() { scriptURL = QUrl(_payload); } - QNetworkAccessManager *networkManager = new QNetworkAccessManager(this); - QNetworkReply *reply = networkManager->get(QNetworkRequest(scriptURL)); - QNetworkDiskCache* cache = new QNetworkDiskCache(networkManager); + NetworkAccessManager& networkManager = NetworkAccessManager::getInstance(); + QNetworkReply *reply = networkManager.get(QNetworkRequest(scriptURL)); + QNetworkDiskCache* cache = new QNetworkDiskCache(&networkManager); QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "agentCache"); - networkManager->setCache(cache); + networkManager.setCache(cache); qDebug() << "Downloading script at" << scriptURL.toString(); @@ -222,10 +222,6 @@ void Agent::run() { loop.exec(); - // let the AvatarData and ResourceCache classes use our QNetworkAccessManager - AvatarData::setNetworkAccessManager(networkManager); - ResourceCache::setNetworkAccessManager(networkManager); - QString scriptContents(reply->readAll()); qDebug() << "Downloaded script:" << scriptContents; From d6a2cea756ce33e22d35e9faca3028ccc03f0bfe Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:39:45 -0700 Subject: [PATCH 03/22] Switched AudioMixer to NetworkAccessManager --- assignment-client/src/audio/AudioMixer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 663aef81a7..1c3046b9b1 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -38,11 +38,11 @@ #include #include #include -#include #include #include #include +#include #include #include #include @@ -482,8 +482,8 @@ void AudioMixer::run() { nodeList->linkedDataCreateCallback = attachNewBufferToNode; - // setup a QNetworkAccessManager to ask the domain-server for our settings - QNetworkAccessManager *networkManager = new QNetworkAccessManager(this); + // setup a NetworkAccessManager to ask the domain-server for our settings + NetworkAccessManager& networkManager = NetworkAccessManager::getInstance(); QUrl settingsJSONURL; settingsJSONURL.setScheme("http"); @@ -500,7 +500,7 @@ void AudioMixer::run() { qDebug() << "Requesting settings for assignment from domain-server at" << settingsJSONURL.toString(); while (!reply || reply->error() != QNetworkReply::NoError) { - reply = networkManager->get(QNetworkRequest(settingsJSONURL)); + reply = networkManager.get(QNetworkRequest(settingsJSONURL)); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); From c5a997a56721cebc3428cb930a805fde253c9493 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:43:25 -0700 Subject: [PATCH 04/22] Switched Application to NetworkAccessManager --- interface/src/Application.cpp | 18 ++++++++---------- interface/src/Application.h | 3 --- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0f8fbbae56..10b6fc8165 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -53,17 +52,18 @@ #include #include +#include #include #include +#include #include +#include #include #include #include #include #include #include -#include -#include #include "Application.h" #include "InterfaceVersion.h" @@ -314,12 +314,11 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); - _networkAccessManager = new QNetworkAccessManager(this); - QNetworkDiskCache* cache = new QNetworkDiskCache(_networkAccessManager); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkDiskCache* cache = new QNetworkDiskCache(&networkAccessManager); cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "interfaceCache"); - _networkAccessManager->setCache(cache); + networkAccessManager.setCache(cache); - ResourceCache::setNetworkAccessManager(_networkAccessManager); ResourceCache::setRequestLimit(3); _window->setCentralWidget(_glWidget); @@ -441,8 +440,6 @@ Application::~Application() { _myAvatar = NULL; delete _glWidget; - - AccountManager::getInstance().destroy(); } void Application::saveSettings() { @@ -3802,7 +3799,8 @@ void Application::initAvatarAndViewFrustum() { void Application::checkVersion() { QNetworkRequest latestVersionRequest((QUrl(CHECK_VERSION_URL))); latestVersionRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); - connect(Application::getInstance()->getNetworkAccessManager()->get(latestVersionRequest), SIGNAL(finished()), SLOT(parseVersionXml())); + QNetworkReply* reply = NetworkAccessManager::getInstance().get(latestVersionRequest); + connect(reply, SIGNAL(finished()), SLOT(parseVersionXml())); } void Application::parseVersionXml() { diff --git a/interface/src/Application.h b/interface/src/Application.h index 56b6f673ae..11f406abf0 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -97,7 +97,6 @@ class QActionGroup; class QGLWidget; class QKeyEvent; class QMouseEvent; -class QNetworkAccessManager; class QSettings; class QWheelEvent; @@ -236,7 +235,6 @@ public: void lockOctreeSceneStats() { _octreeSceneStatsLock.lockForRead(); } void unlockOctreeSceneStats() { _octreeSceneStatsLock.unlock(); } - QNetworkAccessManager* getNetworkAccessManager() { return _networkAccessManager; } GeometryCache* getGeometryCache() { return &_geometryCache; } AnimationCache* getAnimationCache() { return &_animationCache; } TextureCache* getTextureCache() { return &_textureCache; } @@ -423,7 +421,6 @@ private: QThread* _nodeThread; DatagramProcessor _datagramProcessor; - QNetworkAccessManager* _networkAccessManager; QMutex _settingsMutex; QSettings* _settings; int _numChangedSettings; From ab15a1487e58ba90723cc9b2b11d6dc8c289d0bc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:44:38 -0700 Subject: [PATCH 05/22] Switched BillboardOverlay to NetworkAccessManaqer --- interface/src/ui/overlays/BillboardOverlay.cpp | 16 +++++----------- interface/src/ui/overlays/BillboardOverlay.h | 3 +-- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index 40de565155..8742f19c3d 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -14,8 +14,7 @@ #include "BillboardOverlay.h" BillboardOverlay::BillboardOverlay() -: _manager(NULL), - _scale(1.0f), +: _scale(1.0f), _isFacingAvatar(true) { } @@ -119,18 +118,13 @@ void BillboardOverlay::setProperties(const QScriptValue &properties) { } } -// TODO: handle setting image multiple times, how do we manage releasing the bound texture? void BillboardOverlay::setBillboardURL(const QUrl url) { - // TODO: are we creating too many QNetworkAccessManager() when multiple calls to setImageURL are made? - _manager->deleteLater(); - _manager = new QNetworkAccessManager(); - connect(_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); - _manager->get(QNetworkRequest(url)); + QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(url)); + connect(reply, &QNetworkReply::finished, this, &BillboardOverlay::replyFinished); } -void BillboardOverlay::replyFinished(QNetworkReply* reply) { +void BillboardOverlay::replyFinished() { // replace our byte array with the downloaded data + QNetworkReply* reply = static_cast(sender()); _billboard = reply->readAll(); - _manager->deleteLater(); - _manager = NULL; } diff --git a/interface/src/ui/overlays/BillboardOverlay.h b/interface/src/ui/overlays/BillboardOverlay.h index 473e8a066f..0037d1a4f7 100644 --- a/interface/src/ui/overlays/BillboardOverlay.h +++ b/interface/src/ui/overlays/BillboardOverlay.h @@ -27,12 +27,11 @@ public: virtual void setProperties(const QScriptValue& properties); private slots: - void replyFinished(QNetworkReply* reply); + void replyFinished(); private: void setBillboardURL(const QUrl url); - QNetworkAccessManager* _manager; QUrl _url; QByteArray _billboard; QSize _size; From 30644c750d350e860f23292cc57a728064b47145 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:46:23 -0700 Subject: [PATCH 06/22] Switched AvatarData to NetworkAccessManager --- libraries/avatars/src/AvatarData.cpp | 30 ++++++++++++---------------- libraries/avatars/src/AvatarData.h | 5 ----- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 94066d9a1c..3f3e71c5e8 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -16,10 +16,10 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -33,8 +33,6 @@ quint64 DEFAULT_FILTERED_LOG_EXPIRY = 2 * USECS_PER_SECOND; using namespace std; -QNetworkAccessManager* AvatarData::networkAccessManager = NULL; - AvatarData::AvatarData() : _sessionUUID(), _handPosition(0,0,0), @@ -751,18 +749,15 @@ void AvatarData::setBillboard(const QByteArray& billboard) { void AvatarData::setBillboardFromURL(const QString &billboardURL) { _billboardURL = billboardURL; - if (AvatarData::networkAccessManager) { - qDebug() << "Changing billboard for avatar to PNG at" << qPrintable(billboardURL); - - QNetworkRequest billboardRequest; - billboardRequest.setUrl(QUrl(billboardURL)); - - QNetworkReply* networkReply = AvatarData::networkAccessManager->get(billboardRequest); - connect(networkReply, SIGNAL(finished()), this, SLOT(setBillboardFromNetworkReply())); - - } else { - qDebug() << "Billboard PNG download requested but no network access manager is available."; - } + + qDebug() << "Changing billboard for avatar to PNG at" << qPrintable(billboardURL); + + QNetworkRequest billboardRequest; + billboardRequest.setUrl(QUrl(billboardURL)); + + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* networkReply = networkAccessManager.get(billboardRequest); + connect(networkReply, SIGNAL(finished()), this, SLOT(setBillboardFromNetworkReply())); } void AvatarData::setBillboardFromNetworkReply() { @@ -839,8 +834,9 @@ void AvatarData::updateJointMappings() { _jointIndices.clear(); _jointNames.clear(); - if (networkAccessManager && _skeletonModelURL.fileName().toLower().endsWith(".fst")) { - QNetworkReply* networkReply = networkAccessManager->get(QNetworkRequest(_skeletonModelURL)); + if (_skeletonModelURL.fileName().toLower().endsWith(".fst")) { + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* networkReply = networkAccessManager.get(QNetworkRequest(_skeletonModelURL)); connect(networkReply, SIGNAL(finished()), this, SLOT(setJointMappingsFromNetworkReply())); } } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 4c7136fd0a..1b8f6e6007 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -102,7 +102,6 @@ enum KeyState { const glm::vec3 vec3Zero(0.0f); class QDataStream; -class QNetworkAccessManager; class AttachmentData; class JointData; @@ -269,8 +268,6 @@ public: QElapsedTimer& getLastUpdateTimer() { return _lastUpdateTimer; } virtual float getBoundingRadius() const { return 1.f; } - - static void setNetworkAccessManager(QNetworkAccessManager* sharedAccessManager) { networkAccessManager = sharedAccessManager; } public slots: void sendIdentityPacket(); @@ -323,8 +320,6 @@ protected: QHash _jointIndices; ///< 1-based, since zero is returned for missing keys QStringList _jointNames; ///< in order of depth-first traversal - - static QNetworkAccessManager* networkAccessManager; quint64 _errorLogExpiry; ///< time in future when to log an error From 7c3292a41b480fd7ded2cb4943bc8e897c1e6f86 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 1 Jul 2014 17:47:31 -0700 Subject: [PATCH 07/22] Switched AccountManager to NetworkAccessManager --- libraries/networking/src/AccountManager.cpp | 27 ++++++++------------- libraries/networking/src/AccountManager.h | 6 ++--- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 918261a953..82487ae1c0 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -49,7 +49,6 @@ JSONCallbackParameters::JSONCallbackParameters() : AccountManager::AccountManager() : _authURL(), - _networkAccessManager(NULL), _pendingCallbackMap(), _accountInfo() { @@ -153,9 +152,7 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager:: const JSONCallbackParameters& callbackParams, const QByteArray& dataByteArray, QHttpMultiPart* dataMultiPart) { - if (!_networkAccessManager) { - _networkAccessManager = new QNetworkAccessManager(this); - } + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); if (hasValidAccessToken()) { QNetworkRequest authenticatedRequest; @@ -184,23 +181,23 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager:: switch (operation) { case QNetworkAccessManager::GetOperation: - networkReply = _networkAccessManager->get(authenticatedRequest); + networkReply = networkAccessManager.get(authenticatedRequest); break; case QNetworkAccessManager::PostOperation: case QNetworkAccessManager::PutOperation: if (dataMultiPart) { if (operation == QNetworkAccessManager::PostOperation) { - networkReply = _networkAccessManager->post(authenticatedRequest, dataMultiPart); + networkReply = networkAccessManager.post(authenticatedRequest, dataMultiPart); } else { - networkReply = _networkAccessManager->put(authenticatedRequest, dataMultiPart); + networkReply = networkAccessManager.put(authenticatedRequest, dataMultiPart); } dataMultiPart->setParent(networkReply); } else { authenticatedRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); if (operation == QNetworkAccessManager::PostOperation) { - networkReply = _networkAccessManager->post(authenticatedRequest, dataByteArray); + networkReply = networkAccessManager.post(authenticatedRequest, dataByteArray); } else { - networkReply = _networkAccessManager->put(authenticatedRequest, dataByteArray); + networkReply = networkAccessManager.put(authenticatedRequest, dataByteArray); } } @@ -304,9 +301,7 @@ bool AccountManager::checkAndSignalForAccessToken() { void AccountManager::requestAccessToken(const QString& login, const QString& password) { - if (!_networkAccessManager) { - _networkAccessManager = new QNetworkAccessManager(this); - } + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request; @@ -324,7 +319,7 @@ void AccountManager::requestAccessToken(const QString& login, const QString& pas request.setUrl(grantURL); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); - QNetworkReply* requestReply = _networkAccessManager->post(request, postData); + QNetworkReply* requestReply = networkAccessManager.post(request, postData); connect(requestReply, &QNetworkReply::finished, this, &AccountManager::requestAccessTokenFinished); connect(requestReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestAccessTokenError(QNetworkReply::NetworkError))); } @@ -376,15 +371,13 @@ void AccountManager::requestAccessTokenError(QNetworkReply::NetworkError error) } void AccountManager::requestProfile() { - if (!_networkAccessManager) { - _networkAccessManager = new QNetworkAccessManager(this); - } + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QUrl profileURL = _authURL; profileURL.setPath("/api/v1/users/profile"); profileURL.setQuery("access_token=" + _accountInfo.getAccessToken().token); - QNetworkReply* profileReply = _networkAccessManager->get(QNetworkRequest(profileURL)); + QNetworkReply* profileReply = networkAccessManager.get(QNetworkRequest(profileURL)); connect(profileReply, &QNetworkReply::finished, this, &AccountManager::requestProfileFinished); connect(profileReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestProfileError(QNetworkReply::NetworkError))); } diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index c18836ca54..9ac67ee664 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -15,9 +15,10 @@ #include #include #include -#include #include +#include "NetworkAccessManager.h" + #include "DataServerAccountInfo.h" class JSONCallbackParameters { @@ -58,8 +59,6 @@ public: const DataServerAccountInfo& getAccountInfo() const { return _accountInfo; } - void destroy() { delete _networkAccessManager; } - public slots: void requestAccessTokenFinished(); void requestProfileFinished(); @@ -93,7 +92,6 @@ private: QHttpMultiPart* dataMultiPart); QUrl _authURL; - QNetworkAccessManager* _networkAccessManager; QMap _pendingCallbackMap; DataServerAccountInfo _accountInfo; From 36fb530594e679593310c97ed20748d5336fd519 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 10:26:38 -0700 Subject: [PATCH 08/22] Switched DomainServer to NetworkAccessManager --- assignment-client/src/octree/OctreeServer.cpp | 1 - domain-server/src/DomainServer.cpp | 6 ++---- domain-server/src/DomainServer.h | 2 -- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 23719b86cf..551bed795d 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -10,7 +10,6 @@ // #include -#include #include #include diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 7a2d5f4f99..366a5016f9 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -51,8 +51,6 @@ DomainServer::DomainServer(int argc, char* argv[]) : _argumentVariantMap = HifiConfigVariantMap::mergeCLParametersWithJSONConfig(arguments()); - _networkAccessManager = new QNetworkAccessManager(this); - if (optionallyReadX509KeyAndCertificate() && optionallySetupOAuth() && optionallySetupAssignmentPayment()) { // we either read a certificate and private key or were not passed one // and completed login or did not need to @@ -1196,7 +1194,7 @@ bool DomainServer::handleHTTPSRequest(HTTPSConnection* connection, const QUrl &u QNetworkRequest tokenRequest(tokenRequestUrl); tokenRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); - QNetworkReply* tokenReply = _networkAccessManager->post(tokenRequest, tokenPostBody.toLocal8Bit()); + QNetworkReply* tokenReply = NetworkAccessManager::getInstance().post(tokenRequest, tokenPostBody.toLocal8Bit()); qDebug() << "Requesting a token for user with session UUID" << uuidStringWithoutCurlyBraces(stateUUID); @@ -1233,7 +1231,7 @@ void DomainServer::handleTokenRequestFinished() { profileURL.setPath("/api/v1/users/profile"); profileURL.setQuery(QString("%1=%2").arg(OAUTH_JSON_ACCESS_TOKEN_KEY, accessToken)); - QNetworkReply* profileReply = _networkAccessManager->get(QNetworkRequest(profileURL)); + QNetworkReply* profileReply = NetworkAccessManager::getInstance().get(QNetworkRequest(profileURL)); qDebug() << "Requesting access token for user with session UUID" << uuidStringWithoutCurlyBraces(matchingSessionUUID); diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 01f44b698e..cc44bd95a8 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -103,8 +103,6 @@ private: bool _isUsingDTLS; - QNetworkAccessManager* _networkAccessManager; - QUrl _oauthProviderURL; QString _oauthClientID; QString _oauthClientSecret; From 6489151578b34b8101e778cc5f533ee67a82b8ed Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 10:28:26 -0700 Subject: [PATCH 09/22] Switch ImageOverlay to NetworkAccessManager --- interface/src/ui/overlays/ImageOverlay.cpp | 16 ++++++---------- interface/src/ui/overlays/ImageOverlay.h | 5 ++--- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index 79b1b23de5..aeea781eb6 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -19,7 +19,6 @@ #include "ImageOverlay.h" ImageOverlay::ImageOverlay() : - _manager(NULL), _textureID(0), _renderImage(false), _textureBound(false), @@ -36,21 +35,18 @@ ImageOverlay::~ImageOverlay() { // TODO: handle setting image multiple times, how do we manage releasing the bound texture? void ImageOverlay::setImageURL(const QUrl& url) { - // TODO: are we creating too many QNetworkAccessManager() when multiple calls to setImageURL are made? - _manager->deleteLater(); - _manager = new QNetworkAccessManager(); - connect(_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); - _manager->get(QNetworkRequest(url)); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + connect(reply, &QNetworkReply::finished, this, &ImageOverlay::replyFinished); } -void ImageOverlay::replyFinished(QNetworkReply* reply) { - +void ImageOverlay::replyFinished() { + QNetworkReply* reply = static_cast(sender()); + // replace our byte array with the downloaded data QByteArray rawData = reply->readAll(); _textureImage.loadFromData(rawData); _renderImage = true; - _manager->deleteLater(); - _manager = NULL; } void ImageOverlay::render() { diff --git a/interface/src/ui/overlays/ImageOverlay.h b/interface/src/ui/overlays/ImageOverlay.h index 613cd95989..633567287d 100644 --- a/interface/src/ui/overlays/ImageOverlay.h +++ b/interface/src/ui/overlays/ImageOverlay.h @@ -16,13 +16,13 @@ #include #include -#include #include #include #include #include #include +#include #include #include "Overlay.h" @@ -46,13 +46,12 @@ public: virtual void setProperties(const QScriptValue& properties); private slots: - void replyFinished(QNetworkReply* reply); // we actually want to hide this... + void replyFinished(); // we actually want to hide this... private: QUrl _imageURL; QImage _textureImage; - QNetworkAccessManager* _manager; GLuint _textureID; QRect _fromImage; // where from in the image to sample From f6221abb71711b7913022fcb09c54425fd2abacb Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 10:52:08 -0700 Subject: [PATCH 10/22] Switch ModelUploader to NetworkAccessManager --- interface/src/ModelUploader.cpp | 2 +- interface/src/ModelUploader.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index 81bca0fc5a..12a4b145cc 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -396,7 +396,7 @@ void ModelUploader::uploadFailed(QNetworkReply::NetworkError errorCode, const QS void ModelUploader::checkS3() { qDebug() << "Checking S3 for " << _url; QNetworkRequest request(_url); - QNetworkReply* reply = _networkAccessManager.head(request); + QNetworkReply* reply = NetworkAccessManager::getInstance().head(request); connect(reply, SIGNAL(finished()), SLOT(processCheck())); } diff --git a/interface/src/ModelUploader.h b/interface/src/ModelUploader.h index 634de05640..2596120751 100644 --- a/interface/src/ModelUploader.h +++ b/interface/src/ModelUploader.h @@ -58,7 +58,6 @@ private: bool _readyToSend; QHttpMultiPart* _dataMultiPart; - QNetworkAccessManager _networkAccessManager; int _numberOfChecks; QTimer _timer; From da0021cc8e566a0fe71a567a845e1ed799694e7f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 10:53:30 -0700 Subject: [PATCH 11/22] Switch ModelsBrowser to NetworkAccessManager --- interface/src/ui/ModelsBrowser.cpp | 18 ++++++++++-------- interface/src/ui/ModelsBrowser.h | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/interface/src/ui/ModelsBrowser.cpp b/interface/src/ui/ModelsBrowser.cpp index 203c54d97a..ec583a14f7 100644 --- a/interface/src/ui/ModelsBrowser.cpp +++ b/interface/src/ui/ModelsBrowser.cpp @@ -14,10 +14,11 @@ #include #include #include -#include #include #include +#include + #include "Application.h" #include "ModelsBrowser.h" @@ -210,10 +211,10 @@ void ModelHandler::update() { } for (int i = 0; i < _model.rowCount(); ++i) { QUrl url(_model.item(i,0)->data(Qt::UserRole).toString()); - QNetworkAccessManager* accessManager = new QNetworkAccessManager(this); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); - accessManager->head(request); - connect(accessManager, SIGNAL(finished(QNetworkReply*)), SLOT(downloadFinished(QNetworkReply*))); + QNetworkReply* reply = networkAccessManager.head(request); + connect(reply, SIGNAL(finished()), SLOT(processCheck())); } _lock.unlock(); } @@ -233,7 +234,8 @@ void ModelHandler::exit() { _lock.unlock(); } -void ModelHandler::downloadFinished(QNetworkReply* reply) { +void ModelHandler::downloadFinished() { + QNetworkReply* reply = static_cast(sender()); QByteArray data = reply->readAll(); if (!data.isEmpty()) { @@ -261,10 +263,10 @@ void ModelHandler::queryNewFiles(QString marker) { // Download url.setQuery(query); - QNetworkAccessManager* accessManager = new QNetworkAccessManager(this); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); - accessManager->get(request); - connect(accessManager, SIGNAL(finished(QNetworkReply*)), SLOT(downloadFinished(QNetworkReply*))); + QNetworkReply* reply = networkAccessManager.get(request); + connect(reply, SIGNAL(finished()), SLOT(processCheck())); } diff --git a/interface/src/ui/ModelsBrowser.h b/interface/src/ui/ModelsBrowser.h index 3e832c9dbe..8063fd8eeb 100644 --- a/interface/src/ui/ModelsBrowser.h +++ b/interface/src/ui/ModelsBrowser.h @@ -43,7 +43,7 @@ public slots: void exit(); private slots: - void downloadFinished(QNetworkReply* reply); + void downloadFinished(); private: bool _initiateExit; From 15b37ec3d1181542fb3c47e4a0efd146ab2cbf79 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:21:07 -0700 Subject: [PATCH 12/22] Switched ResourceCache to NetworkAccessManager --- libraries/{shared => networking}/src/ResourceCache.cpp | 8 ++++---- libraries/{shared => networking}/src/ResourceCache.h | 6 ------ 2 files changed, 4 insertions(+), 10 deletions(-) rename libraries/{shared => networking}/src/ResourceCache.cpp (97%) rename libraries/{shared => networking}/src/ResourceCache.h (94%) diff --git a/libraries/shared/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp similarity index 97% rename from libraries/shared/src/ResourceCache.cpp rename to libraries/networking/src/ResourceCache.cpp index 14998232d6..a183e2f9a1 100644 --- a/libraries/shared/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -16,6 +16,8 @@ #include #include +#include "NetworkAccessManager.h" + #include "ResourceCache.h" ResourceCache::ResourceCache(QObject* parent) : @@ -103,8 +105,6 @@ void ResourceCache::requestCompleted(Resource* resource) { } } -QNetworkAccessManager* ResourceCache::_networkAccessManager = NULL; - const int DEFAULT_REQUEST_LIMIT = 10; int ResourceCache::_requestLimit = DEFAULT_REQUEST_LIMIT; @@ -219,7 +219,7 @@ void Resource::init() { if (_url.isEmpty()) { _startedLoading = _loaded = true; - } else if (!(_url.isValid() && ResourceCache::getNetworkAccessManager())) { + } else if (!(_url.isValid())) { _startedLoading = _failedToLoad = true; } } @@ -272,7 +272,7 @@ void Resource::handleReplyTimeout() { } void Resource::makeRequest() { - _reply = ResourceCache::getNetworkAccessManager()->get(_request); + _reply = NetworkAccessManager::getInstance().get(_request); connect(_reply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(handleDownloadProgress(qint64,qint64))); connect(_reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(handleReplyError())); diff --git a/libraries/shared/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h similarity index 94% rename from libraries/shared/src/ResourceCache.h rename to libraries/networking/src/ResourceCache.h index 2404485c46..1593ad45fc 100644 --- a/libraries/shared/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -22,7 +22,6 @@ #include #include -class QNetworkAccessManager; class QNetworkReply; class QTimer; @@ -33,10 +32,6 @@ class ResourceCache : public QObject { Q_OBJECT public: - - static void setNetworkAccessManager(QNetworkAccessManager* manager) { _networkAccessManager = manager; } - static QNetworkAccessManager* getNetworkAccessManager() { return _networkAccessManager; } - static void setRequestLimit(int limit) { _requestLimit = limit; } static int getRequestLimit() { return _requestLimit; } @@ -76,7 +71,6 @@ private: QHash > _resources; int _lastLRUKey; - static QNetworkAccessManager* _networkAccessManager; static int _requestLimit; static QList > _pendingRequests; static QList _loadingRequests; From 602015be661bf21e950248a8338840cd91cfa493 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:21:26 -0700 Subject: [PATCH 13/22] Switched ScriptModel to NetworkAccessManager --- interface/src/ScriptsModel.cpp | 16 +++++++++------- interface/src/ScriptsModel.h | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/interface/src/ScriptsModel.cpp b/interface/src/ScriptsModel.cpp index f9ed94f3fa..77a9619d43 100644 --- a/interface/src/ScriptsModel.cpp +++ b/interface/src/ScriptsModel.cpp @@ -11,14 +11,15 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include #include #include #include -#include "ScriptsModel.h" +#include + #include "Menu.h" +#include "ScriptsModel.h" static const QString S3_URL = "http://highfidelity-public.s3-us-west-1.amazonaws.com"; static const QString PUBLIC_URL = "http://public.highfidelity.io"; @@ -113,14 +114,15 @@ void ScriptsModel::requestRemoteFiles(QString marker) { } url.setQuery(query); - QNetworkAccessManager* accessManager = new QNetworkAccessManager(this); - connect(accessManager, SIGNAL(finished(QNetworkReply*)), SLOT(downloadFinished(QNetworkReply*))); - + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); - accessManager->get(request); + QNetworkReply* reply = networkAccessManager.get(request); + connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); + } -void ScriptsModel::downloadFinished(QNetworkReply* reply) { +void ScriptsModel::downloadFinished() { + QNetworkReply* reply = static_cast(sender()); bool finished = true; if (reply->error() == QNetworkReply::NoError) { diff --git a/interface/src/ScriptsModel.h b/interface/src/ScriptsModel.h index 250c7eb9a8..ca72a8d8f4 100644 --- a/interface/src/ScriptsModel.h +++ b/interface/src/ScriptsModel.h @@ -43,7 +43,7 @@ public: protected slots: void updateScriptsLocation(const QString& newPath); - void downloadFinished(QNetworkReply* reply); + void downloadFinished(); void reloadLocalFiles(); void reloadRemoteFiles(); From 9bcd4e7ac85d720a6eda839131e1c257675d5b17 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:21:54 -0700 Subject: [PATCH 14/22] Switched ScriptEditorWidget to NetworkAccessManager --- interface/src/ui/ScriptEditorWidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 513bbd899a..d25408e568 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -148,8 +148,8 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { disconnect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); } } else { - QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); - QNetworkReply* reply = networkManager->get(QNetworkRequest(url)); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); qDebug() << "Downloading included script at" << scriptPath; QEventLoop loop; QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); From 14a2bbb454aff65eb09cec82ff27bbc2f9470387 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:22:29 -0700 Subject: [PATCH 15/22] Switched SnapshotShareDialog to NetworkAccessManager --- interface/src/ui/SnapshotShareDialog.cpp | 18 +++--------------- interface/src/ui/SnapshotShareDialog.h | 2 -- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 617d5e7101..046aa4d12c 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -40,8 +40,7 @@ Q_DECLARE_METATYPE(QNetworkAccessManager::Operation) SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : QDialog(parent), - _fileName(fileName), - _networkAccessManager(NULL) + _fileName(fileName) { setAttribute(Qt::WA_DeleteOnClose); @@ -92,10 +91,6 @@ void SnapshotShareDialog::uploadSnapshot() { return; } - if (!_networkAccessManager) { - _networkAccessManager = new QNetworkAccessManager(this); - } - QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpPart apiKeyPart; @@ -118,9 +113,7 @@ void SnapshotShareDialog::uploadSnapshot() { QUrl url(FORUM_UPLOADS_URL); QNetworkRequest request(url); - QNetworkReply* reply = _networkAccessManager->post(request, multiPart); - - + QNetworkReply* reply = NetworkAccessManager::getInstance().post(request, multiPart); connect(reply, &QNetworkReply::finished, this, &SnapshotShareDialog::uploadRequestFinished); QEventLoop loop; @@ -129,11 +122,6 @@ void SnapshotShareDialog::uploadSnapshot() { } void SnapshotShareDialog::sendForumPost(QString snapshotPath) { - - if (!_networkAccessManager) { - _networkAccessManager = new QNetworkAccessManager(this); - } - // post to Discourse forum QNetworkRequest request; QUrl forumUrl(FORUM_POST_URL); @@ -148,7 +136,7 @@ void SnapshotShareDialog::sendForumPost(QString snapshotPath) { request.setUrl(forumUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); - QNetworkReply* requestReply = _networkAccessManager->post(request, postData); + QNetworkReply* requestReply = NetworkAccessManager::getInstance().post(request, postData); connect(requestReply, &QNetworkReply::finished, this, &SnapshotShareDialog::postRequestFinished); QEventLoop loop; diff --git a/interface/src/ui/SnapshotShareDialog.h b/interface/src/ui/SnapshotShareDialog.h index a8795d578a..ced9f2d951 100644 --- a/interface/src/ui/SnapshotShareDialog.h +++ b/interface/src/ui/SnapshotShareDialog.h @@ -14,7 +14,6 @@ #include "ui_shareSnapshot.h" -#include #include #include @@ -26,7 +25,6 @@ public: private: QString _fileName; - QNetworkAccessManager* _networkAccessManager; Ui_SnapshotShareDialog _ui; void uploadSnapshot(); From 2549b0d9465a63718cb26cc1d722c4ab28e2bb09 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:22:44 -0700 Subject: [PATCH 16/22] Switched ScriptEngine to NetworkAccessManager --- libraries/script-engine/src/ScriptEngine.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 55b99d6039..daf66dafbe 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -23,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -141,8 +141,8 @@ ScriptEngine::ScriptEngine(const QUrl& scriptURL, emit errorMessage("ERROR Loading file:" + fileName); } } else { - QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); - QNetworkReply* reply = networkManager->get(QNetworkRequest(url)); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); qDebug() << "Downloading included script at" << url; QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); @@ -646,8 +646,8 @@ void ScriptEngine::include(const QString& includeFile) { QString includeContents; if (url.scheme() == "http" || url.scheme() == "ftp") { - QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); - QNetworkReply* reply = networkManager->get(QNetworkRequest(url)); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); qDebug() << "Downloading included script at" << includeFile; QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); From 74e7e0a7bf778b84f2c6be2ee776994e71a428fb Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:27:32 -0700 Subject: [PATCH 17/22] Switched XMLHttpRequestClass to NetworkAccessManager --- libraries/script-engine/src/XMLHttpRequestClass.cpp | 5 +++-- libraries/script-engine/src/XMLHttpRequestClass.h | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/libraries/script-engine/src/XMLHttpRequestClass.cpp b/libraries/script-engine/src/XMLHttpRequestClass.cpp index a81f8950fa..d9b7312bf4 100644 --- a/libraries/script-engine/src/XMLHttpRequestClass.cpp +++ b/libraries/script-engine/src/XMLHttpRequestClass.cpp @@ -14,6 +14,8 @@ #include +#include + #include "XMLHttpRequestClass.h" XMLHttpRequestClass::XMLHttpRequestClass(QScriptEngine* engine) : @@ -22,7 +24,6 @@ XMLHttpRequestClass::XMLHttpRequestClass(QScriptEngine* engine) : _url(), _method(""), _responseType(""), - _manager(this), _request(), _reply(NULL), _sendData(NULL), @@ -161,7 +162,7 @@ void XMLHttpRequestClass::send(const QString& data) { } void XMLHttpRequestClass::doSend() { - _reply = _manager.sendCustomRequest(_request, _method.toLatin1(), _sendData); + _reply = NetworkAccessManager::getInstance().sendCustomRequest(_request, _method.toLatin1(), _sendData); connectToReply(_reply); diff --git a/libraries/script-engine/src/XMLHttpRequestClass.h b/libraries/script-engine/src/XMLHttpRequestClass.h index 49a952e638..48f1a596e1 100644 --- a/libraries/script-engine/src/XMLHttpRequestClass.h +++ b/libraries/script-engine/src/XMLHttpRequestClass.h @@ -13,7 +13,6 @@ #define hifi_XMLHttpRequestClass_h #include -#include #include #include #include @@ -104,7 +103,6 @@ private: QUrl _url; QString _method; QString _responseType; - QNetworkAccessManager _manager; QNetworkRequest _request; QNetworkReply* _reply; QBuffer* _sendData; From 598c1cb516166cc3a2680d9cad87993804aae7bc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 11:27:55 -0700 Subject: [PATCH 18/22] Switched Sound to NetworkAccessManager --- interface/src/ui/overlays/TextOverlay.h | 1 - libraries/audio/src/Sound.cpp | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/overlays/TextOverlay.h b/interface/src/ui/overlays/TextOverlay.h index 78a037762e..c2aafb24e8 100644 --- a/interface/src/ui/overlays/TextOverlay.h +++ b/interface/src/ui/overlays/TextOverlay.h @@ -16,7 +16,6 @@ #include #include -#include #include #include #include diff --git a/libraries/audio/src/Sound.cpp b/libraries/audio/src/Sound.cpp index 7ef3afdf29..03c9f6b8ee 100644 --- a/libraries/audio/src/Sound.cpp +++ b/libraries/audio/src/Sound.cpp @@ -15,12 +15,12 @@ #include #include -#include #include #include #include #include +#include #include #include "AudioRingBuffer.h" @@ -73,11 +73,11 @@ Sound::Sound(const QUrl& sampleURL, QObject* parent) : // assume we have a QApplication or QCoreApplication instance and use the // QNetworkAccess manager to grab the raw audio file at the given URL - QNetworkAccessManager *manager = new QNetworkAccessManager(this); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); qDebug() << "Requesting audio file" << sampleURL.toDisplayString(); - QNetworkReply* soundDownload = manager->get(QNetworkRequest(sampleURL)); + QNetworkReply* soundDownload = networkAccessManager.get(QNetworkRequest(sampleURL)); connect(soundDownload, &QNetworkReply::finished, this, &Sound::replyFinished); connect(soundDownload, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(replyError(QNetworkReply::NetworkError))); } From bf520d0effdffcfb0456d033f66d666bba09b704 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 14:05:46 -0700 Subject: [PATCH 19/22] Added thread safe implementation of NetworkAccessManager main methods --- .../networking/src/NetworkAccessManager.cpp | 115 +++++++++++++++++- .../networking/src/NetworkAccessManager.h | 11 ++ 2 files changed, 125 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/NetworkAccessManager.cpp b/libraries/networking/src/NetworkAccessManager.cpp index a33817b50d..7c45dc69d5 100644 --- a/libraries/networking/src/NetworkAccessManager.cpp +++ b/libraries/networking/src/NetworkAccessManager.cpp @@ -9,6 +9,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include +#include + #include "NetworkAccessManager.h" NetworkAccessManager& NetworkAccessManager::getInstance() { @@ -17,4 +20,114 @@ NetworkAccessManager& NetworkAccessManager::getInstance() { } NetworkAccessManager::NetworkAccessManager() { -} \ No newline at end of file +} + +QNetworkReply* NetworkAccessManager::get(const QNetworkRequest& request) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "get", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request)); + return result; + } + return QNetworkAccessManager::get(request); +} + +QNetworkReply* NetworkAccessManager::head(const QNetworkRequest& request) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "head", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request)); + return result; + } + return QNetworkAccessManager::head(request); +} + +QNetworkReply* NetworkAccessManager::post(const QNetworkRequest& request, QIODevice* data) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "post", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(QIODevice*, data)); + return result; + } + return QNetworkAccessManager::post(request, data); +} + +QNetworkReply* NetworkAccessManager::post(const QNetworkRequest& request, const QByteArray& data) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "post", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(const QByteArray, data)); + return result; + } + return QNetworkAccessManager::post(request, data); +} + +QNetworkReply* NetworkAccessManager::post(const QNetworkRequest& request, QHttpMultiPart* multiPart) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "post", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(QHttpMultiPart*, multiPart)); + return result; + } + return QNetworkAccessManager::post(request, multiPart); +} + +QNetworkReply* NetworkAccessManager::put(const QNetworkRequest& request, QIODevice* data) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "put", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(QIODevice*, data)); + return result; + } + return QNetworkAccessManager::put(request, data); +} + +QNetworkReply* NetworkAccessManager::put(const QNetworkRequest& request, QHttpMultiPart* multiPart) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "put", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(QHttpMultiPart*, multiPart)); + return result; + } + return QNetworkAccessManager::put(request, multiPart); +} + +QNetworkReply* NetworkAccessManager::put(const QNetworkRequest & request, const QByteArray & data) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "put", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(const QByteArray, data)); + return result; + } + return QNetworkAccessManager::put(request, data); +} diff --git a/libraries/networking/src/NetworkAccessManager.h b/libraries/networking/src/NetworkAccessManager.h index c7cc74340a..b1df269022 100644 --- a/libraries/networking/src/NetworkAccessManager.h +++ b/libraries/networking/src/NetworkAccessManager.h @@ -13,12 +13,23 @@ #define hifi_NetworkAccessManager_h #include +#include +#include +/// Wrapper around QNetworkAccessManager wo that we only use one instance class NetworkAccessManager : public QNetworkAccessManager { Q_OBJECT public: static NetworkAccessManager& getInstance(); + Q_INVOKABLE QNetworkReply* get(const QNetworkRequest& request); + Q_INVOKABLE QNetworkReply* head(const QNetworkRequest& request); + Q_INVOKABLE QNetworkReply* post(const QNetworkRequest& request, QIODevice* data); + Q_INVOKABLE QNetworkReply* post(const QNetworkRequest& request, const QByteArray& data); + Q_INVOKABLE QNetworkReply* post(const QNetworkRequest& request, QHttpMultiPart* multiPart); + Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, QIODevice* data); + Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, QHttpMultiPart* multiPart); + Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, const QByteArray& data); private: NetworkAccessManager(); From 84ea9833bb899d2439ea26796b454ef22c53c217 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 14:30:40 -0700 Subject: [PATCH 20/22] Added forgotten sendCustomRequest Method + comments --- .../networking/src/NetworkAccessManager.cpp | 16 ++++++++++++++++ libraries/networking/src/NetworkAccessManager.h | 3 +++ 2 files changed, 19 insertions(+) diff --git a/libraries/networking/src/NetworkAccessManager.cpp b/libraries/networking/src/NetworkAccessManager.cpp index 7c45dc69d5..b9eda27947 100644 --- a/libraries/networking/src/NetworkAccessManager.cpp +++ b/libraries/networking/src/NetworkAccessManager.cpp @@ -131,3 +131,19 @@ QNetworkReply* NetworkAccessManager::put(const QNetworkRequest & request, const } return QNetworkAccessManager::put(request, data); } + + +QNetworkReply* NetworkAccessManager::sendCustomRequest(const QNetworkRequest& request, const QByteArray& verb, QIODevice* data) { + if (QThread::currentThread() != thread()) { + QNetworkReply* result; + QMetaObject::invokeMethod(this, + "sendCustomRequest", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QNetworkReply*, result), + Q_ARG(const QNetworkRequest, request), + Q_ARG(const QByteArray, verb), + Q_ARG(QIODevice*, data)); + return result; + } + return QNetworkAccessManager::sendCustomRequest(request, verb, data); +} \ No newline at end of file diff --git a/libraries/networking/src/NetworkAccessManager.h b/libraries/networking/src/NetworkAccessManager.h index b1df269022..ba97f12552 100644 --- a/libraries/networking/src/NetworkAccessManager.h +++ b/libraries/networking/src/NetworkAccessManager.h @@ -17,6 +17,8 @@ #include /// Wrapper around QNetworkAccessManager wo that we only use one instance +/// For any other method you should need, make sure to be on the right thread +/// or call the method using QMetaObject::invokeMethod() class NetworkAccessManager : public QNetworkAccessManager { Q_OBJECT public: @@ -30,6 +32,7 @@ public: Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, QIODevice* data); Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, QHttpMultiPart* multiPart); Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, const QByteArray& data); + Q_INVOKABLE QNetworkReply* sendCustomRequest(const QNetworkRequest& request, const QByteArray& verb, QIODevice* data = 0); private: NetworkAccessManager(); From 1ac38c9884ee83fc3a05b272d70158c8e7e63f1d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 14:31:19 -0700 Subject: [PATCH 21/22] Switched call to setCache to invokeMethod --- assignment-client/src/Agent.cpp | 10 ++++++---- interface/src/Application.cpp | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 1805a414b5..fcd983873d 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -208,12 +208,14 @@ void Agent::run() { scriptURL = QUrl(_payload); } - NetworkAccessManager& networkManager = NetworkAccessManager::getInstance(); - QNetworkReply *reply = networkManager.get(QNetworkRequest(scriptURL)); - QNetworkDiskCache* cache = new QNetworkDiskCache(&networkManager); + NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); + QNetworkReply *reply = networkAccessManager.get(QNetworkRequest(scriptURL)); + QNetworkDiskCache* cache = new QNetworkDiskCache(&networkAccessManager); QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "agentCache"); - networkManager.setCache(cache); + QMetaObject::invokeMethod(&networkAccessManager, "setCache", + Qt::BlockingQueuedConnection, + Q_ARG(QAbstractNetworkCache*, cache)); qDebug() << "Downloading script at" << scriptURL.toString(); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 10b6fc8165..7193a06125 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -317,7 +317,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkDiskCache* cache = new QNetworkDiskCache(&networkAccessManager); cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "interfaceCache"); - networkAccessManager.setCache(cache); + QMetaObject::invokeMethod(&networkAccessManager, "setCache", + Qt::BlockingQueuedConnection, + Q_ARG(QAbstractNetworkCache*, cache)); ResourceCache::setRequestLimit(3); From 1815472c6b99698a5bda5a47916ec3f723d81224 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 2 Jul 2014 16:12:39 -0700 Subject: [PATCH 22/22] Modified recently added case to AccountManager --- libraries/networking/src/AccountManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 7cae1991a9..563d735790 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -205,7 +205,7 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager:: break; case QNetworkAccessManager::DeleteOperation: - networkReply = _networkAccessManager->sendCustomRequest(authenticatedRequest, "DELETE"); + networkReply = networkAccessManager.sendCustomRequest(authenticatedRequest, "DELETE"); break; default: // other methods not yet handled