Merge pull request #3112 from Atlante45/replace_qnetworkaccessmanager

Replace QNetworkAccessManager by Wrapper
This commit is contained in:
Brad Hefta-Gaub 2014-07-02 21:41:08 -07:00
commit da87ac4105
33 changed files with 295 additions and 164 deletions

View file

@ -13,13 +13,13 @@
#include <QtCore/QEventLoop> #include <QtCore/QEventLoop>
#include <QtCore/QStandardPaths> #include <QtCore/QStandardPaths>
#include <QtCore/QTimer> #include <QtCore/QTimer>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkDiskCache> #include <QtNetwork/QNetworkDiskCache>
#include <QtNetwork/QNetworkRequest> #include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkReply>
#include <AudioRingBuffer.h> #include <AudioRingBuffer.h>
#include <AvatarData.h> #include <AvatarData.h>
#include <NetworkAccessManager.h>
#include <NodeList.h> #include <NodeList.h>
#include <PacketHeaders.h> #include <PacketHeaders.h>
#include <ResourceCache.h> #include <ResourceCache.h>
@ -208,12 +208,14 @@ void Agent::run() {
scriptURL = QUrl(_payload); scriptURL = QUrl(_payload);
} }
QNetworkAccessManager *networkManager = new QNetworkAccessManager(this); NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkReply *reply = networkManager->get(QNetworkRequest(scriptURL)); QNetworkReply *reply = networkAccessManager.get(QNetworkRequest(scriptURL));
QNetworkDiskCache* cache = new QNetworkDiskCache(networkManager); QNetworkDiskCache* cache = new QNetworkDiskCache(&networkAccessManager);
QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "agentCache"); 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(); qDebug() << "Downloading script at" << scriptURL.toString();
@ -222,10 +224,6 @@ void Agent::run() {
loop.exec(); loop.exec();
// let the AvatarData and ResourceCache classes use our QNetworkAccessManager
AvatarData::setNetworkAccessManager(networkManager);
ResourceCache::setNetworkAccessManager(networkManager);
QString scriptContents(reply->readAll()); QString scriptContents(reply->readAll());
qDebug() << "Downloaded script:" << scriptContents; qDebug() << "Downloaded script:" << scriptContents;

View file

@ -38,11 +38,11 @@
#include <QtCore/QJsonObject> #include <QtCore/QJsonObject>
#include <QtCore/QJsonValue> #include <QtCore/QJsonValue>
#include <QtCore/QTimer> #include <QtCore/QTimer>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest> #include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkReply>
#include <Logging.h> #include <Logging.h>
#include <NetworkAccessManager.h>
#include <NodeList.h> #include <NodeList.h>
#include <Node.h> #include <Node.h>
#include <PacketHeaders.h> #include <PacketHeaders.h>
@ -482,8 +482,8 @@ void AudioMixer::run() {
nodeList->linkedDataCreateCallback = attachNewBufferToNode; nodeList->linkedDataCreateCallback = attachNewBufferToNode;
// setup a QNetworkAccessManager to ask the domain-server for our settings // setup a NetworkAccessManager to ask the domain-server for our settings
QNetworkAccessManager *networkManager = new QNetworkAccessManager(this); NetworkAccessManager& networkManager = NetworkAccessManager::getInstance();
QUrl settingsJSONURL; QUrl settingsJSONURL;
settingsJSONURL.setScheme("http"); settingsJSONURL.setScheme("http");
@ -500,7 +500,7 @@ void AudioMixer::run() {
qDebug() << "Requesting settings for assignment from domain-server at" << settingsJSONURL.toString(); qDebug() << "Requesting settings for assignment from domain-server at" << settingsJSONURL.toString();
while (!reply || reply->error() != QNetworkReply::NoError) { while (!reply || reply->error() != QNetworkReply::NoError) {
reply = networkManager->get(QNetworkRequest(settingsJSONURL)); reply = networkManager.get(QNetworkRequest(settingsJSONURL));
QEventLoop loop; QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));

View file

@ -10,7 +10,6 @@
// //
#include <QJsonObject> #include <QJsonObject>
#include <QNetworkAccessManager>
#include <QTimer> #include <QTimer>
#include <QUuid> #include <QUuid>

View file

@ -51,8 +51,6 @@ DomainServer::DomainServer(int argc, char* argv[]) :
_argumentVariantMap = HifiConfigVariantMap::mergeCLParametersWithJSONConfig(arguments()); _argumentVariantMap = HifiConfigVariantMap::mergeCLParametersWithJSONConfig(arguments());
_networkAccessManager = new QNetworkAccessManager(this);
if (optionallyReadX509KeyAndCertificate() && optionallySetupOAuth() && optionallySetupAssignmentPayment()) { if (optionallyReadX509KeyAndCertificate() && optionallySetupOAuth() && optionallySetupAssignmentPayment()) {
// we either read a certificate and private key or were not passed one // we either read a certificate and private key or were not passed one
// and completed login or did not need to // and completed login or did not need to
@ -1196,7 +1194,7 @@ bool DomainServer::handleHTTPSRequest(HTTPSConnection* connection, const QUrl &u
QNetworkRequest tokenRequest(tokenRequestUrl); QNetworkRequest tokenRequest(tokenRequestUrl);
tokenRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); 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); 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.setPath("/api/v1/users/profile");
profileURL.setQuery(QString("%1=%2").arg(OAUTH_JSON_ACCESS_TOKEN_KEY, accessToken)); 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); qDebug() << "Requesting access token for user with session UUID" << uuidStringWithoutCurlyBraces(matchingSessionUUID);

View file

@ -103,8 +103,6 @@ private:
bool _isUsingDTLS; bool _isUsingDTLS;
QNetworkAccessManager* _networkAccessManager;
QUrl _oauthProviderURL; QUrl _oauthProviderURL;
QString _oauthClientID; QString _oauthClientID;
QString _oauthClientSecret; QString _oauthClientSecret;

View file

@ -32,7 +32,6 @@
#include <QKeyEvent> #include <QKeyEvent>
#include <QMenuBar> #include <QMenuBar>
#include <QMouseEvent> #include <QMouseEvent>
#include <QNetworkAccessManager>
#include <QNetworkReply> #include <QNetworkReply>
#include <QNetworkDiskCache> #include <QNetworkDiskCache>
#include <QOpenGLFramebufferObject> #include <QOpenGLFramebufferObject>
@ -53,17 +52,18 @@
#include <AccountManager.h> #include <AccountManager.h>
#include <AudioInjector.h> #include <AudioInjector.h>
#include <LocalVoxelsList.h>
#include <Logging.h> #include <Logging.h>
#include <ModelsScriptingInterface.h> #include <ModelsScriptingInterface.h>
#include <NetworkAccessManager.h>
#include <OctalCode.h> #include <OctalCode.h>
#include <OctreeSceneStats.h>
#include <PacketHeaders.h> #include <PacketHeaders.h>
#include <ParticlesScriptingInterface.h> #include <ParticlesScriptingInterface.h>
#include <PerfStat.h> #include <PerfStat.h>
#include <ResourceCache.h> #include <ResourceCache.h>
#include <UserActivityLogger.h> #include <UserActivityLogger.h>
#include <UUID.h> #include <UUID.h>
#include <OctreeSceneStats.h>
#include <LocalVoxelsList.h>
#include "Application.h" #include "Application.h"
#include "InterfaceVersion.h" #include "InterfaceVersion.h"
@ -314,12 +314,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) :
QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
_networkAccessManager = new QNetworkAccessManager(this); NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkDiskCache* cache = new QNetworkDiskCache(_networkAccessManager); QNetworkDiskCache* cache = new QNetworkDiskCache(&networkAccessManager);
cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "interfaceCache"); cache->setCacheDirectory(!cachePath.isEmpty() ? cachePath : "interfaceCache");
_networkAccessManager->setCache(cache); QMetaObject::invokeMethod(&networkAccessManager, "setCache",
Qt::BlockingQueuedConnection,
Q_ARG(QAbstractNetworkCache*, cache));
ResourceCache::setNetworkAccessManager(_networkAccessManager);
ResourceCache::setRequestLimit(3); ResourceCache::setRequestLimit(3);
_window->setCentralWidget(_glWidget); _window->setCentralWidget(_glWidget);
@ -441,8 +442,6 @@ Application::~Application() {
_myAvatar = NULL; _myAvatar = NULL;
delete _glWidget; delete _glWidget;
AccountManager::getInstance().destroy();
} }
void Application::saveSettings() { void Application::saveSettings() {
@ -3802,7 +3801,8 @@ void Application::initAvatarAndViewFrustum() {
void Application::checkVersion() { void Application::checkVersion() {
QNetworkRequest latestVersionRequest((QUrl(CHECK_VERSION_URL))); QNetworkRequest latestVersionRequest((QUrl(CHECK_VERSION_URL)));
latestVersionRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); 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() { void Application::parseVersionXml() {

View file

@ -97,7 +97,6 @@ class QActionGroup;
class QGLWidget; class QGLWidget;
class QKeyEvent; class QKeyEvent;
class QMouseEvent; class QMouseEvent;
class QNetworkAccessManager;
class QSettings; class QSettings;
class QWheelEvent; class QWheelEvent;
@ -236,7 +235,6 @@ public:
void lockOctreeSceneStats() { _octreeSceneStatsLock.lockForRead(); } void lockOctreeSceneStats() { _octreeSceneStatsLock.lockForRead(); }
void unlockOctreeSceneStats() { _octreeSceneStatsLock.unlock(); } void unlockOctreeSceneStats() { _octreeSceneStatsLock.unlock(); }
QNetworkAccessManager* getNetworkAccessManager() { return _networkAccessManager; }
GeometryCache* getGeometryCache() { return &_geometryCache; } GeometryCache* getGeometryCache() { return &_geometryCache; }
AnimationCache* getAnimationCache() { return &_animationCache; } AnimationCache* getAnimationCache() { return &_animationCache; }
TextureCache* getTextureCache() { return &_textureCache; } TextureCache* getTextureCache() { return &_textureCache; }
@ -423,7 +421,6 @@ private:
QThread* _nodeThread; QThread* _nodeThread;
DatagramProcessor _datagramProcessor; DatagramProcessor _datagramProcessor;
QNetworkAccessManager* _networkAccessManager;
QMutex _settingsMutex; QMutex _settingsMutex;
QSettings* _settings; QSettings* _settings;
int _numChangedSettings; int _numChangedSettings;

View file

@ -396,7 +396,7 @@ void ModelUploader::uploadFailed(QNetworkReply::NetworkError errorCode, const QS
void ModelUploader::checkS3() { void ModelUploader::checkS3() {
qDebug() << "Checking S3 for " << _url; qDebug() << "Checking S3 for " << _url;
QNetworkRequest request(_url); QNetworkRequest request(_url);
QNetworkReply* reply = _networkAccessManager.head(request); QNetworkReply* reply = NetworkAccessManager::getInstance().head(request);
connect(reply, SIGNAL(finished()), SLOT(processCheck())); connect(reply, SIGNAL(finished()), SLOT(processCheck()));
} }

View file

@ -58,7 +58,6 @@ private:
bool _readyToSend; bool _readyToSend;
QHttpMultiPart* _dataMultiPart; QHttpMultiPart* _dataMultiPart;
QNetworkAccessManager _networkAccessManager;
int _numberOfChecks; int _numberOfChecks;
QTimer _timer; QTimer _timer;

View file

@ -11,14 +11,15 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#include <QNetworkAccessManager>
#include <QUrl> #include <QUrl>
#include <QUrlQuery> #include <QUrlQuery>
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include "ScriptsModel.h" #include <NetworkAccessManager.h>
#include "Menu.h" #include "Menu.h"
#include "ScriptsModel.h"
static const QString S3_URL = "http://highfidelity-public.s3-us-west-1.amazonaws.com"; static const QString S3_URL = "http://highfidelity-public.s3-us-west-1.amazonaws.com";
static const QString PUBLIC_URL = "http://public.highfidelity.io"; static const QString PUBLIC_URL = "http://public.highfidelity.io";
@ -113,14 +114,15 @@ void ScriptsModel::requestRemoteFiles(QString marker) {
} }
url.setQuery(query); url.setQuery(query);
QNetworkAccessManager* accessManager = new QNetworkAccessManager(this); NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
connect(accessManager, SIGNAL(finished(QNetworkReply*)), SLOT(downloadFinished(QNetworkReply*)));
QNetworkRequest request(url); 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<QNetworkReply*>(sender());
bool finished = true; bool finished = true;
if (reply->error() == QNetworkReply::NoError) { if (reply->error() == QNetworkReply::NoError) {

View file

@ -43,7 +43,7 @@ public:
protected slots: protected slots:
void updateScriptsLocation(const QString& newPath); void updateScriptsLocation(const QString& newPath);
void downloadFinished(QNetworkReply* reply); void downloadFinished();
void reloadLocalFiles(); void reloadLocalFiles();
void reloadRemoteFiles(); void reloadRemoteFiles();

View file

@ -14,10 +14,11 @@
#include <QGridLayout> #include <QGridLayout>
#include <QHeaderView> #include <QHeaderView>
#include <QMessageBox> #include <QMessageBox>
#include <QNetworkAccessManager>
#include <QUrl> #include <QUrl>
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <NetworkAccessManager.h>
#include "Application.h" #include "Application.h"
#include "ModelsBrowser.h" #include "ModelsBrowser.h"
@ -210,10 +211,10 @@ void ModelHandler::update() {
} }
for (int i = 0; i < _model.rowCount(); ++i) { for (int i = 0; i < _model.rowCount(); ++i) {
QUrl url(_model.item(i,0)->data(Qt::UserRole).toString()); QUrl url(_model.item(i,0)->data(Qt::UserRole).toString());
QNetworkAccessManager* accessManager = new QNetworkAccessManager(this); NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkRequest request(url); QNetworkRequest request(url);
accessManager->head(request); QNetworkReply* reply = networkAccessManager.head(request);
connect(accessManager, SIGNAL(finished(QNetworkReply*)), SLOT(downloadFinished(QNetworkReply*))); connect(reply, SIGNAL(finished()), SLOT(processCheck()));
} }
_lock.unlock(); _lock.unlock();
} }
@ -233,7 +234,8 @@ void ModelHandler::exit() {
_lock.unlock(); _lock.unlock();
} }
void ModelHandler::downloadFinished(QNetworkReply* reply) { void ModelHandler::downloadFinished() {
QNetworkReply* reply = static_cast<QNetworkReply*>(sender());
QByteArray data = reply->readAll(); QByteArray data = reply->readAll();
if (!data.isEmpty()) { if (!data.isEmpty()) {
@ -261,10 +263,10 @@ void ModelHandler::queryNewFiles(QString marker) {
// Download // Download
url.setQuery(query); url.setQuery(query);
QNetworkAccessManager* accessManager = new QNetworkAccessManager(this); NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkRequest request(url); QNetworkRequest request(url);
accessManager->get(request); QNetworkReply* reply = networkAccessManager.get(request);
connect(accessManager, SIGNAL(finished(QNetworkReply*)), SLOT(downloadFinished(QNetworkReply*))); connect(reply, SIGNAL(finished()), SLOT(processCheck()));
} }

View file

@ -43,7 +43,7 @@ public slots:
void exit(); void exit();
private slots: private slots:
void downloadFinished(QNetworkReply* reply); void downloadFinished();
private: private:
bool _initiateExit; bool _initiateExit;

View file

@ -148,8 +148,8 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) {
disconnect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished); disconnect(_scriptEngine, &ScriptEngine::finished, this, &ScriptEditorWidget::onScriptFinished);
} }
} else { } else {
QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkReply* reply = networkManager->get(QNetworkRequest(url)); QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url));
qDebug() << "Downloading included script at" << scriptPath; qDebug() << "Downloading included script at" << scriptPath;
QEventLoop loop; QEventLoop loop;
QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);

View file

@ -40,8 +40,7 @@ Q_DECLARE_METATYPE(QNetworkAccessManager::Operation)
SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) :
QDialog(parent), QDialog(parent),
_fileName(fileName), _fileName(fileName)
_networkAccessManager(NULL)
{ {
setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose);
@ -92,10 +91,6 @@ void SnapshotShareDialog::uploadSnapshot() {
return; return;
} }
if (!_networkAccessManager) {
_networkAccessManager = new QNetworkAccessManager(this);
}
QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart apiKeyPart; QHttpPart apiKeyPart;
@ -118,9 +113,7 @@ void SnapshotShareDialog::uploadSnapshot() {
QUrl url(FORUM_UPLOADS_URL); QUrl url(FORUM_UPLOADS_URL);
QNetworkRequest request(url); QNetworkRequest request(url);
QNetworkReply* reply = _networkAccessManager->post(request, multiPart); QNetworkReply* reply = NetworkAccessManager::getInstance().post(request, multiPart);
connect(reply, &QNetworkReply::finished, this, &SnapshotShareDialog::uploadRequestFinished); connect(reply, &QNetworkReply::finished, this, &SnapshotShareDialog::uploadRequestFinished);
QEventLoop loop; QEventLoop loop;
@ -129,11 +122,6 @@ void SnapshotShareDialog::uploadSnapshot() {
} }
void SnapshotShareDialog::sendForumPost(QString snapshotPath) { void SnapshotShareDialog::sendForumPost(QString snapshotPath) {
if (!_networkAccessManager) {
_networkAccessManager = new QNetworkAccessManager(this);
}
// post to Discourse forum // post to Discourse forum
QNetworkRequest request; QNetworkRequest request;
QUrl forumUrl(FORUM_POST_URL); QUrl forumUrl(FORUM_POST_URL);
@ -148,7 +136,7 @@ void SnapshotShareDialog::sendForumPost(QString snapshotPath) {
request.setUrl(forumUrl); request.setUrl(forumUrl);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); 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); connect(requestReply, &QNetworkReply::finished, this, &SnapshotShareDialog::postRequestFinished);
QEventLoop loop; QEventLoop loop;

View file

@ -14,7 +14,6 @@
#include "ui_shareSnapshot.h" #include "ui_shareSnapshot.h"
#include <QNetworkAccessManager>
#include <QNetworkReply> #include <QNetworkReply>
#include <QUrl> #include <QUrl>
@ -26,7 +25,6 @@ public:
private: private:
QString _fileName; QString _fileName;
QNetworkAccessManager* _networkAccessManager;
Ui_SnapshotShareDialog _ui; Ui_SnapshotShareDialog _ui;
void uploadSnapshot(); void uploadSnapshot();

View file

@ -14,8 +14,7 @@
#include "BillboardOverlay.h" #include "BillboardOverlay.h"
BillboardOverlay::BillboardOverlay() BillboardOverlay::BillboardOverlay()
: _manager(NULL), : _scale(1.0f),
_scale(1.0f),
_isFacingAvatar(true) { _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) { void BillboardOverlay::setBillboardURL(const QUrl url) {
// TODO: are we creating too many QNetworkAccessManager() when multiple calls to setImageURL are made? QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(url));
_manager->deleteLater(); connect(reply, &QNetworkReply::finished, this, &BillboardOverlay::replyFinished);
_manager = new QNetworkAccessManager();
connect(_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
_manager->get(QNetworkRequest(url));
} }
void BillboardOverlay::replyFinished(QNetworkReply* reply) { void BillboardOverlay::replyFinished() {
// replace our byte array with the downloaded data // replace our byte array with the downloaded data
QNetworkReply* reply = static_cast<QNetworkReply*>(sender());
_billboard = reply->readAll(); _billboard = reply->readAll();
_manager->deleteLater();
_manager = NULL;
} }

View file

@ -27,12 +27,11 @@ public:
virtual void setProperties(const QScriptValue& properties); virtual void setProperties(const QScriptValue& properties);
private slots: private slots:
void replyFinished(QNetworkReply* reply); void replyFinished();
private: private:
void setBillboardURL(const QUrl url); void setBillboardURL(const QUrl url);
QNetworkAccessManager* _manager;
QUrl _url; QUrl _url;
QByteArray _billboard; QByteArray _billboard;
QSize _size; QSize _size;

View file

@ -19,7 +19,6 @@
#include "ImageOverlay.h" #include "ImageOverlay.h"
ImageOverlay::ImageOverlay() : ImageOverlay::ImageOverlay() :
_manager(NULL),
_textureID(0), _textureID(0),
_renderImage(false), _renderImage(false),
_textureBound(false), _textureBound(false),
@ -36,21 +35,18 @@ ImageOverlay::~ImageOverlay() {
// TODO: handle setting image multiple times, how do we manage releasing the bound texture? // TODO: handle setting image multiple times, how do we manage releasing the bound texture?
void ImageOverlay::setImageURL(const QUrl& url) { void ImageOverlay::setImageURL(const QUrl& url) {
// TODO: are we creating too many QNetworkAccessManager() when multiple calls to setImageURL are made? NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
_manager->deleteLater(); QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url));
_manager = new QNetworkAccessManager(); connect(reply, &QNetworkReply::finished, this, &ImageOverlay::replyFinished);
connect(_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
_manager->get(QNetworkRequest(url));
} }
void ImageOverlay::replyFinished(QNetworkReply* reply) { void ImageOverlay::replyFinished() {
QNetworkReply* reply = static_cast<QNetworkReply*>(sender());
// replace our byte array with the downloaded data // replace our byte array with the downloaded data
QByteArray rawData = reply->readAll(); QByteArray rawData = reply->readAll();
_textureImage.loadFromData(rawData); _textureImage.loadFromData(rawData);
_renderImage = true; _renderImage = true;
_manager->deleteLater();
_manager = NULL;
} }
void ImageOverlay::render() { void ImageOverlay::render() {

View file

@ -16,13 +16,13 @@
#include <QGLWidget> #include <QGLWidget>
#include <QImage> #include <QImage>
#include <QNetworkAccessManager>
#include <QNetworkReply> #include <QNetworkReply>
#include <QRect> #include <QRect>
#include <QScriptValue> #include <QScriptValue>
#include <QString> #include <QString>
#include <QUrl> #include <QUrl>
#include <NetworkAccessManager.h>
#include <SharedUtil.h> #include <SharedUtil.h>
#include "Overlay.h" #include "Overlay.h"
@ -46,13 +46,12 @@ public:
virtual void setProperties(const QScriptValue& properties); virtual void setProperties(const QScriptValue& properties);
private slots: private slots:
void replyFinished(QNetworkReply* reply); // we actually want to hide this... void replyFinished(); // we actually want to hide this...
private: private:
QUrl _imageURL; QUrl _imageURL;
QImage _textureImage; QImage _textureImage;
QNetworkAccessManager* _manager;
GLuint _textureID; GLuint _textureID;
QRect _fromImage; // where from in the image to sample QRect _fromImage; // where from in the image to sample

View file

@ -16,7 +16,6 @@
#include <QGLWidget> #include <QGLWidget>
#include <QImage> #include <QImage>
#include <QNetworkAccessManager>
#include <QNetworkReply> #include <QNetworkReply>
#include <QRect> #include <QRect>
#include <QScriptValue> #include <QScriptValue>

View file

@ -15,12 +15,12 @@
#include <QDataStream> #include <QDataStream>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest> #include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkReply>
#include <qendian.h> #include <qendian.h>
#include <LimitedNodeList.h> #include <LimitedNodeList.h>
#include <NetworkAccessManager.h>
#include <SharedUtil.h> #include <SharedUtil.h>
#include "AudioRingBuffer.h" #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 // assume we have a QApplication or QCoreApplication instance and use the
// QNetworkAccess manager to grab the raw audio file at the given URL // 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(); 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, &QNetworkReply::finished, this, &Sound::replyFinished);
connect(soundDownload, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(replyError(QNetworkReply::NetworkError))); connect(soundDownload, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(replyError(QNetworkReply::NetworkError)));
} }

View file

@ -16,10 +16,10 @@
#include <QtCore/QDataStream> #include <QtCore/QDataStream>
#include <QtCore/QThread> #include <QtCore/QThread>
#include <QtCore/QUuid> #include <QtCore/QUuid>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkRequest> #include <QtNetwork/QNetworkRequest>
#include <NetworkAccessManager.h>
#include <NodeList.h> #include <NodeList.h>
#include <PacketHeaders.h> #include <PacketHeaders.h>
#include <SharedUtil.h> #include <SharedUtil.h>
@ -33,8 +33,6 @@ quint64 DEFAULT_FILTERED_LOG_EXPIRY = 2 * USECS_PER_SECOND;
using namespace std; using namespace std;
QNetworkAccessManager* AvatarData::networkAccessManager = NULL;
AvatarData::AvatarData() : AvatarData::AvatarData() :
_sessionUUID(), _sessionUUID(),
_handPosition(0,0,0), _handPosition(0,0,0),
@ -751,18 +749,15 @@ void AvatarData::setBillboard(const QByteArray& billboard) {
void AvatarData::setBillboardFromURL(const QString &billboardURL) { void AvatarData::setBillboardFromURL(const QString &billboardURL) {
_billboardURL = billboardURL; _billboardURL = billboardURL;
if (AvatarData::networkAccessManager) {
qDebug() << "Changing billboard for avatar to PNG at" << qPrintable(billboardURL); qDebug() << "Changing billboard for avatar to PNG at" << qPrintable(billboardURL);
QNetworkRequest billboardRequest; QNetworkRequest billboardRequest;
billboardRequest.setUrl(QUrl(billboardURL)); billboardRequest.setUrl(QUrl(billboardURL));
QNetworkReply* networkReply = AvatarData::networkAccessManager->get(billboardRequest); NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
connect(networkReply, SIGNAL(finished()), this, SLOT(setBillboardFromNetworkReply())); QNetworkReply* networkReply = networkAccessManager.get(billboardRequest);
connect(networkReply, SIGNAL(finished()), this, SLOT(setBillboardFromNetworkReply()));
} else {
qDebug() << "Billboard PNG download requested but no network access manager is available.";
}
} }
void AvatarData::setBillboardFromNetworkReply() { void AvatarData::setBillboardFromNetworkReply() {
@ -839,8 +834,9 @@ void AvatarData::updateJointMappings() {
_jointIndices.clear(); _jointIndices.clear();
_jointNames.clear(); _jointNames.clear();
if (networkAccessManager && _skeletonModelURL.fileName().toLower().endsWith(".fst")) { if (_skeletonModelURL.fileName().toLower().endsWith(".fst")) {
QNetworkReply* networkReply = networkAccessManager->get(QNetworkRequest(_skeletonModelURL)); NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkReply* networkReply = networkAccessManager.get(QNetworkRequest(_skeletonModelURL));
connect(networkReply, SIGNAL(finished()), this, SLOT(setJointMappingsFromNetworkReply())); connect(networkReply, SIGNAL(finished()), this, SLOT(setJointMappingsFromNetworkReply()));
} }
} }

View file

@ -102,7 +102,6 @@ enum KeyState {
const glm::vec3 vec3Zero(0.0f); const glm::vec3 vec3Zero(0.0f);
class QDataStream; class QDataStream;
class QNetworkAccessManager;
class AttachmentData; class AttachmentData;
class JointData; class JointData;
@ -269,8 +268,6 @@ public:
QElapsedTimer& getLastUpdateTimer() { return _lastUpdateTimer; } QElapsedTimer& getLastUpdateTimer() { return _lastUpdateTimer; }
virtual float getBoundingRadius() const { return 1.f; } virtual float getBoundingRadius() const { return 1.f; }
static void setNetworkAccessManager(QNetworkAccessManager* sharedAccessManager) { networkAccessManager = sharedAccessManager; }
public slots: public slots:
void sendIdentityPacket(); void sendIdentityPacket();
@ -323,8 +320,6 @@ protected:
QHash<QString, int> _jointIndices; ///< 1-based, since zero is returned for missing keys QHash<QString, int> _jointIndices; ///< 1-based, since zero is returned for missing keys
QStringList _jointNames; ///< in order of depth-first traversal QStringList _jointNames; ///< in order of depth-first traversal
static QNetworkAccessManager* networkAccessManager;
quint64 _errorLogExpiry; ///< time in future when to log an error quint64 _errorLogExpiry; ///< time in future when to log an error

View file

@ -51,7 +51,6 @@ JSONCallbackParameters::JSONCallbackParameters(QObject* jsonCallbackReceiver, co
AccountManager::AccountManager() : AccountManager::AccountManager() :
_authURL(), _authURL(),
_networkAccessManager(NULL),
_pendingCallbackMap(), _pendingCallbackMap(),
_accountInfo() _accountInfo()
{ {
@ -155,9 +154,7 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager::
const JSONCallbackParameters& callbackParams, const JSONCallbackParameters& callbackParams,
const QByteArray& dataByteArray, QHttpMultiPart* dataMultiPart) { const QByteArray& dataByteArray, QHttpMultiPart* dataMultiPart) {
if (!_networkAccessManager) { NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
_networkAccessManager = new QNetworkAccessManager(this);
}
if (hasValidAccessToken()) { if (hasValidAccessToken()) {
QNetworkRequest authenticatedRequest; QNetworkRequest authenticatedRequest;
@ -186,29 +183,29 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager::
switch (operation) { switch (operation) {
case QNetworkAccessManager::GetOperation: case QNetworkAccessManager::GetOperation:
networkReply = _networkAccessManager->get(authenticatedRequest); networkReply = networkAccessManager.get(authenticatedRequest);
break; break;
case QNetworkAccessManager::PostOperation: case QNetworkAccessManager::PostOperation:
case QNetworkAccessManager::PutOperation: case QNetworkAccessManager::PutOperation:
if (dataMultiPart) { if (dataMultiPart) {
if (operation == QNetworkAccessManager::PostOperation) { if (operation == QNetworkAccessManager::PostOperation) {
networkReply = _networkAccessManager->post(authenticatedRequest, dataMultiPart); networkReply = networkAccessManager.post(authenticatedRequest, dataMultiPart);
} else { } else {
networkReply = _networkAccessManager->put(authenticatedRequest, dataMultiPart); networkReply = networkAccessManager.put(authenticatedRequest, dataMultiPart);
} }
dataMultiPart->setParent(networkReply); dataMultiPart->setParent(networkReply);
} else { } else {
authenticatedRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); authenticatedRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
if (operation == QNetworkAccessManager::PostOperation) { if (operation == QNetworkAccessManager::PostOperation) {
networkReply = _networkAccessManager->post(authenticatedRequest, dataByteArray); networkReply = networkAccessManager.post(authenticatedRequest, dataByteArray);
} else { } else {
networkReply = _networkAccessManager->put(authenticatedRequest, dataByteArray); networkReply = networkAccessManager.put(authenticatedRequest, dataByteArray);
} }
} }
break; break;
case QNetworkAccessManager::DeleteOperation: case QNetworkAccessManager::DeleteOperation:
networkReply = _networkAccessManager->sendCustomRequest(authenticatedRequest, "DELETE"); networkReply = networkAccessManager.sendCustomRequest(authenticatedRequest, "DELETE");
break; break;
default: default:
// other methods not yet handled // other methods not yet handled
@ -309,9 +306,7 @@ bool AccountManager::checkAndSignalForAccessToken() {
void AccountManager::requestAccessToken(const QString& login, const QString& password) { void AccountManager::requestAccessToken(const QString& login, const QString& password) {
if (!_networkAccessManager) { NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
_networkAccessManager = new QNetworkAccessManager(this);
}
QNetworkRequest request; QNetworkRequest request;
@ -329,7 +324,7 @@ void AccountManager::requestAccessToken(const QString& login, const QString& pas
request.setUrl(grantURL); request.setUrl(grantURL);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); 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, &QNetworkReply::finished, this, &AccountManager::requestAccessTokenFinished);
connect(requestReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestAccessTokenError(QNetworkReply::NetworkError))); connect(requestReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestAccessTokenError(QNetworkReply::NetworkError)));
} }
@ -381,15 +376,13 @@ void AccountManager::requestAccessTokenError(QNetworkReply::NetworkError error)
} }
void AccountManager::requestProfile() { void AccountManager::requestProfile() {
if (!_networkAccessManager) { NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
_networkAccessManager = new QNetworkAccessManager(this);
}
QUrl profileURL = _authURL; QUrl profileURL = _authURL;
profileURL.setPath("/api/v1/users/profile"); profileURL.setPath("/api/v1/users/profile");
profileURL.setQuery("access_token=" + _accountInfo.getAccessToken().token); 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, &QNetworkReply::finished, this, &AccountManager::requestProfileFinished);
connect(profileReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestProfileError(QNetworkReply::NetworkError))); connect(profileReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestProfileError(QNetworkReply::NetworkError)));
} }

View file

@ -15,9 +15,10 @@
#include <QtCore/QByteArray> #include <QtCore/QByteArray>
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtCore/QUrl> #include <QtCore/QUrl>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkReply>
#include "NetworkAccessManager.h"
#include "DataServerAccountInfo.h" #include "DataServerAccountInfo.h"
class JSONCallbackParameters { class JSONCallbackParameters {
@ -60,8 +61,6 @@ public:
const DataServerAccountInfo& getAccountInfo() const { return _accountInfo; } const DataServerAccountInfo& getAccountInfo() const { return _accountInfo; }
void destroy() { delete _networkAccessManager; }
public slots: public slots:
void requestAccessTokenFinished(); void requestAccessTokenFinished();
void requestProfileFinished(); void requestProfileFinished();
@ -95,7 +94,6 @@ private:
QHttpMultiPart* dataMultiPart); QHttpMultiPart* dataMultiPart);
QUrl _authURL; QUrl _authURL;
QNetworkAccessManager* _networkAccessManager;
QMap<QNetworkReply*, JSONCallbackParameters> _pendingCallbackMap; QMap<QNetworkReply*, JSONCallbackParameters> _pendingCallbackMap;
DataServerAccountInfo _accountInfo; DataServerAccountInfo _accountInfo;

View file

@ -0,0 +1,149 @@
//
// 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 <QMetaObject>
#include <QThread>
#include "NetworkAccessManager.h"
NetworkAccessManager& NetworkAccessManager::getInstance() {
static NetworkAccessManager sharedInstance;
return sharedInstance;
}
NetworkAccessManager::NetworkAccessManager() {
}
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);
}
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);
}

View file

@ -0,0 +1,41 @@
//
// 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 <QNetworkAccessManager>
#include <QNetworkConfiguration>
#include <QNetworkProxy>
/// 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:
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);
Q_INVOKABLE QNetworkReply* sendCustomRequest(const QNetworkRequest& request, const QByteArray& verb, QIODevice* data = 0);
private:
NetworkAccessManager();
};
#endif // hifi_NetworkAccessManager_h

View file

@ -16,6 +16,8 @@
#include <QTimer> #include <QTimer>
#include <QtDebug> #include <QtDebug>
#include "NetworkAccessManager.h"
#include "ResourceCache.h" #include "ResourceCache.h"
ResourceCache::ResourceCache(QObject* parent) : ResourceCache::ResourceCache(QObject* parent) :
@ -103,8 +105,6 @@ void ResourceCache::requestCompleted(Resource* resource) {
} }
} }
QNetworkAccessManager* ResourceCache::_networkAccessManager = NULL;
const int DEFAULT_REQUEST_LIMIT = 10; const int DEFAULT_REQUEST_LIMIT = 10;
int ResourceCache::_requestLimit = DEFAULT_REQUEST_LIMIT; int ResourceCache::_requestLimit = DEFAULT_REQUEST_LIMIT;
@ -219,7 +219,7 @@ void Resource::init() {
if (_url.isEmpty()) { if (_url.isEmpty()) {
_startedLoading = _loaded = true; _startedLoading = _loaded = true;
} else if (!(_url.isValid() && ResourceCache::getNetworkAccessManager())) { } else if (!(_url.isValid())) {
_startedLoading = _failedToLoad = true; _startedLoading = _failedToLoad = true;
} }
} }
@ -272,7 +272,7 @@ void Resource::handleReplyTimeout() {
} }
void Resource::makeRequest() { 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(downloadProgress(qint64,qint64)), SLOT(handleDownloadProgress(qint64,qint64)));
connect(_reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(handleReplyError())); connect(_reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(handleReplyError()));

View file

@ -22,7 +22,6 @@
#include <QUrl> #include <QUrl>
#include <QWeakPointer> #include <QWeakPointer>
class QNetworkAccessManager;
class QNetworkReply; class QNetworkReply;
class QTimer; class QTimer;
@ -33,10 +32,6 @@ class ResourceCache : public QObject {
Q_OBJECT Q_OBJECT
public: public:
static void setNetworkAccessManager(QNetworkAccessManager* manager) { _networkAccessManager = manager; }
static QNetworkAccessManager* getNetworkAccessManager() { return _networkAccessManager; }
static void setRequestLimit(int limit) { _requestLimit = limit; } static void setRequestLimit(int limit) { _requestLimit = limit; }
static int getRequestLimit() { return _requestLimit; } static int getRequestLimit() { return _requestLimit; }
@ -76,7 +71,6 @@ private:
QHash<QUrl, QWeakPointer<Resource> > _resources; QHash<QUrl, QWeakPointer<Resource> > _resources;
int _lastLRUKey; int _lastLRUKey;
static QNetworkAccessManager* _networkAccessManager;
static int _requestLimit; static int _requestLimit;
static QList<QPointer<Resource> > _pendingRequests; static QList<QPointer<Resource> > _pendingRequests;
static QList<Resource*> _loadingRequests; static QList<Resource*> _loadingRequests;

View file

@ -13,7 +13,6 @@
#include <QtCore/QEventLoop> #include <QtCore/QEventLoop>
#include <QtCore/QTimer> #include <QtCore/QTimer>
#include <QtCore/QThread> #include <QtCore/QThread>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest> #include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkReply>
#include <QScriptEngine> #include <QScriptEngine>
@ -23,6 +22,7 @@
#include <AvatarData.h> #include <AvatarData.h>
#include <CollisionInfo.h> #include <CollisionInfo.h>
#include <ModelsScriptingInterface.h> #include <ModelsScriptingInterface.h>
#include <NetworkAccessManager.h>
#include <NodeList.h> #include <NodeList.h>
#include <PacketHeaders.h> #include <PacketHeaders.h>
#include <ParticlesScriptingInterface.h> #include <ParticlesScriptingInterface.h>
@ -141,8 +141,8 @@ ScriptEngine::ScriptEngine(const QUrl& scriptURL,
emit errorMessage("ERROR Loading file:" + fileName); emit errorMessage("ERROR Loading file:" + fileName);
} }
} else { } else {
QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkReply* reply = networkManager->get(QNetworkRequest(url)); QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url));
qDebug() << "Downloading included script at" << url; qDebug() << "Downloading included script at" << url;
QEventLoop loop; QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
@ -646,8 +646,8 @@ void ScriptEngine::include(const QString& includeFile) {
QString includeContents; QString includeContents;
if (url.scheme() == "http" || url.scheme() == "ftp") { if (url.scheme() == "http" || url.scheme() == "ftp") {
QNetworkAccessManager* networkManager = new QNetworkAccessManager(this); NetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkReply* reply = networkManager->get(QNetworkRequest(url)); QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url));
qDebug() << "Downloading included script at" << includeFile; qDebug() << "Downloading included script at" << includeFile;
QEventLoop loop; QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));

View file

@ -14,6 +14,8 @@
#include <QEventLoop> #include <QEventLoop>
#include <NetworkAccessManager.h>
#include "XMLHttpRequestClass.h" #include "XMLHttpRequestClass.h"
XMLHttpRequestClass::XMLHttpRequestClass(QScriptEngine* engine) : XMLHttpRequestClass::XMLHttpRequestClass(QScriptEngine* engine) :
@ -22,7 +24,6 @@ XMLHttpRequestClass::XMLHttpRequestClass(QScriptEngine* engine) :
_url(), _url(),
_method(""), _method(""),
_responseType(""), _responseType(""),
_manager(this),
_request(), _request(),
_reply(NULL), _reply(NULL),
_sendData(NULL), _sendData(NULL),
@ -161,7 +162,7 @@ void XMLHttpRequestClass::send(const QString& data) {
} }
void XMLHttpRequestClass::doSend() { void XMLHttpRequestClass::doSend() {
_reply = _manager.sendCustomRequest(_request, _method.toLatin1(), _sendData); _reply = NetworkAccessManager::getInstance().sendCustomRequest(_request, _method.toLatin1(), _sendData);
connectToReply(_reply); connectToReply(_reply);

View file

@ -13,7 +13,6 @@
#define hifi_XMLHttpRequestClass_h #define hifi_XMLHttpRequestClass_h
#include <QBuffer> #include <QBuffer>
#include <QNetworkAccessManager>
#include <QNetworkReply> #include <QNetworkReply>
#include <QNetworkRequest> #include <QNetworkRequest>
#include <QObject> #include <QObject>
@ -104,7 +103,6 @@ private:
QUrl _url; QUrl _url;
QString _method; QString _method;
QString _responseType; QString _responseType;
QNetworkAccessManager _manager;
QNetworkRequest _request; QNetworkRequest _request;
QNetworkReply* _reply; QNetworkReply* _reply;
QBuffer* _sendData; QBuffer* _sendData;