aboutsummaryrefslogtreecommitdiff
path: root/backends/cloud/dropbox
diff options
context:
space:
mode:
authorAlexander Tkachev2016-05-31 01:51:32 +0600
committerAlexander Tkachev2016-08-24 16:07:55 +0600
commiteb63b50b7f0841e40365f3fbafa9810e8b190872 (patch)
tree4f348f12298c15e8a5885b5a74ce3788493b9a7e /backends/cloud/dropbox
parent001b417f33beeb3b2da11f58105b971dc7e6f600 (diff)
downloadscummvm-rg350-eb63b50b7f0841e40365f3fbafa9810e8b190872.tar.gz
scummvm-rg350-eb63b50b7f0841e40365f3fbafa9810e8b190872.tar.bz2
scummvm-rg350-eb63b50b7f0841e40365f3fbafa9810e8b190872.zip
CLOUD: Refactor Request
Added ErrorResponse and ErrorCallback. Each Request now has an ErrorCallback, which should be called instead of usual callback in case of failure.
Diffstat (limited to 'backends/cloud/dropbox')
-rw-r--r--backends/cloud/dropbox/dropboxlistdirectoryrequest.cpp72
-rw-r--r--backends/cloud/dropbox/dropboxlistdirectoryrequest.h8
-rw-r--r--backends/cloud/dropbox/dropboxstorage.cpp123
-rw-r--r--backends/cloud/dropbox/dropboxstorage.h33
-rw-r--r--backends/cloud/dropbox/dropboxuploadrequest.cpp81
-rw-r--r--backends/cloud/dropbox/dropboxuploadrequest.h8
6 files changed, 150 insertions, 175 deletions
diff --git a/backends/cloud/dropbox/dropboxlistdirectoryrequest.cpp b/backends/cloud/dropbox/dropboxlistdirectoryrequest.cpp
index 2796a4c19e..d782f81a69 100644
--- a/backends/cloud/dropbox/dropboxlistdirectoryrequest.cpp
+++ b/backends/cloud/dropbox/dropboxlistdirectoryrequest.cpp
@@ -31,8 +31,8 @@
namespace Cloud {
namespace Dropbox {
-DropboxListDirectoryRequest::DropboxListDirectoryRequest(Common::String token, Common::String path, Storage::ListDirectoryCallback cb, bool recursive):
- Networking::Request(0), _requestedPath(path), _requestedRecursive(recursive), _listDirectoryCallback(cb),
+DropboxListDirectoryRequest::DropboxListDirectoryRequest(Common::String token, Common::String path, Storage::ListDirectoryCallback cb, Networking::ErrorCallback ecb, bool recursive):
+ Networking::Request(nullptr, ecb), _requestedPath(path), _requestedRecursive(recursive), _listDirectoryCallback(cb),
_token(token), _workingRequest(nullptr), _ignoreCallback(false) {
start();
}
@@ -49,8 +49,9 @@ void DropboxListDirectoryRequest::start() {
_files.clear();
_ignoreCallback = false;
- Networking::JsonCallback innerCallback = new Common::Callback<DropboxListDirectoryRequest, Networking::JsonResponse>(this, &DropboxListDirectoryRequest::responseCallback);
- Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, "https://api.dropboxapi.com/2/files/list_folder");
+ Networking::JsonCallback callback = new Common::Callback<DropboxListDirectoryRequest, Networking::JsonResponse>(this, &DropboxListDirectoryRequest::responseCallback);
+ Networking::ErrorCallback failureCallback = new Common::Callback<DropboxListDirectoryRequest, Networking::ErrorResponse>(this, &DropboxListDirectoryRequest::errorCallback);
+ Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(callback, failureCallback, "https://api.dropboxapi.com/2/files/list_folder");
request->addHeader("Authorization: Bearer " + _token);
request->addHeader("Content-Type: application/json");
@@ -66,33 +67,32 @@ void DropboxListDirectoryRequest::start() {
_workingRequest = ConnMan.addRequest(request);
}
-
-void DropboxListDirectoryRequest::responseCallback(Networking::JsonResponse pair) {
+void DropboxListDirectoryRequest::responseCallback(Networking::JsonResponse response) {
_workingRequest = nullptr;
if (_ignoreCallback) return;
- ListDirectoryStatus status(_files);
- Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)pair.request;
+ Networking::ErrorResponse error(this);
+ Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request;
if (rq && rq->getNetworkReadStream())
- status.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
+ error.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
- Common::JSONValue *json = pair.value;
+ Common::JSONValue *json = response.value;
if (json) {
- Common::JSONObject response = json->asObject();
+ Common::JSONObject responseObjecct = json->asObject();
- if (response.contains("error") || response.contains("error_summary")) {
- warning("Dropbox returned error: %s", response.getVal("error_summary")->asString().c_str());
- status.failed = true;
- status.response = json->stringify();
- finishStatus(status);
+ if (responseObjecct.contains("error") || responseObjecct.contains("error_summary")) {
+ warning("Dropbox returned error: %s", responseObjecct.getVal("error_summary")->asString().c_str());
+ error.failed = true;
+ error.response = json->stringify();
+ finishError(error);
delete json;
return;
}
//TODO: check that ALL keys exist AND HAVE RIGHT TYPE to avoid segfaults
- if (response.contains("entries")) {
- Common::JSONArray items = response.getVal("entries")->asArray();
+ if (responseObjecct.contains("entries")) {
+ Common::JSONArray items = responseObjecct.getVal("entries")->asArray();
for (uint32 i = 0; i < items.size(); ++i) {
Common::JSONObject item = items[i]->asObject();
Common::String path = item.getVal("path_lower")->asString();
@@ -106,47 +106,47 @@ void DropboxListDirectoryRequest::responseCallback(Networking::JsonResponse pair
}
}
- bool hasMore = (response.contains("has_more") && response.getVal("has_more")->asBool());
+ bool hasMore = (responseObjecct.contains("has_more") && responseObjecct.getVal("has_more")->asBool());
- if (hasMore) {
- Networking::JsonCallback innerCallback = new Common::Callback<DropboxListDirectoryRequest, Networking::JsonResponse>(this, &DropboxListDirectoryRequest::responseCallback);
- Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, "https://api.dropboxapi.com/2/files/list_folder/continue");
+ if (hasMore) {
+ Networking::JsonCallback callback = new Common::Callback<DropboxListDirectoryRequest, Networking::JsonResponse>(this, &DropboxListDirectoryRequest::responseCallback);
+ Networking::ErrorCallback failureCallback = new Common::Callback<DropboxListDirectoryRequest, Networking::ErrorResponse>(this, &DropboxListDirectoryRequest::errorCallback);
+ Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(callback, failureCallback, "https://api.dropboxapi.com/2/files/list_folder/continue");
request->addHeader("Authorization: Bearer " + _token);
request->addHeader("Content-Type: application/json");
Common::JSONObject jsonRequestParameters;
- jsonRequestParameters.setVal("cursor", new Common::JSONValue(response.getVal("cursor")->asString()));
+ jsonRequestParameters.setVal("cursor", new Common::JSONValue(responseObjecct.getVal("cursor")->asString()));
Common::JSONValue value(jsonRequestParameters);
request->addPostField(Common::JSON::stringify(&value));
_workingRequest = ConnMan.addRequest(request);
} else {
- finishStatus(status);
+ finishSuccess(_files);
}
} else {
warning("null, not json");
- status.failed = true;
- finishStatus(status);
+ error.failed = true;
+ finishError(error);
}
delete json;
}
+void DropboxListDirectoryRequest::errorCallback(Networking::ErrorResponse error) {
+ _workingRequest = nullptr;
+ if (_ignoreCallback) return;
+ finishError(error);
+}
+
void DropboxListDirectoryRequest::handle() {}
void DropboxListDirectoryRequest::restart() { start(); }
-void DropboxListDirectoryRequest::finish() {
- Common::Array<StorageFile> files;
- ListDirectoryStatus status(files);
- status.interrupted = true;
- finishStatus(status);
-}
-
-void DropboxListDirectoryRequest::finishStatus(ListDirectoryStatus status) {
- Request::finish();
- if (_listDirectoryCallback) (*_listDirectoryCallback)(Storage::ListDirectoryResponse(this, status));
+void DropboxListDirectoryRequest::finishSuccess(Common::Array<StorageFile> &files) {
+ Request::finishSuccess();
+ if (_listDirectoryCallback) (*_listDirectoryCallback)(Storage::ListDirectoryResponse(this, files));
}
} // End of namespace Dropbox
diff --git a/backends/cloud/dropbox/dropboxlistdirectoryrequest.h b/backends/cloud/dropbox/dropboxlistdirectoryrequest.h
index 3c7c1fd464..3a83af06aa 100644
--- a/backends/cloud/dropbox/dropboxlistdirectoryrequest.h
+++ b/backends/cloud/dropbox/dropboxlistdirectoryrequest.h
@@ -42,15 +42,15 @@ class DropboxListDirectoryRequest: public Networking::Request {
bool _ignoreCallback;
void start();
- void responseCallback(Networking::JsonResponse pair);
- void finishStatus(ListDirectoryStatus status);
+ void responseCallback(Networking::JsonResponse response);
+ void errorCallback(Networking::ErrorResponse error);
+ void finishSuccess(Common::Array<StorageFile> &files);
public:
- DropboxListDirectoryRequest(Common::String token, Common::String path, Storage::ListDirectoryCallback cb, bool recursive = false);
+ DropboxListDirectoryRequest(Common::String token, Common::String path, Storage::ListDirectoryCallback cb, Networking::ErrorCallback ecb, bool recursive = false);
virtual ~DropboxListDirectoryRequest();
virtual void handle();
virtual void restart();
- virtual void finish();
};
} // End of namespace Dropbox
diff --git a/backends/cloud/dropbox/dropboxstorage.cpp b/backends/cloud/dropbox/dropboxstorage.cpp
index b33e2b6776..d22e0abf60 100644
--- a/backends/cloud/dropbox/dropboxstorage.cpp
+++ b/backends/cloud/dropbox/dropboxstorage.cpp
@@ -96,118 +96,93 @@ void DropboxStorage::saveConfig(Common::String keyPrefix) {
ConfMan.set(keyPrefix + "user_id", _uid, "cloud");
}
-void DropboxStorage::printFiles(FileArrayResponse pair) {
+void DropboxStorage::printFiles(FileArrayResponse response) {
debug("files:");
- Common::Array<StorageFile> &files = pair.value;
+ Common::Array<StorageFile> &files = response.value;
for (uint32 i = 0; i < files.size(); ++i)
debug("\t%s", files[i].name().c_str());
}
-void DropboxStorage::printBool(BoolResponse pair) {
- debug("bool: %s", (pair.value?"true":"false"));
+void DropboxStorage::printBool(BoolResponse response) {
+ debug("bool: %s", (response.value?"true":"false"));
}
-void DropboxStorage::printUploadStatus(UploadResponse pair) {
- debug(" ");
- UploadStatus status = pair.value;
- if (status.interrupted) {
- debug("upload interrupted by user");
- return;
- }
- if (status.failed) {
- debug("upload failed with following response:");
- debug("%s", status.response.c_str());
- return;
- }
- debug("upload HTTP response code = %ld", status.httpResponseCode);
- if (!status.failed) {
- debug("uploaded file info:");
- debug("\tpath: %s", status.file.path().c_str());
- debug("\tsize: %u", status.file.size());
- debug("\ttimestamp: %u", status.file.timestamp());
- }
+void DropboxStorage::printStorageFile(UploadResponse response) {
+ debug("\nuploaded file info:");
+ debug("\tpath: %s", response.value.path().c_str());
+ debug("\tsize: %u", response.value.size());
+ debug("\ttimestamp: %u", response.value.timestamp());
}
-Networking::Request *DropboxStorage::listDirectory(Common::String path, ListDirectoryCallback outerCallback, bool recursive) {
- return ConnMan.addRequest(new DropboxListDirectoryRequest(_token, path, outerCallback, recursive));
+void DropboxStorage::printErrorResponse(Networking::ErrorResponse error) {
+ debug("error response (%s, %ld):", (error.failed ? "failed" : "interrupted"), error.httpResponseCode);
+ debug("%s", error.response.c_str());
}
-Networking::Request *DropboxStorage::upload(Common::String path, Common::SeekableReadStream *contents, UploadCallback callback) {
- return ConnMan.addRequest(new DropboxUploadRequest(_token, path, contents, callback));
+Networking::ErrorCallback DropboxStorage::getErrorPrintingCallback() {
+ return new Common::Callback<DropboxStorage, Networking::ErrorResponse>(this, &DropboxStorage::printErrorResponse);
}
-Networking::Request *DropboxStorage::upload(Common::String remotePath, Common::String localPath, UploadCallback callback) {
+Networking::Request *DropboxStorage::listDirectory(Common::String path, ListDirectoryCallback outerCallback, Networking::ErrorCallback errorCallback, bool recursive) {
+ return ConnMan.addRequest(new DropboxListDirectoryRequest(_token, path, outerCallback, errorCallback, recursive));
+}
+
+Networking::Request *DropboxStorage::upload(Common::String path, Common::SeekableReadStream *contents, UploadCallback callback, Networking::ErrorCallback errorCallback) {
+ return ConnMan.addRequest(new DropboxUploadRequest(_token, path, contents, callback, errorCallback));
+}
+
+Networking::Request *DropboxStorage::upload(Common::String remotePath, Common::String localPath, UploadCallback callback, Networking::ErrorCallback errorCallback) {
Common::File *f = new Common::File();
if (!f->open(localPath)) {
warning("DropboxStorage: unable to open file to upload from");
- UploadStatus status(false, true, StorageFile(), "", -1);
- if (callback) (*callback)(UploadResponse(nullptr, status));
+ if (errorCallback) (*errorCallback)(Networking::ErrorResponse(nullptr, false, true, "", -1));
+ delete errorCallback;
+ delete callback;
delete f;
return nullptr;
}
- return upload(remotePath, f, callback);
+ return upload(remotePath, f, callback, errorCallback);
}
-Networking::Request *DropboxStorage::streamFile(Common::String path, Networking::NetworkReadStreamCallback callback) {
+Networking::Request *DropboxStorage::streamFile(Common::String path, Networking::NetworkReadStreamCallback callback, Networking::ErrorCallback errorCallback) {
Common::JSONObject jsonRequestParameters;
jsonRequestParameters.setVal("path", new Common::JSONValue(path));
Common::JSONValue value(jsonRequestParameters);
- Networking::CurlRequest *request = new Networking::CurlRequest(0, "https://content.dropboxapi.com/2/files/download");
+ Networking::CurlRequest *request = new Networking::CurlRequest(nullptr, nullptr, "https://content.dropboxapi.com/2/files/download"); //TODO: is it right?
request->addHeader("Authorization: Bearer " + _token);
request->addHeader("Dropbox-API-Arg: " + Common::JSON::stringify(&value));
request->addHeader("Content-Type: "); //required to be empty (as we do POST, it's usually app/form-url-encoded)
- Networking::NetworkReadStreamResponse pair = request->execute();
- if (callback) (*callback)(pair);
- return pair.request;
+ Networking::NetworkReadStreamResponse response = request->execute();
+ if (callback) (*callback)(response);
+ return response.request;
}
-Networking::Request *DropboxStorage::download(Common::String remotePath, Common::String localPath, BoolCallback callback) {
+Networking::Request *DropboxStorage::download(Common::String remotePath, Common::String localPath, BoolCallback callback, Networking::ErrorCallback errorCallback) {
Common::DumpFile *f = new Common::DumpFile();
if (!f->open(localPath, true)) {
warning("DropboxStorage: unable to open file to download into");
- if (callback) (*callback)(BoolResponse(nullptr, false));
+ if (errorCallback) (*errorCallback)(Networking::ErrorResponse(nullptr, false, true, "", -1));
delete f;
return nullptr;
}
- return ConnMan.addRequest(new DownloadRequest(this, callback, remotePath, f));
+ return ConnMan.addRequest(new DownloadRequest(this, callback, errorCallback, remotePath, f));
}
-Networking::Request *DropboxStorage::downloadFolder(Common::String remotePath, Common::String localPath, FileArrayCallback callback, bool recursive) {
- return ConnMan.addRequest(new FolderDownloadRequest(this, callback, remotePath, localPath, recursive));
+Networking::Request *DropboxStorage::downloadFolder(Common::String remotePath, Common::String localPath, FileArrayCallback callback, Networking::ErrorCallback errorCallback, bool recursive) {
+ return ConnMan.addRequest(new FolderDownloadRequest(this, callback, errorCallback, remotePath, localPath, recursive));
}
-Networking::Request *DropboxStorage::syncSaves(BoolCallback callback) {
- //this is not the real syncSaves() implementation
- //"" is root in Dropbox, not "/"
- //this must create all these directories:
- //return download("/remote/test.jpg", "local/a/b/c/d/test.jpg", 0);
- /*
- return downloadFolder(
- "/not_flat", "local/not_flat_1_level/",
- new Common::Callback<DropboxStorage, FileArrayResponse>(this, &DropboxStorage::printFiles),
- false
- );
- */
- /*
- debug("%s", ConfMan.get("savepath").c_str());
- Common::StringArray arr = g_system->getSavefileManager()->listSavefiles("*");
- for (uint32 i = 0; i < arr.size(); ++i) {
- debug("%s", arr[i].c_str());
- }
- debug("EOL");
- */
- //return upload("/remote/backslash", "C:\\Users\\Tkachov\\AppData\\Roaming\\ScummVM\\Saved games\\sword25.000", new Common::Callback<DropboxStorage, UploadResponse>(this, &DropboxStorage::printUploadStatus));
- //return upload("/remote/slash", "C:/Users/Tkachov/AppData/Roaming/ScummVM/Saved games/sword25.000", new Common::Callback<DropboxStorage, UploadResponse>(this, &DropboxStorage::printUploadStatus));
- return ConnMan.addRequest(new SavesSyncRequest(this, new Common::Callback<DropboxStorage, BoolResponse>(this, &DropboxStorage::printBool)));
- //return upload("/remote/test4.bmp", "final.bmp", new Common::Callback<DropboxStorage, UploadResponse>(this, &DropboxStorage::printUploadStatus));
+Networking::Request *DropboxStorage::syncSaves(BoolCallback callback, Networking::ErrorCallback errorCallback) {
+ //this might be the real syncSaves() implementation
+ return ConnMan.addRequest(new SavesSyncRequest(this, new Common::Callback<DropboxStorage, BoolResponse>(this, &DropboxStorage::printBool), getErrorPrintingCallback())); //TODO
}
-Networking::Request *DropboxStorage::info(StorageInfoCallback outerCallback) {
+Networking::Request *DropboxStorage::info(StorageInfoCallback outerCallback, Networking::ErrorCallback errorCallback) {
Networking::JsonCallback innerCallback = new Common::CallbackBridge<DropboxStorage, StorageInfoResponse, Networking::JsonResponse>(this, &DropboxStorage::infoInnerCallback, outerCallback);
- Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, "https://api.dropboxapi.com/1/account/info");
+ Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, errorCallback, "https://api.dropboxapi.com/1/account/info");
request->addHeader("Authorization: Bearer " + _token);
return ConnMan.addRequest(request);
//that callback bridge wraps the outerCallback (passed in arguments from user) into innerCallback
@@ -216,8 +191,8 @@ Networking::Request *DropboxStorage::info(StorageInfoCallback outerCallback) {
//and then calls the outerCallback (which wants to receive StorageInfo, not void *)
}
-void DropboxStorage::infoInnerCallback(StorageInfoCallback outerCallback, Networking::JsonResponse pair) {
- Common::JSONValue *json = pair.value;
+void DropboxStorage::infoInnerCallback(StorageInfoCallback outerCallback, Networking::JsonResponse response) {
+ Common::JSONValue *json = response.value;
if (!json) {
warning("NULL passed instead of JSON");
delete outerCallback;
@@ -241,11 +216,11 @@ void DropboxStorage::infoInnerCallback(StorageInfoCallback outerCallback, Networ
delete json;
}
-void DropboxStorage::infoMethodCallback(StorageInfoResponse pair) {
+void DropboxStorage::infoMethodCallback(StorageInfoResponse response) {
debug("\nStorage info:");
- debug("User name: %s", pair.value.name().c_str());
- debug("Email: %s", pair.value.email().c_str());
- debug("Disk usage: %u/%u", pair.value.used(), pair.value.available());
+ debug("User name: %s", response.value.name().c_str());
+ debug("Email: %s", response.value.email().c_str());
+ debug("Disk usage: %u/%u", response.value.used(), response.value.available());
}
DropboxStorage *DropboxStorage::loadFromConfig(Common::String keyPrefix) {
@@ -298,7 +273,7 @@ void DropboxStorage::authThroughConsole() {
void DropboxStorage::getAccessToken(Common::String code) {
Networking::JsonCallback callback = new Common::GlobalFunctionCallback<Networking::JsonResponse>(saveAccessTokenCallback);
- Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(callback, "https://api.dropboxapi.com/1/oauth2/token");
+ Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(callback, nullptr, "https://api.dropboxapi.com/1/oauth2/token"); //TODO
request->addPostField("code=" + code);
request->addPostField("grant_type=authorization_code");
request->addPostField("client_id=" + Common::String(KEY));
diff --git a/backends/cloud/dropbox/dropboxstorage.h b/backends/cloud/dropbox/dropboxstorage.h
index d9967d69f6..0082e5cebd 100644
--- a/backends/cloud/dropbox/dropboxstorage.h
+++ b/backends/cloud/dropbox/dropboxstorage.h
@@ -45,9 +45,12 @@ class DropboxStorage: public Cloud::Storage {
/** Constructs StorageInfo based on JSON response from cloud. */
void infoInnerCallback(StorageInfoCallback outerCallback, Networking::JsonResponse json);
- void printFiles(FileArrayResponse pair);
- void printBool(BoolResponse pair);
- void printUploadStatus(UploadResponse pair);
+ void printFiles(FileArrayResponse response);
+ void printBool(BoolResponse response);
+ void printStorageFile(UploadResponse response);
+ void printErrorResponse(Networking::ErrorResponse error);
+
+ Networking::ErrorCallback getErrorPrintingCallback();
public:
virtual ~DropboxStorage();
@@ -68,38 +71,38 @@ public:
/** Public Cloud API comes down there. */
/** Returns ListDirectoryStatus struct with list of files. */
- virtual Networking::Request *listDirectory(Common::String path, ListDirectoryCallback callback, bool recursive = false);
+ virtual Networking::Request *listDirectory(Common::String path, ListDirectoryCallback callback, Networking::ErrorCallback errorCallback, bool recursive = false);
/** Returns UploadStatus struct with info about uploaded file. */
- virtual Networking::Request *upload(Common::String path, Common::SeekableReadStream *contents, UploadCallback callback);
- virtual Networking::Request *upload(Common::String remotePath, Common::String localPath, UploadCallback callback);
+ virtual Networking::Request *upload(Common::String path, Common::SeekableReadStream *contents, UploadCallback callback, Networking::ErrorCallback errorCallback);
+ virtual Networking::Request *upload(Common::String remotePath, Common::String localPath, UploadCallback callback, Networking::ErrorCallback errorCallback);
/** Returns pointer to Networking::NetworkReadStream. */
- virtual Networking::Request *streamFile(Common::String path, Networking::NetworkReadStreamCallback callback);
+ virtual Networking::Request *streamFile(Common::String path, Networking::NetworkReadStreamCallback callback, Networking::ErrorCallback errorCallback);
/** Calls the callback when finished. */
- virtual Networking::Request *download(Common::String remotePath, Common::String localPath, BoolCallback callback);
+ virtual Networking::Request *download(Common::String remotePath, Common::String localPath, BoolCallback callback, Networking::ErrorCallback errorCallback);
/** Returns Common::Array<StorageFile> with list of files, which were not downloaded. */
- virtual Networking::Request *downloadFolder(Common::String remotePath, Common::String localPath, FileArrayCallback callback, bool recursive = false);
+ virtual Networking::Request *downloadFolder(Common::String remotePath, Common::String localPath, FileArrayCallback callback, Networking::ErrorCallback errorCallback, bool recursive = false);
/** Calls the callback when finished. */
- virtual Networking::Request *remove(Common::String path, BoolCallback callback) { return nullptr; } //TODO
+ virtual Networking::Request *remove(Common::String path, BoolCallback callback, Networking::ErrorCallback errorCallback) { return nullptr; } //TODO
/** Calls the callback when finished. */
- virtual Networking::Request *syncSaves(BoolCallback callback);
+ virtual Networking::Request *syncSaves(BoolCallback callback, Networking::ErrorCallback errorCallback);
/** Calls the callback when finished. */
- virtual Networking::Request *createDirectory(Common::String path, BoolCallback callback) { return nullptr; } //TODO
+ virtual Networking::Request *createDirectory(Common::String path, BoolCallback callback, Networking::ErrorCallback errorCallback) { return nullptr; } //TODO
/** Calls the callback when finished. */
- virtual Networking::Request *touch(Common::String path, BoolCallback callback) { return nullptr; } //TODO
+ virtual Networking::Request *touch(Common::String path, BoolCallback callback, Networking::ErrorCallback errorCallback) { return nullptr; } //TODO
/** Returns the StorageInfo struct. */
- virtual Networking::Request *info(StorageInfoCallback callback);
+ virtual Networking::Request *info(StorageInfoCallback callback, Networking::ErrorCallback errorCallback);
/** This method is passed into info(). (Temporary) */
- void infoMethodCallback(StorageInfoResponse pair);
+ void infoMethodCallback(StorageInfoResponse response);
/** Returns whether saves sync process is running. */
virtual bool isSyncing() { return false; } //TODO
diff --git a/backends/cloud/dropbox/dropboxuploadrequest.cpp b/backends/cloud/dropbox/dropboxuploadrequest.cpp
index e64a8837b8..50a1b8a612 100644
--- a/backends/cloud/dropbox/dropboxuploadrequest.cpp
+++ b/backends/cloud/dropbox/dropboxuploadrequest.cpp
@@ -32,8 +32,8 @@
namespace Cloud {
namespace Dropbox {
-DropboxUploadRequest::DropboxUploadRequest(Common::String token, Common::String path, Common::SeekableReadStream *contents, Storage::UploadCallback callback):
- Networking::Request(0), _token(token), _savePath(path), _contentsStream(contents), _uploadCallback(callback),
+DropboxUploadRequest::DropboxUploadRequest(Common::String token, Common::String path, Common::SeekableReadStream *contents, Storage::UploadCallback callback, Networking::ErrorCallback ecb):
+ Networking::Request(nullptr, ecb), _token(token), _savePath(path), _contentsStream(contents), _uploadCallback(callback),
_workingRequest(nullptr), _ignoreCallback(false) {
start();
}
@@ -50,7 +50,7 @@ void DropboxUploadRequest::start() {
if (_workingRequest) _workingRequest->finish();
if (!_contentsStream->seek(0)) {
warning("DropboxUploadRequest: cannot restart because stream couldn't seek(0)");
- finish();
+ finishError(Networking::ErrorResponse(this, false, true, "", -1));
}
_ignoreCallback = false;
@@ -97,8 +97,9 @@ void DropboxUploadRequest::uploadNextPart() {
}
Common::JSONValue value(jsonRequestParameters);
- Networking::JsonCallback innerCallback = new Common::Callback<DropboxUploadRequest, Networking::JsonResponse>(this, &DropboxUploadRequest::partUploadedCallback);
- Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, url);
+ Networking::JsonCallback callback = new Common::Callback<DropboxUploadRequest, Networking::JsonResponse>(this, &DropboxUploadRequest::partUploadedCallback);
+ Networking::ErrorCallback failureCallback = new Common::Callback<DropboxUploadRequest, Networking::ErrorResponse>(this, &DropboxUploadRequest::partUploadedErrorCallback);
+ Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(callback, failureCallback, url);
request->addHeader("Authorization: Bearer " + _token);
request->addHeader("Content-Type: application/octet-stream");
request->addHeader("Dropbox-API-Arg: " + Common::JSON::stringify(&value));
@@ -110,46 +111,45 @@ void DropboxUploadRequest::uploadNextPart() {
_workingRequest = ConnMan.addRequest(request);
}
-void DropboxUploadRequest::partUploadedCallback(Networking::JsonResponse pair) {
- if (_ignoreCallback) return;
+void DropboxUploadRequest::partUploadedCallback(Networking::JsonResponse response) {
+ debug("partUploadedCallback");
_workingRequest = nullptr;
+ if (_ignoreCallback) return;
- UploadStatus status;
- Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)pair.request;
+ Networking::ErrorResponse error(this, false, true, "", -1);
+ Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request;
if (rq && rq->getNetworkReadStream())
- status.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
+ error.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
- Common::JSONValue *json = pair.value;
+ Common::JSONValue *json = response.value;
if (json) {
bool needsFinishRequest = false;
if (json->isObject()) {
- Common::JSONObject response = json->asObject();
+ Common::JSONObject object = json->asObject();
//debug("%s", json->stringify(true).c_str());
- if (response.contains("error") || response.contains("error_summary")) {
- warning("Dropbox returned error: %s", response.getVal("error_summary")->asString().c_str());
+ if (object.contains("error") || object.contains("error_summary")) {
+ warning("Dropbox returned error: %s", object.getVal("error_summary")->asString().c_str());
delete json;
- status.failed = true;
- status.response = json->stringify(true);
- finishUpload(status);
+ error.response = json->stringify(true);
+ finishError(error);
return;
}
- if (response.contains("server_modified")) {
+ if (object.contains("server_modified")) {
//finished
- Common::String path = response.getVal("path_lower")->asString();
- uint32 size = response.getVal("size")->asIntegerNumber();
- uint32 timestamp = ISO8601::convertToTimestamp(response.getVal("server_modified")->asString());
- status.file = StorageFile(path, size, timestamp, false);
- finishUpload(status);
+ Common::String path = object.getVal("path_lower")->asString();
+ uint32 size = object.getVal("size")->asIntegerNumber();
+ uint32 timestamp = ISO8601::convertToTimestamp(object.getVal("server_modified")->asString());
+ finishSuccess(StorageFile(path, size, timestamp, false));
return;
}
if (_sessionId == "") {
- if (response.contains("session_id"))
- _sessionId = response.getVal("session_id")->asString();
+ if (object.contains("session_id"))
+ _sessionId = object.getVal("session_id")->asString();
else
warning("no session_id found in Dropbox's response");
needsFinishRequest = true;
@@ -157,36 +157,33 @@ void DropboxUploadRequest::partUploadedCallback(Networking::JsonResponse pair) {
}
if (!needsFinishRequest && (_contentsStream->eos() || _contentsStream->pos() >= _contentsStream->size() - 1)) {
- if (status.file.name() == "") {
- status.file = StorageFile(_savePath, 0, 0, false);
- warning("no file info to put into status");
- }
- finishUpload(status);
+ warning("no file info to return");
+ finishSuccess(StorageFile(_savePath, 0, 0, false));
} else {
uploadNextPart();
}
} else {
- warning("null, not json");
- status.failed = true;
- finishUpload(status);
+ warning("null, not json");
+ finishError(error);
}
delete json;
}
+void DropboxUploadRequest::partUploadedErrorCallback(Networking::ErrorResponse error) {
+ debug("partUploadedErrorCallback");
+ _workingRequest = nullptr;
+ if (_ignoreCallback) return;
+ finishError(error);
+}
+
void DropboxUploadRequest::handle() {}
void DropboxUploadRequest::restart() { start(); }
-void DropboxUploadRequest::finish() {
- UploadStatus status;
- status.interrupted = true;
- finishUpload(status);
-}
-
-void DropboxUploadRequest::finishUpload(UploadStatus status) {
- Request::finish();
- if (_uploadCallback) (*_uploadCallback)(Storage::UploadResponse(this, status));
+void DropboxUploadRequest::finishSuccess(StorageFile file) {
+ Request::finishSuccess();
+ if (_uploadCallback) (*_uploadCallback)(Storage::UploadResponse(this, file));
}
} // End of namespace Dropbox
diff --git a/backends/cloud/dropbox/dropboxuploadrequest.h b/backends/cloud/dropbox/dropboxuploadrequest.h
index 9b68995969..a85d7ef883 100644
--- a/backends/cloud/dropbox/dropboxuploadrequest.h
+++ b/backends/cloud/dropbox/dropboxuploadrequest.h
@@ -42,16 +42,16 @@ class DropboxUploadRequest: public Networking::Request {
void start();
void uploadNextPart();
- void partUploadedCallback(Networking::JsonResponse pair);
- void finishUpload(UploadStatus status);
+ void partUploadedCallback(Networking::JsonResponse response);
+ void partUploadedErrorCallback(Networking::ErrorResponse error);
+ void finishSuccess(StorageFile status);
public:
- DropboxUploadRequest(Common::String token, Common::String path, Common::SeekableReadStream *contents, Storage::UploadCallback callback);
+ DropboxUploadRequest(Common::String token, Common::String path, Common::SeekableReadStream *contents, Storage::UploadCallback callback, Networking::ErrorCallback ecb);
virtual ~DropboxUploadRequest();
virtual void handle();
virtual void restart();
- virtual void finish();
};
} // End of namespace Dropbox