mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 11:45:36 +02:00
add helpers for json responses from AccountManager
This commit is contained in:
parent
2408d909ba
commit
ee90c25a41
6 changed files with 92 additions and 32 deletions
|
@ -71,7 +71,7 @@ DomainServer::DomainServer(int argc, char* argv[]) :
|
|||
// TODO: failure case for not receiving a token
|
||||
accountManager.requestAccessToken(username, password);
|
||||
|
||||
connect(&accountManager, &AccountManager::receivedAccessToken, this, &DomainServer::requestUUIDFromDataServer);
|
||||
connect(&accountManager, &AccountManager::receivedAccessToken, this, &DomainServer::requestCreationFromDataServer);
|
||||
|
||||
} else {
|
||||
qDebug() << "Authentication was requested against" << qPrintable(_nodeAuthenticationURL.toString())
|
||||
|
@ -89,20 +89,22 @@ DomainServer::DomainServer(int argc, char* argv[]) :
|
|||
}
|
||||
}
|
||||
|
||||
void DomainServer::requestUUIDFromDataServer() {
|
||||
void DomainServer::requestCreationFromDataServer() {
|
||||
// this slot is fired when we get a valid access token from the data-server
|
||||
// now let's ask it to set us up with a UUID
|
||||
AccountManager::getInstance().authenticatedRequest("/api/v1/domains/create", QNetworkAccessManager::PostOperation,
|
||||
this, SLOT(parseUUIDFromDataServer()));
|
||||
JSONCallbackParameters callbackParams;
|
||||
callbackParams.jsonCallbackReceiver = this;
|
||||
callbackParams.jsonCallbackMethod = "processCreateResponseFromDataServer";
|
||||
|
||||
AccountManager::getInstance().authenticatedRequest("/api/v1/domains/create",
|
||||
QNetworkAccessManager::PostOperation,
|
||||
callbackParams);
|
||||
}
|
||||
|
||||
void DomainServer::parseUUIDFromDataServer() {
|
||||
QNetworkReply* requestReply = reinterpret_cast<QNetworkReply*>(sender());
|
||||
QJsonDocument jsonResponse = QJsonDocument::fromJson(requestReply->readAll());
|
||||
|
||||
if (jsonResponse.object()["status"].toString() == "success") {
|
||||
void DomainServer::processCreateResponseFromDataServer(const QJsonObject& jsonObject) {
|
||||
if (jsonObject["status"].toString() == "success") {
|
||||
// pull out the UUID the data-server is telling us to use, and complete our setup with it
|
||||
QUuid newSessionUUID = QUuid(jsonResponse.object()["data"].toObject()["uuid"].toString());
|
||||
QUuid newSessionUUID = QUuid(jsonObject["data"].toObject()["uuid"].toString());
|
||||
setupNodeListAndAssignments(newSessionUUID);
|
||||
}
|
||||
}
|
||||
|
@ -303,7 +305,6 @@ void DomainServer::readAvailableDatagrams() {
|
|||
|
||||
QByteArray receivedPacket;
|
||||
NodeType_t nodeType;
|
||||
|
||||
|
||||
while (nodeList->getNodeSocket().hasPendingDatagrams()) {
|
||||
receivedPacket.resize(nodeList->getNodeSocket().pendingDatagramSize());
|
||||
|
|
|
@ -36,6 +36,8 @@ public slots:
|
|||
/// Called by NodeList to inform us a node has been killed
|
||||
void nodeKilled(SharedNodePointer node);
|
||||
|
||||
void processCreateResponseFromDataServer(const QJsonObject& jsonObject);
|
||||
|
||||
private:
|
||||
void setupNodeListAndAssignments(const QUuid& sessionUUID = QUuid::createUuid());
|
||||
|
||||
|
@ -65,8 +67,7 @@ private:
|
|||
|
||||
QStringList _argumentList;
|
||||
private slots:
|
||||
void requestUUIDFromDataServer();
|
||||
void parseUUIDFromDataServer();
|
||||
void requestCreationFromDataServer();
|
||||
|
||||
void readAvailableDatagrams();
|
||||
void addStaticAssignmentsBackToQueueAfterRestart();
|
||||
|
|
|
@ -32,7 +32,8 @@ const QString ACCOUNT_TOKEN_GROUP = "tokens";
|
|||
AccountManager::AccountManager() :
|
||||
_rootURL(),
|
||||
_username(),
|
||||
_networkAccessManager(new QNetworkAccessManager)
|
||||
_networkAccessManager(new QNetworkAccessManager),
|
||||
_pendingCallbackMap()
|
||||
{
|
||||
qRegisterMetaType<OAuthAccessToken>("OAuthAccessToken");
|
||||
qRegisterMetaTypeStreamOperators<OAuthAccessToken>("OAuthAccessToken");
|
||||
|
@ -53,9 +54,7 @@ AccountManager::AccountManager() :
|
|||
}
|
||||
|
||||
void AccountManager::authenticatedRequest(const QString& path, QNetworkAccessManager::Operation operation,
|
||||
const QObject *successReceiver, const char *successMethod,
|
||||
const QByteArray& dataByteArray,
|
||||
const QObject* errorReceiver, const char* errorMethod) {
|
||||
const JSONCallbackParameters& callbackParams, const QByteArray& dataByteArray) {
|
||||
if (_networkAccessManager && hasValidAccessToken()) {
|
||||
QNetworkRequest authenticatedRequest;
|
||||
|
||||
|
@ -82,16 +81,57 @@ void AccountManager::authenticatedRequest(const QString& path, QNetworkAccessMan
|
|||
}
|
||||
|
||||
if (networkReply) {
|
||||
// if we ended up firing of a request, hook up to it now
|
||||
connect(networkReply, SIGNAL(finished()), successReceiver, successMethod);
|
||||
|
||||
if (errorReceiver && errorMethod) {
|
||||
connect(networkReply, SIGNAL(error()), errorReceiver, errorMethod);
|
||||
if (!callbackParams.isEmpty()) {
|
||||
// if we have information for a callback, insert the callbackParams into our local map
|
||||
_pendingCallbackMap.insert(networkReply, callbackParams);
|
||||
}
|
||||
|
||||
// if we ended up firing of a request, hook up to it now
|
||||
connect(networkReply, SIGNAL(finished()), this, SLOT(passSuccessToCallback()));
|
||||
connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
|
||||
this, SLOT(passErrorToCallback(QNetworkReply::NetworkError)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AccountManager::passSuccessToCallback() {
|
||||
QNetworkReply* requestReply = reinterpret_cast<QNetworkReply*>(sender());
|
||||
QJsonDocument jsonResponse = QJsonDocument::fromJson(requestReply->readAll());
|
||||
|
||||
JSONCallbackParameters callbackParams = _pendingCallbackMap.value(requestReply);
|
||||
|
||||
if (callbackParams.jsonCallbackReceiver) {
|
||||
// invoke the right method on the callback receiver
|
||||
QMetaObject::invokeMethod(callbackParams.jsonCallbackReceiver, qPrintable(callbackParams.jsonCallbackMethod),
|
||||
Q_ARG(const QJsonObject&, jsonResponse.object()));
|
||||
|
||||
// remove the related reply-callback group from the map
|
||||
_pendingCallbackMap.remove(requestReply);
|
||||
|
||||
} else {
|
||||
qDebug() << "Received JSON response from data-server that has no matching callback.";
|
||||
qDebug() << jsonResponse;
|
||||
}
|
||||
}
|
||||
|
||||
void AccountManager::passErrorToCallback(QNetworkReply::NetworkError errorCode) {
|
||||
QNetworkReply* requestReply = reinterpret_cast<QNetworkReply*>(sender());
|
||||
JSONCallbackParameters callbackParams = _pendingCallbackMap.value(requestReply);
|
||||
|
||||
if (callbackParams.errorCallbackReceiver) {
|
||||
// invoke the right method on the callback receiver
|
||||
QMetaObject::invokeMethod(callbackParams.errorCallbackReceiver, qPrintable(callbackParams.errorCallbackMethod),
|
||||
Q_ARG(QNetworkReply::NetworkError, errorCode),
|
||||
Q_ARG(const QString&, requestReply->errorString()));
|
||||
|
||||
// remove the related reply-callback group from the map
|
||||
_pendingCallbackMap.remove(requestReply);
|
||||
} else {
|
||||
qDebug() << "Received error response from data-server that has no matching callback.";
|
||||
qDebug() << "Error" << errorCode << "-" << requestReply->errorString();
|
||||
}
|
||||
}
|
||||
|
||||
bool AccountManager::hasValidAccessToken() {
|
||||
OAuthAccessToken accessToken = _accessTokens.value(_rootURL);
|
||||
|
||||
|
|
|
@ -17,6 +17,20 @@
|
|||
|
||||
#include "OAuthAccessToken.h"
|
||||
|
||||
class JSONCallbackParameters {
|
||||
public:
|
||||
JSONCallbackParameters() :
|
||||
jsonCallbackReceiver(NULL), jsonCallbackMethod(),
|
||||
errorCallbackReceiver(NULL), errorCallbackMethod() {};
|
||||
|
||||
bool isEmpty() const { return jsonCallbackReceiver == NULL && errorCallbackReceiver == NULL; }
|
||||
|
||||
QObject* jsonCallbackReceiver;
|
||||
QString jsonCallbackMethod;
|
||||
QObject* errorCallbackReceiver;
|
||||
QString errorCallbackMethod;
|
||||
};
|
||||
|
||||
class AccountManager : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
@ -25,9 +39,8 @@ public:
|
|||
|
||||
void authenticatedRequest(const QString& path,
|
||||
QNetworkAccessManager::Operation operation,
|
||||
const QObject* successReceiver, const char* successMethod,
|
||||
const QByteArray& dataByteArray = QByteArray(),
|
||||
const QObject* errorReceiver = 0, const char* errorMethod = NULL);
|
||||
const JSONCallbackParameters& callbackParams = JSONCallbackParameters(),
|
||||
const QByteArray& dataByteArray = QByteArray());
|
||||
|
||||
void setRootURL(const QUrl& rootURL) { _rootURL = rootURL; }
|
||||
|
||||
|
@ -45,6 +58,9 @@ public slots:
|
|||
signals:
|
||||
void authenticationRequired();
|
||||
void receivedAccessToken(const QUrl& rootURL);
|
||||
private slots:
|
||||
void passSuccessToCallback();
|
||||
void passErrorToCallback(QNetworkReply::NetworkError errorCode);
|
||||
private:
|
||||
AccountManager();
|
||||
AccountManager(AccountManager const& other); // not implemented
|
||||
|
@ -53,6 +69,7 @@ private:
|
|||
QUrl _rootURL;
|
||||
QString _username;
|
||||
QNetworkAccessManager* _networkAccessManager;
|
||||
QMap<QNetworkReply*, JSONCallbackParameters> _pendingCallbackMap;
|
||||
|
||||
static QMap<QUrl, OAuthAccessToken> _accessTokens;
|
||||
};
|
||||
|
|
|
@ -581,18 +581,19 @@ int NodeList::processDomainServerList(const QByteArray& packet) {
|
|||
return readNodes;
|
||||
}
|
||||
|
||||
void NodeList::domainServerAuthReply() {
|
||||
QNetworkReply* requestReply = reinterpret_cast<QNetworkReply*>(sender());
|
||||
QJsonDocument jsonResponse = QJsonDocument::fromJson(requestReply->readAll());
|
||||
|
||||
_domainInfo.parseAuthInformationFromJsonObject(jsonResponse.object());
|
||||
void NodeList::domainServerAuthReply(const QJsonObject& jsonObject) {
|
||||
_domainInfo.parseAuthInformationFromJsonObject(jsonObject);
|
||||
}
|
||||
|
||||
void NodeList::requestAuthForDomainServer() {
|
||||
JSONCallbackParameters callbackParams;
|
||||
callbackParams.jsonCallbackReceiver = this;
|
||||
callbackParams.jsonCallbackMethod = "domainServerAuthReply";
|
||||
|
||||
AccountManager::getInstance().authenticatedRequest("/api/v1/domains/"
|
||||
+ uuidStringWithoutCurlyBraces(_domainInfo.getUUID()) + "/auth.json",
|
||||
QNetworkAccessManager::GetOperation,
|
||||
this, SLOT(domainServerAuthReply()));
|
||||
callbackParams);
|
||||
}
|
||||
|
||||
void NodeList::processDomainServerAuthRequest(const QByteArray& packet) {
|
||||
|
|
|
@ -131,7 +131,7 @@ signals:
|
|||
void nodeAdded(SharedNodePointer);
|
||||
void nodeKilled(SharedNodePointer);
|
||||
private slots:
|
||||
void domainServerAuthReply();
|
||||
void domainServerAuthReply(const QJsonObject& jsonObject);
|
||||
private:
|
||||
static NodeList* _sharedInstance;
|
||||
|
||||
|
|
Loading…
Reference in a new issue