aboutsummaryrefslogtreecommitdiff
path: root/backends/cloud/onedrive
diff options
context:
space:
mode:
authorAlexander Tkachev2016-05-27 15:21:06 +0600
committerAlexander Tkachev2016-08-24 16:07:55 +0600
commit98150beb38f73b56c7bc76f95dcc1d72290e4ac7 (patch)
treec56f8d97d30fb15f41f07f402c80e83a13cc03fc /backends/cloud/onedrive
parent83b349a033d71e92e292d1f1da0578d557ec6411 (diff)
downloadscummvm-rg350-98150beb38f73b56c7bc76f95dcc1d72290e4ac7.tar.gz
scummvm-rg350-98150beb38f73b56c7bc76f95dcc1d72290e4ac7.tar.bz2
scummvm-rg350-98150beb38f73b56c7bc76f95dcc1d72290e4ac7.zip
CLOUD: Refactor ConnectionManager/Requests system
ConnectionManager now storages Request * (not generates ids for it), Requests have control on their RequestState, RequestIdPair is now called Response and storages Request * with some response together. All related classes are changed to use it in more clean and understandable way. Request, RequestState and Response are carefully commented/documented.
Diffstat (limited to 'backends/cloud/onedrive')
-rw-r--r--backends/cloud/onedrive/onedrivestorage.cpp46
-rw-r--r--backends/cloud/onedrive/onedrivestorage.h28
-rw-r--r--backends/cloud/onedrive/onedrivetokenrefresher.cpp43
-rw-r--r--backends/cloud/onedrive/onedrivetokenrefresher.h13
4 files changed, 68 insertions, 62 deletions
diff --git a/backends/cloud/onedrive/onedrivestorage.cpp b/backends/cloud/onedrive/onedrivestorage.cpp
index 237557df59..e181fecabb 100644
--- a/backends/cloud/onedrive/onedrivestorage.cpp
+++ b/backends/cloud/onedrive/onedrivestorage.cpp
@@ -44,7 +44,7 @@ OneDriveStorage::OneDriveStorage(Common::String accessToken, Common::String user
_token(accessToken), _uid(userId), _refreshToken(refreshToken) {}
OneDriveStorage::OneDriveStorage(Common::String code) {
- getAccessToken(new Common::Callback<OneDriveStorage, RequestBoolPair>(this, &OneDriveStorage::codeFlowComplete), code);
+ getAccessToken(new Common::Callback<OneDriveStorage, BoolResponse>(this, &OneDriveStorage::codeFlowComplete), code);
}
OneDriveStorage::~OneDriveStorage() {}
@@ -54,11 +54,11 @@ void OneDriveStorage::getAccessToken(BoolCallback callback, Common::String code)
if (!codeFlow && _refreshToken == "") {
warning("OneDriveStorage: no refresh token available to get new access token.");
- if (callback) (*callback)(RequestBoolPair(-1, false));
+ if (callback) (*callback)(BoolResponse(nullptr, false));
return;
}
- Networking::JsonCallback innerCallback = new Common::CallbackBridge<OneDriveStorage, RequestBoolPair, Networking::RequestJsonPair>(this, &OneDriveStorage::tokenRefreshed, callback);
+ Networking::JsonCallback innerCallback = new Common::CallbackBridge<OneDriveStorage, BoolResponse, Networking::JsonResponse>(this, &OneDriveStorage::tokenRefreshed, callback);
Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, "https://login.live.com/oauth20_token.srf");
if (codeFlow) {
request->addPostField("code=" + code);
@@ -73,11 +73,11 @@ void OneDriveStorage::getAccessToken(BoolCallback callback, Common::String code)
ConnMan.addRequest(request);
}
-void OneDriveStorage::tokenRefreshed(BoolCallback callback, Networking::RequestJsonPair pair) {
+void OneDriveStorage::tokenRefreshed(BoolCallback callback, Networking::JsonResponse pair) {
Common::JSONValue *json = pair.value;
if (!json) {
warning("OneDriveStorage: got NULL instead of JSON");
- if (callback) (*callback)(RequestBoolPair(-1, false));
+ if (callback) (*callback)(BoolResponse(nullptr, false));
return;
}
@@ -85,18 +85,18 @@ void OneDriveStorage::tokenRefreshed(BoolCallback callback, Networking::RequestJ
if (!result.contains("access_token") || !result.contains("user_id") || !result.contains("refresh_token")) {
warning("Bad response, no token or user_id passed");
debug("%s", json->stringify().c_str());
- if (callback) (*callback)(RequestBoolPair(-1, false));
+ if (callback) (*callback)(BoolResponse(nullptr, false));
} else {
_token = result.getVal("access_token")->asString();
_uid = result.getVal("user_id")->asString();
_refreshToken = result.getVal("refresh_token")->asString();
g_system->getCloudManager()->save(); //ask CloudManager to save our new refreshToken
- if (callback) (*callback)(RequestBoolPair(-1, true));
+ if (callback) (*callback)(BoolResponse(nullptr, true));
}
delete json;
}
-void OneDriveStorage::codeFlowComplete(RequestBoolPair pair) {
+void OneDriveStorage::codeFlowComplete(BoolResponse pair) {
if (!pair.value) {
warning("OneDriveStorage: failed to get access token through code flow");
return;
@@ -115,7 +115,7 @@ void OneDriveStorage::saveConfig(Common::String keyPrefix) {
ConfMan.set(keyPrefix + "refresh_token", _refreshToken, "cloud");
}
-void OneDriveStorage::printJson(Networking::RequestJsonPair pair) {
+void OneDriveStorage::printJson(Networking::JsonResponse pair) {
Common::JSONValue *json = pair.value;
if (!json) {
warning("printJson: NULL");
@@ -126,10 +126,10 @@ void OneDriveStorage::printJson(Networking::RequestJsonPair pair) {
delete json;
}
-void OneDriveStorage::fileInfoCallback(ReadStreamCallback outerCallback, Networking::RequestJsonPair pair) {
+void OneDriveStorage::fileInfoCallback(Networking::NetworkReadStreamCallback outerCallback, Networking::JsonResponse pair) {
if (!pair.value) {
warning("fileInfoCallback: NULL");
- if (outerCallback) (*outerCallback)(RequestReadStreamPair(pair.id, 0));
+ if (outerCallback) (*outerCallback)(Networking::NetworkReadStreamResponse(pair.request, 0));
return;
}
@@ -137,44 +137,44 @@ void OneDriveStorage::fileInfoCallback(ReadStreamCallback outerCallback, Network
if (result.contains("@content.downloadUrl")) {
const char *url = result.getVal("@content.downloadUrl")->asString().c_str();
if (outerCallback)
- (*outerCallback)(RequestReadStreamPair(
- pair.id,
+ (*outerCallback)(Networking::NetworkReadStreamResponse(
+ pair.request,
new Networking::NetworkReadStream(url, 0, "")
));
} else {
warning("downloadUrl not found in passed JSON");
debug("%s", pair.value->stringify().c_str());
- if (outerCallback) (*outerCallback)(RequestReadStreamPair(pair.id, 0));
+ if (outerCallback) (*outerCallback)(Networking::NetworkReadStreamResponse(pair.request, 0));
}
delete pair.value;
}
-int32 OneDriveStorage::streamFile(Common::String path, ReadStreamCallback outerCallback) {
- Common::String url = "https://api.onedrive.com/v1.0/drive/special/approot:/" + path + ":/";
- Networking::JsonCallback innerCallback = new Common::CallbackBridge<OneDriveStorage, RequestReadStreamPair, Networking::RequestJsonPair>(this, &OneDriveStorage::fileInfoCallback, outerCallback);
+Networking::Request *OneDriveStorage::streamFile(Common::String path, Networking::NetworkReadStreamCallback outerCallback) {
+ Common::String url = "https://api.onedrive.com/v1.0/drive/special/approot:/" + path;
+ Networking::JsonCallback innerCallback = new Common::CallbackBridge<OneDriveStorage, Networking::NetworkReadStreamResponse, Networking::JsonResponse>(this, &OneDriveStorage::fileInfoCallback, outerCallback);
Networking::CurlJsonRequest *request = new OneDriveTokenRefresher(this, innerCallback, url.c_str());
request->addHeader("Authorization: Bearer " + _token);
return ConnMan.addRequest(request);
}
-int32 OneDriveStorage::download(Common::String remotePath, Common::String localPath, BoolCallback callback) {
+Networking::Request *OneDriveStorage::download(Common::String remotePath, Common::String localPath, BoolCallback callback) {
Common::DumpFile *f = new Common::DumpFile();
if (!f->open(localPath, true)) {
warning("OneDriveStorage: unable to open file to download into");
- if (callback) (*callback)(RequestBoolPair(-1, false));
+ if (callback) (*callback)(BoolResponse(nullptr, false));
delete f;
- return -1;
+ return nullptr;
}
return ConnMan.addRequest(new DownloadRequest(this, callback, remotePath, f));
}
-void OneDriveStorage::fileDownloaded(RequestBoolPair pair) {
+void OneDriveStorage::fileDownloaded(BoolResponse pair) {
if (pair.value) debug("file downloaded!");
else debug("download failed!");
}
-int32 OneDriveStorage::syncSaves(BoolCallback callback) {
+Networking::Request *OneDriveStorage::syncSaves(BoolCallback callback) {
//this is not the real syncSaves() implementation
/*
Networking::JsonCallback innerCallback = new Common::Callback<OneDriveStorage, Networking::RequestJsonPair>(this, &OneDriveStorage::printJson);
@@ -182,7 +182,7 @@ int32 OneDriveStorage::syncSaves(BoolCallback callback) {
request->addHeader("Authorization: bearer " + _token);
return ConnMan.addRequest(request);
*/
- return download("pic.jpg", "local/onedrive/2/doom.jpg", new Common::Callback<OneDriveStorage, RequestBoolPair>(this, &OneDriveStorage::fileDownloaded));
+ return download("pic.jpg", "local/onedrive/2/doom.jpg", new Common::Callback<OneDriveStorage, BoolResponse>(this, &OneDriveStorage::fileDownloaded));
}
OneDriveStorage *OneDriveStorage::loadFromConfig(Common::String keyPrefix) {
diff --git a/backends/cloud/onedrive/onedrivestorage.h b/backends/cloud/onedrive/onedrivestorage.h
index be2bcdf04c..858af6c9bf 100644
--- a/backends/cloud/onedrive/onedrivestorage.h
+++ b/backends/cloud/onedrive/onedrivestorage.h
@@ -44,13 +44,13 @@ class OneDriveStorage: public Cloud::Storage {
*/
OneDriveStorage(Common::String code);
- void tokenRefreshed(BoolCallback callback, Networking::RequestJsonPair pair);
- void codeFlowComplete(RequestBoolPair pair);
+ void tokenRefreshed(BoolCallback callback, Networking::JsonResponse pair);
+ void codeFlowComplete(BoolResponse pair);
- void printJson(Networking::RequestJsonPair pair);
- void fileDownloaded(RequestBoolPair pair);
+ void printJson(Networking::JsonResponse pair);
+ void fileDownloaded(BoolResponse pair);
- void fileInfoCallback(ReadStreamCallback outerCallback, Networking::RequestJsonPair pair);
+ void fileInfoCallback(Networking::NetworkReadStreamCallback outerCallback, Networking::JsonResponse pair);
public:
virtual ~OneDriveStorage();
@@ -71,31 +71,31 @@ public:
/** Public Cloud API comes down there. */
/** Returns Common::Array<StorageFile>. */
- virtual int32 listDirectory(Common::String path, FileArrayCallback callback, bool recursive = false) { return -1; } //TODO
+ virtual Networking::Request *listDirectory(Common::String path, FileArrayCallback callback, bool recursive = false) { return nullptr; } //TODO
/** Calls the callback when finished. */
- virtual int32 upload(Common::String path, Common::ReadStream *contents, BoolCallback callback) { return -1; } //TODO
+ virtual Networking::Request *upload(Common::String path, Common::ReadStream *contents, BoolCallback callback) { return nullptr; } //TODO
/** Returns pointer to Networking::NetworkReadStream. */
- virtual int32 streamFile(Common::String path, ReadStreamCallback callback);
+ virtual Networking::Request *streamFile(Common::String path, Networking::NetworkReadStreamCallback callback);
/** Calls the callback when finished. */
- virtual int32 download(Common::String remotePath, Common::String localPath, BoolCallback callback);
+ virtual Networking::Request *download(Common::String remotePath, Common::String localPath, BoolCallback callback);
/** Calls the callback when finished. */
- virtual int32 remove(Common::String path, BoolCallback callback) { return -1; } //TODO
+ virtual Networking::Request *remove(Common::String path, BoolCallback callback) { return nullptr; } //TODO
/** Calls the callback when finished. */
- virtual int32 syncSaves(BoolCallback callback);
+ virtual Networking::Request *syncSaves(BoolCallback callback);
/** Calls the callback when finished. */
- virtual int32 createDirectory(Common::String path, BoolCallback callback) { return -1; } //TODO
+ virtual Networking::Request *createDirectory(Common::String path, BoolCallback callback) { return nullptr; } //TODO
/** Calls the callback when finished. */
- virtual int32 touch(Common::String path, BoolCallback callback) { return -1; } //TODO
+ virtual Networking::Request *touch(Common::String path, BoolCallback callback) { return nullptr; } //TODO
/** Returns the StorageInfo struct. */
- virtual int32 info(StorageInfoCallback callback) { return -1; } //TODO
+ virtual Networking::Request *info(StorageInfoCallback callback) { return nullptr; } //TODO
/** Returns whether saves sync process is running. */
virtual bool isSyncing() { return false; } //TODO
diff --git a/backends/cloud/onedrive/onedrivetokenrefresher.cpp b/backends/cloud/onedrive/onedrivetokenrefresher.cpp
index d3ec0cc668..6943d89297 100644
--- a/backends/cloud/onedrive/onedrivetokenrefresher.cpp
+++ b/backends/cloud/onedrive/onedrivetokenrefresher.cpp
@@ -38,50 +38,45 @@ OneDriveTokenRefresher::OneDriveTokenRefresher(OneDriveStorage *parent, Networki
_parentStorage(parent),
_innerRequest(
new CurlJsonRequest(
- new Common::Callback<OneDriveTokenRefresher, Networking::RequestJsonPair>(this, &OneDriveTokenRefresher::innerRequestCallback),
+ new Common::Callback<OneDriveTokenRefresher, Networking::JsonResponse>(this, &OneDriveTokenRefresher::innerRequestCallback),
url
)
- ), _jsonCallback(callback), _retryId(-1), _started(false) {}
+ ), _jsonCallback(callback), _retryRequest(nullptr), _started(false) {}
OneDriveTokenRefresher::~OneDriveTokenRefresher() {}
-void OneDriveTokenRefresher::innerRequestCallback(Networking::RequestJsonPair pair) {
+void OneDriveTokenRefresher::innerRequestCallback(Networking::JsonResponse pair) {
if (!pair.value) {
//notify user of failure
warning("OneDriveTokenRefresher: got NULL instead of JSON");
- ConnMan.getRequestInfo(_id).state = Networking::FINISHED;
- if (_jsonCallback) (*_jsonCallback)(Networking::RequestJsonPair(_id, 0));
+ finish();
return;
}
Common::JSONObject result = pair.value->asObject();
if (result.contains("error")) {
//new token needed => request token & then retry original request
- ConnMan.getRequestInfo(pair.id).state = Networking::PAUSED;
- _retryId = pair.id;
+ if (pair.request) pair.request->pause();
+ _retryRequest = pair.request;
delete pair.value;
- _parentStorage->getAccessToken(new Common::Callback<OneDriveTokenRefresher, Storage::RequestBoolPair>(this, &OneDriveTokenRefresher::tokenRefreshed));
+ _parentStorage->getAccessToken(new Common::Callback<OneDriveTokenRefresher, Storage::BoolResponse>(this, &OneDriveTokenRefresher::tokenRefreshed));
return;
}
//notify user of success
- ConnMan.getRequestInfo(_id).state = Networking::FINISHED;
- if (_jsonCallback) (*_jsonCallback)(Networking::RequestJsonPair(_id, pair.value));
+ finishJson(pair.value);
}
-void OneDriveTokenRefresher::tokenRefreshed(Storage::RequestBoolPair pair) {
+void OneDriveTokenRefresher::tokenRefreshed(Storage::BoolResponse pair) {
if (!pair.value) {
//failed to refresh token, notify user with NULL in original callback
warning("OneDriveTokenRefresher: failed to refresh token");
- ConnMan.getRequestInfo(_id).state = Networking::FINISHED;
- if (_jsonCallback) (*_jsonCallback)(Networking::RequestJsonPair(_id, 0));
+ finish();
return;
}
//successfully received refreshed token, can restart the original request now
- Networking::RequestInfo &info = ConnMan.getRequestInfo(_retryId);
- info.state = Networking::RETRY;
- info.retryInSeconds = 1;
+ if (_retryRequest) _retryRequest->retry(1);
//update headers: first change header with token, then pass those to request
for (uint32 i = 0; i < _headers.size(); ++i) {
@@ -89,7 +84,7 @@ void OneDriveTokenRefresher::tokenRefreshed(Storage::RequestBoolPair pair) {
_headers[i] = "Authorization: bearer " + _parentStorage->accessToken();
}
}
- CurlJsonRequest *retryRequest = (CurlJsonRequest *)info.request;
+ CurlJsonRequest *retryRequest = (CurlJsonRequest *)_retryRequest;
if (retryRequest) retryRequest->setHeaders(_headers);
}
@@ -105,11 +100,19 @@ void OneDriveTokenRefresher::handle() {
void OneDriveTokenRefresher::restart() {
//can't restart as all headers were passed to _innerRequest which is probably dead now
warning("OneDriveTokenRefresher: cannot be restarted");
- ConnMan.getRequestInfo(_id).state = Networking::FINISHED;
- if (_jsonCallback) (*_jsonCallback)(Networking::RequestJsonPair(_id, 0));
+ finish();
}
-Cloud::Storage::RequestReadStreamPair OneDriveTokenRefresher::execute() {
+void OneDriveTokenRefresher::finish() {
+ finishJson(0);
+}
+
+void OneDriveTokenRefresher::finishJson(Common::JSONValue *json) {
+ Request::finish();
+ if (_jsonCallback) (*_jsonCallback)(Networking::JsonResponse(this, json));
+}
+
+Networking::NetworkReadStreamResponse OneDriveTokenRefresher::execute() {
if (!_started) {
for (uint32 i = 0; i < _headers.size(); ++i)
_innerRequest->addHeader(_headers[i]);
diff --git a/backends/cloud/onedrive/onedrivetokenrefresher.h b/backends/cloud/onedrive/onedrivetokenrefresher.h
index 58b7dcedb4..c09879feed 100644
--- a/backends/cloud/onedrive/onedrivetokenrefresher.h
+++ b/backends/cloud/onedrive/onedrivetokenrefresher.h
@@ -35,24 +35,27 @@ class OneDriveStorage;
class OneDriveTokenRefresher: public Networking::CurlJsonRequest {
OneDriveStorage *_parentStorage;
Common::Array<Common::String> _headers;
- Networking::CurlJsonRequest *_innerRequest;
+ CurlJsonRequest *_innerRequest;
Networking::JsonCallback _jsonCallback;
- int32 _retryId;
+ Request *_retryRequest;
bool _started;
- void innerRequestCallback(Networking::RequestJsonPair pair);
- void tokenRefreshed(Storage::RequestBoolPair pair);
+ void innerRequestCallback(Networking::JsonResponse pair);
+ void tokenRefreshed(Storage::BoolResponse pair);
+
+ virtual void finishJson(Common::JSONValue *json);
public:
OneDriveTokenRefresher(OneDriveStorage *parent, Networking::JsonCallback callback, const char *url);
virtual ~OneDriveTokenRefresher();
virtual void handle();
virtual void restart();
+ virtual void finish();
virtual void setHeaders(Common::Array<Common::String> &headers) { _headers = headers; }
virtual void addHeader(Common::String header) { _headers.push_back(header); }
virtual void addPostField(Common::String field) { _innerRequest->addPostField(field); }
- virtual Cloud::Storage::RequestReadStreamPair execute();
+ virtual Networking::NetworkReadStreamResponse execute();
};
} //end of namespace OneDrive