Generalize atp handling in network access managers

This commit is contained in:
Zander Otavka 2016-08-09 11:46:08 -07:00
parent cb153f2a29
commit 51fb52977e
8 changed files with 55 additions and 84 deletions

View file

@ -25,7 +25,7 @@
#include <NumericalConstants.h> #include <NumericalConstants.h>
#include <Finally.h> #include <Finally.h>
#include <PathUtils.h> #include <PathUtils.h>
#include <QmlNetworkAccessManager.h> #include <NetworkAccessManager.h>
#include "OffscreenGLCanvas.h" #include "OffscreenGLCanvas.h"
#include "GLEscrow.h" #include "GLEscrow.h"
@ -56,6 +56,22 @@ private:
friend class OffscreenQmlSurface; friend class OffscreenQmlSurface;
}; };
class QmlNetworkAccessManager : public NetworkAccessManager {
public:
friend class QmlNetworkAccessManagerFactory;
protected:
QmlNetworkAccessManager(QObject* parent) : NetworkAccessManager(parent) { }
};
class QmlNetworkAccessManagerFactory : public QQmlNetworkAccessManagerFactory {
public:
QNetworkAccessManager* create(QObject* parent);
};
QNetworkAccessManager* QmlNetworkAccessManagerFactory::create(QObject* parent) {
return new QmlNetworkAccessManager(parent);
}
Q_DECLARE_LOGGING_CATEGORY(offscreenFocus) Q_DECLARE_LOGGING_CATEGORY(offscreenFocus)
Q_LOGGING_CATEGORY(offscreenFocus, "hifi.offscreen.focus") Q_LOGGING_CATEGORY(offscreenFocus, "hifi.offscreen.focus")

View file

@ -1,5 +1,5 @@
// //
// QmlAtpReply.cpp // AtpReply.cpp
// libraries/networking/src // libraries/networking/src
// //
// Created by Zander Otavka on 8/4/16. // Created by Zander Otavka on 8/4/16.
@ -10,30 +10,30 @@
// //
#include "ResourceManager.h" #include "ResourceManager.h"
#include "QmlAtpReply.h" #include "AtpReply.h"
QmlAtpReply::QmlAtpReply(const QUrl& url, QObject* parent) : AtpReply::AtpReply(const QUrl& url, QObject* parent) :
_resourceRequest(ResourceManager::createResourceRequest(parent, url)) { _resourceRequest(ResourceManager::createResourceRequest(parent, url)) {
setOperation(QNetworkAccessManager::GetOperation); setOperation(QNetworkAccessManager::GetOperation);
connect(_resourceRequest, &AssetResourceRequest::progress, this, &QmlAtpReply::downloadProgress); connect(_resourceRequest, &AssetResourceRequest::progress, this, &AtpReply::downloadProgress);
connect(_resourceRequest, &AssetResourceRequest::finished, this, &QmlAtpReply::handleRequestFinish); connect(_resourceRequest, &AssetResourceRequest::finished, this, &AtpReply::handleRequestFinish);
_resourceRequest->send(); _resourceRequest->send();
} }
QmlAtpReply::~QmlAtpReply() { AtpReply::~AtpReply() {
if (_resourceRequest) { if (_resourceRequest) {
_resourceRequest->deleteLater(); _resourceRequest->deleteLater();
_resourceRequest = nullptr; _resourceRequest = nullptr;
} }
} }
qint64 QmlAtpReply::bytesAvailable() const { qint64 AtpReply::bytesAvailable() const {
return _content.size() - _readOffset + QIODevice::bytesAvailable(); return _content.size() - _readOffset + QIODevice::bytesAvailable();
} }
qint64 QmlAtpReply::readData(char* data, qint64 maxSize) { qint64 AtpReply::readData(char* data, qint64 maxSize) {
if (_readOffset < _content.size()) { if (_readOffset < _content.size()) {
qint64 readSize = qMin(maxSize, _content.size() - _readOffset); qint64 readSize = qMin(maxSize, _content.size() - _readOffset);
memcpy(data, _content.constData() + _readOffset, readSize); memcpy(data, _content.constData() + _readOffset, readSize);
@ -44,7 +44,7 @@ qint64 QmlAtpReply::readData(char* data, qint64 maxSize) {
} }
} }
void QmlAtpReply::handleRequestFinish() { void AtpReply::handleRequestFinish() {
Q_ASSERT(_resourceRequest->getState() == ResourceRequest::State::Finished); Q_ASSERT(_resourceRequest->getState() == ResourceRequest::State::Finished);
switch (_resourceRequest->getResult()) { switch (_resourceRequest->getResult()) {

View file

@ -1,5 +1,5 @@
// //
// QmlAtpReply.h // AtpReply.h
// libraries/networking/src // libraries/networking/src
// //
// Created by Zander Otavka on 8/4/16. // Created by Zander Otavka on 8/4/16.
@ -9,19 +9,19 @@
// 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
// //
#ifndef hifi_QmlAtpReply_h #ifndef hifi_AtpReply_h
#define hifi_QmlAtpReply_h #define hifi_AtpReply_h
#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkReply>
#include <QUrl> #include <QUrl>
#include "AssetResourceRequest.h" #include "AssetResourceRequest.h"
class QmlAtpReply : public QNetworkReply { class AtpReply : public QNetworkReply {
Q_OBJECT Q_OBJECT
public: public:
QmlAtpReply(const QUrl& url, QObject* parent = Q_NULLPTR); AtpReply(const QUrl& url, QObject* parent = Q_NULLPTR);
~QmlAtpReply(); ~AtpReply();
qint64 bytesAvailable() const override; qint64 bytesAvailable() const override;
void abort() override { } void abort() override { }
bool isSequential() const override { return true; } bool isSequential() const override { return true; }
@ -37,4 +37,4 @@ private:
qint64 _readOffset { 0 }; qint64 _readOffset { 0 };
}; };
#endif // hifi_QmlAtpReply_h #endif // hifi_AtpReply_h

View file

@ -1,6 +1,6 @@
// //
// NetworkAccessManager.cpp // NetworkAccessManager.cpp
// // libraries/networking/src
// //
// Created by Clement on 7/1/14. // Created by Clement on 7/1/14.
// Copyright 2014 High Fidelity, Inc. // Copyright 2014 High Fidelity, Inc.
@ -11,6 +11,7 @@
#include <QThreadStorage> #include <QThreadStorage>
#include "AtpReply.h"
#include "NetworkAccessManager.h" #include "NetworkAccessManager.h"
QThreadStorage<QNetworkAccessManager*> networkAccessManagers; QThreadStorage<QNetworkAccessManager*> networkAccessManagers;
@ -23,3 +24,13 @@ QNetworkAccessManager& NetworkAccessManager::getInstance() {
return *networkAccessManagers.localData(); return *networkAccessManagers.localData();
} }
QNetworkReply* NetworkAccessManager::createRequest(Operation operation, const QNetworkRequest& request, QIODevice* device) {
if (request.url().scheme() == "atp" && operation == GetOperation) {
return new AtpReply(request.url());
//auto url = request.url().toString();
//return QNetworkAccessManager::createRequest(operation, request, device);
} else {
return QNetworkAccessManager::createRequest(operation, request, device);
}
}

View file

@ -1,6 +1,6 @@
// //
// NetworkAccessManager.h // NetworkAccessManager.h
// // libraries/networking/src
// //
// Created by Clement on 7/1/14. // Created by Clement on 7/1/14.
// Copyright 2014 High Fidelity, Inc. // Copyright 2014 High Fidelity, Inc.
@ -13,12 +13,17 @@
#define hifi_NetworkAccessManager_h #define hifi_NetworkAccessManager_h
#include <QtNetwork/QNetworkAccessManager> #include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtQml/QQmlNetworkAccessManagerFactory>
/// Wrapper around QNetworkAccessManager to restrict at one instance by thread /// Wrapper around QNetworkAccessManager to restrict at one instance by thread
class NetworkAccessManager : public QObject { class NetworkAccessManager : public QNetworkAccessManager {
Q_OBJECT Q_OBJECT
public: public:
static QNetworkAccessManager& getInstance(); static QNetworkAccessManager& getInstance();
protected:
NetworkAccessManager(QObject* parent = Q_NULLPTR) : QNetworkAccessManager(parent) {}
virtual QNetworkReply* createRequest(Operation op, const QNetworkRequest& request, QIODevice* device = Q_NULLPTR) override;
}; };
#endif // hifi_NetworkAccessManager_h #endif // hifi_NetworkAccessManager_h

View file

@ -12,12 +12,13 @@
#ifndef hifi_OAuthNetworkAccessManager_h #ifndef hifi_OAuthNetworkAccessManager_h
#define hifi_OAuthNetworkAccessManager_h #define hifi_OAuthNetworkAccessManager_h
#include <QNetworkAccessManager> #include "NetworkAccessManager.h"
class OAuthNetworkAccessManager : public QNetworkAccessManager { class OAuthNetworkAccessManager : public NetworkAccessManager {
public: public:
static OAuthNetworkAccessManager* getInstance(); static OAuthNetworkAccessManager* getInstance();
protected: protected:
OAuthNetworkAccessManager(QObject* parent = Q_NULLPTR) : NetworkAccessManager(parent) { }
virtual QNetworkReply* createRequest(Operation op, const QNetworkRequest& req, QIODevice* outgoingData = 0); virtual QNetworkReply* createRequest(Operation op, const QNetworkRequest& req, QIODevice* outgoingData = 0);
}; };

View file

@ -1,29 +0,0 @@
//
// QmlNetworkAccessManager.cpp
// libraries/networking/src
//
// Created by Zander Otavka on 8/4/16.
// 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 <QThreadStorage>
#include "QmlAtpReply.h"
#include "QmlNetworkAccessManager.h"
QNetworkAccessManager* QmlNetworkAccessManagerFactory::create(QObject* parent) {
return new QmlNetworkAccessManager(parent);
}
QNetworkReply* QmlNetworkAccessManager::createRequest(Operation operation, const QNetworkRequest& request, QIODevice* device) {
if (request.url().scheme() == "atp" && operation == GetOperation) {
return new QmlAtpReply(request.url());
//auto url = request.url().toString();
//return QNetworkAccessManager::createRequest(operation, request, device);
} else {
return QNetworkAccessManager::createRequest(operation, request, device);
}
}

View file

@ -1,33 +0,0 @@
//
// QmlNetworkAccessManager.h
// libraries/networking/src
//
// Created by Zander Otavka on 8/4/16.
// 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_QmlNetworkAccessManager_h
#define hifi_QmlNetworkAccessManager_h
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtQml/QQmlNetworkAccessManagerFactory>
class QmlNetworkAccessManagerFactory : public QQmlNetworkAccessManagerFactory {
public:
QNetworkAccessManager* create(QObject* parent);
};
class QmlNetworkAccessManager : public QNetworkAccessManager {
Q_OBJECT
public:
QmlNetworkAccessManager(QObject* parent = Q_NULLPTR) : QNetworkAccessManager(parent) { }
protected:
QNetworkReply* createRequest(Operation op, const QNetworkRequest& request, QIODevice* device = Q_NULLPTR);
};
#endif // hifi_QmlNetworkAccessManager_h