aboutsummaryrefslogtreecommitdiff
path: root/backends/cloud/onedrive
diff options
context:
space:
mode:
Diffstat (limited to 'backends/cloud/onedrive')
-rw-r--r--backends/cloud/onedrive/onedrivelistdirectoryrequest.cpp56
-rw-r--r--backends/cloud/onedrive/onedrivelistdirectoryrequest.h14
-rw-r--r--backends/cloud/onedrive/onedrivestorage.cpp72
-rw-r--r--backends/cloud/onedrive/onedrivestorage.h39
-rw-r--r--backends/cloud/onedrive/onedrivetokenrefresher.cpp42
-rw-r--r--backends/cloud/onedrive/onedrivetokenrefresher.h12
6 files changed, 128 insertions, 107 deletions
diff --git a/backends/cloud/onedrive/onedrivelistdirectoryrequest.cpp b/backends/cloud/onedrive/onedrivelistdirectoryrequest.cpp
index dbd5e44c0b..e362600389 100644
--- a/backends/cloud/onedrive/onedrivelistdirectoryrequest.cpp
+++ b/backends/cloud/onedrive/onedrivelistdirectoryrequest.cpp
@@ -31,8 +31,8 @@
namespace Cloud {
namespace OneDrive {
-OneDriveListDirectoryRequest::OneDriveListDirectoryRequest(OneDriveStorage *storage, Common::String path, Storage::ListDirectoryCallback cb, bool recursive):
- Networking::Request(0),
+OneDriveListDirectoryRequest::OneDriveListDirectoryRequest(OneDriveStorage *storage, Common::String path, Storage::ListDirectoryCallback cb, Networking::ErrorCallback ecb, bool recursive):
+ Networking::Request(nullptr, ecb),
_requestedPath(path), _requestedRecursive(recursive), _storage(storage), _listDirectoryCallback(cb),
_workingRequest(nullptr), _ignoreCallback(false) {
start();
@@ -55,12 +55,12 @@ void OneDriveListDirectoryRequest::start() {
_ignoreCallback = false;
_directoriesQueue.push_back(_requestedPath);
- listNextDirectory(_files);
+ listNextDirectory();
}
-void OneDriveListDirectoryRequest::listNextDirectory(ListDirectoryStatus status) {
+void OneDriveListDirectoryRequest::listNextDirectory() {
if (_directoriesQueue.empty()) {
- finishStatus(status);
+ finishSuccess(_files);
return;
}
@@ -78,36 +78,37 @@ void OneDriveListDirectoryRequest::listNextDirectory(ListDirectoryStatus status)
void OneDriveListDirectoryRequest::makeRequest(Common::String url) {
Networking::JsonCallback callback = new Common::Callback<OneDriveListDirectoryRequest, Networking::JsonResponse>(this, &OneDriveListDirectoryRequest::listedDirectoryCallback);
- Networking::CurlJsonRequest *request = new OneDriveTokenRefresher(_storage, callback, url.c_str());
+ Networking::ErrorCallback failureCallback = new Common::Callback<OneDriveListDirectoryRequest, Networking::ErrorResponse>(this, &OneDriveListDirectoryRequest::listedDirectoryErrorCallback);
+ Networking::CurlJsonRequest *request = new OneDriveTokenRefresher(_storage, callback, failureCallback, url.c_str());
request->addHeader("Authorization: Bearer " + _storage->accessToken());
_workingRequest = ConnMan.addRequest(request);
}
-void OneDriveListDirectoryRequest::listedDirectoryCallback(Networking::JsonResponse pair) {
+void OneDriveListDirectoryRequest::listedDirectoryCallback(Networking::JsonResponse response) {
_workingRequest = nullptr;
- Common::JSONValue *json = pair.value;
+ Common::JSONValue *json = response.value;
if (_ignoreCallback) {
delete json;
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();
if (!json) {
- status.failed = true;
- finishStatus(status);
+ error.failed = true;
+ finishError(error);
return;
}
- Common::JSONObject response = json->asObject();
+ Common::JSONObject object = json->asObject();
//TODO: check that ALL keys exist AND HAVE RIGHT TYPE to avoid segfaults
- Common::JSONArray items = response.getVal("value")->asArray();
+ Common::JSONArray items = object.getVal("value")->asArray();
for (uint32 i = 0; i < items.size(); ++i) {
Common::JSONObject item = items[i]->asObject();
@@ -123,26 +124,29 @@ void OneDriveListDirectoryRequest::listedDirectoryCallback(Networking::JsonRespo
}
}
- bool hasMore = response.contains("@odata.nextLink");
+ bool hasMore = object.contains("@odata.nextLink");
if (hasMore) {
- makeRequest(response.getVal("@odata.nextLink")->asString());
+ makeRequest(object.getVal("@odata.nextLink")->asString());
} else {
- listNextDirectory(status);
+ listNextDirectory();
}
delete json;
}
-void OneDriveListDirectoryRequest::finish() {
- Common::Array<StorageFile> files;
- ListDirectoryStatus status(files);
- status.interrupted = true;
- finishStatus(status);
+void OneDriveListDirectoryRequest::listedDirectoryErrorCallback(Networking::ErrorResponse error) {
+ _workingRequest = nullptr;
+ if (_ignoreCallback) return;
+ finishError(error);
}
-void OneDriveListDirectoryRequest::finishStatus(ListDirectoryStatus status) {
- Request::finish();
- if (_listDirectoryCallback) (*_listDirectoryCallback)(Storage::ListDirectoryResponse(this, status));
+void OneDriveListDirectoryRequest::handle() {}
+
+void OneDriveListDirectoryRequest::restart() { start(); }
+
+void OneDriveListDirectoryRequest::finishSuccess(Common::Array<StorageFile> &files) {
+ Request::finishSuccess();
+ if (_listDirectoryCallback) (*_listDirectoryCallback)(Storage::ListDirectoryResponse(this, files));
}
} // End of namespace OneDrive
diff --git a/backends/cloud/onedrive/onedrivelistdirectoryrequest.h b/backends/cloud/onedrive/onedrivelistdirectoryrequest.h
index a05dd871dd..b8adfe7ef0 100644
--- a/backends/cloud/onedrive/onedrivelistdirectoryrequest.h
+++ b/backends/cloud/onedrive/onedrivelistdirectoryrequest.h
@@ -45,17 +45,17 @@ class OneDriveListDirectoryRequest: public Networking::Request {
bool _ignoreCallback;
void start();
- void listNextDirectory(ListDirectoryStatus status);
- void listedDirectoryCallback(Networking::JsonResponse pair);
+ void listNextDirectory();
+ void listedDirectoryCallback(Networking::JsonResponse response);
+ void listedDirectoryErrorCallback(Networking::ErrorResponse error);
void makeRequest(Common::String url);
- void finishStatus(ListDirectoryStatus status);
+ void finishSuccess(Common::Array<StorageFile> &files);
public:
- OneDriveListDirectoryRequest(OneDriveStorage *storage, Common::String path, Storage::ListDirectoryCallback cb, bool recursive = false);
+ OneDriveListDirectoryRequest(OneDriveStorage *storage, Common::String path, Storage::ListDirectoryCallback cb, Networking::ErrorCallback ecb, bool recursive = false);
virtual ~OneDriveListDirectoryRequest();
- virtual void handle() {}
- virtual void restart() { start(); }
- virtual void finish();
+ virtual void handle();
+ virtual void restart();
};
} // End of namespace OneDrive
diff --git a/backends/cloud/onedrive/onedrivestorage.cpp b/backends/cloud/onedrive/onedrivestorage.cpp
index b0f4f7be65..8746b7ab33 100644
--- a/backends/cloud/onedrive/onedrivestorage.cpp
+++ b/backends/cloud/onedrive/onedrivestorage.cpp
@@ -74,7 +74,7 @@ void OneDriveStorage::getAccessToken(BoolCallback callback, Common::String code)
}
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");
+ Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, getErrorPrintingCallback(), "https://login.live.com/oauth20_token.srf"); //TODO
if (codeFlow) {
request->addPostField("code=" + code);
request->addPostField("grant_type=authorization_code");
@@ -88,8 +88,8 @@ void OneDriveStorage::getAccessToken(BoolCallback callback, Common::String code)
ConnMan.addRequest(request);
}
-void OneDriveStorage::tokenRefreshed(BoolCallback callback, Networking::JsonResponse pair) {
- Common::JSONValue *json = pair.value;
+void OneDriveStorage::tokenRefreshed(BoolCallback callback, Networking::JsonResponse response) {
+ Common::JSONValue *json = response.value;
if (!json) {
warning("OneDriveStorage: got NULL instead of JSON");
if (callback) (*callback)(BoolResponse(nullptr, false));
@@ -111,8 +111,8 @@ void OneDriveStorage::tokenRefreshed(BoolCallback callback, Networking::JsonResp
delete json;
}
-void OneDriveStorage::codeFlowComplete(BoolResponse pair) {
- if (!pair.value) {
+void OneDriveStorage::codeFlowComplete(BoolResponse response) {
+ if (!response.value) {
warning("OneDriveStorage: failed to get access token through code flow");
return;
}
@@ -130,8 +130,8 @@ void OneDriveStorage::saveConfig(Common::String keyPrefix) {
ConfMan.set(keyPrefix + "refresh_token", _refreshToken, "cloud");
}
-void OneDriveStorage::printJson(Networking::JsonResponse pair) {
- Common::JSONValue *json = pair.value;
+void OneDriveStorage::printJson(Networking::JsonResponse response) {
+ Common::JSONValue *json = response.value;
if (!json) {
warning("printJson: NULL");
return;
@@ -141,77 +141,85 @@ void OneDriveStorage::printJson(Networking::JsonResponse pair) {
delete json;
}
-void OneDriveStorage::fileInfoCallback(Networking::NetworkReadStreamCallback outerCallback, Networking::JsonResponse pair) {
- if (!pair.value) {
+void OneDriveStorage::fileInfoCallback(Networking::NetworkReadStreamCallback outerCallback, Networking::JsonResponse response) {
+ if (!response.value) {
warning("fileInfoCallback: NULL");
- if (outerCallback) (*outerCallback)(Networking::NetworkReadStreamResponse(pair.request, 0));
+ if (outerCallback) (*outerCallback)(Networking::NetworkReadStreamResponse(response.request, 0));
return;
}
- Common::JSONObject result = pair.value->asObject();
+ Common::JSONObject result = response.value->asObject();
if (result.contains("@content.downloadUrl")) {
const char *url = result.getVal("@content.downloadUrl")->asString().c_str();
if (outerCallback)
(*outerCallback)(Networking::NetworkReadStreamResponse(
- pair.request,
+ response.request,
new Networking::NetworkReadStream(url, 0, "")
));
} else {
warning("downloadUrl not found in passed JSON");
- debug("%s", pair.value->stringify().c_str());
- if (outerCallback) (*outerCallback)(Networking::NetworkReadStreamResponse(pair.request, 0));
+ debug("%s", response.value->stringify().c_str());
+ if (outerCallback) (*outerCallback)(Networking::NetworkReadStreamResponse(response.request, 0));
}
- delete pair.value;
+ delete response.value;
}
-Networking::Request *OneDriveStorage::listDirectory(Common::String path, ListDirectoryCallback callback, bool recursive) {
- return ConnMan.addRequest(new OneDriveListDirectoryRequest(this, path, callback, recursive));
+Networking::Request *OneDriveStorage::listDirectory(Common::String path, ListDirectoryCallback callback, Networking::ErrorCallback errorCallback, bool recursive) {
+ return ConnMan.addRequest(new OneDriveListDirectoryRequest(this, path, callback, errorCallback, recursive));
}
-Networking::Request *OneDriveStorage::streamFile(Common::String path, Networking::NetworkReadStreamCallback outerCallback) {
+Networking::Request *OneDriveStorage::streamFile(Common::String path, Networking::NetworkReadStreamCallback outerCallback, Networking::ErrorCallback errorCallback) {
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());
+ Networking::CurlJsonRequest *request = new OneDriveTokenRefresher(this, innerCallback, errorCallback, url.c_str());
request->addHeader("Authorization: Bearer " + _token);
return ConnMan.addRequest(request);
}
-Networking::Request *OneDriveStorage::download(Common::String remotePath, Common::String localPath, BoolCallback callback) {
+Networking::Request *OneDriveStorage::download(Common::String remotePath, Common::String localPath, BoolCallback callback, Networking::ErrorCallback errorCallback) {
Common::DumpFile *f = new Common::DumpFile();
if (!f->open(localPath, true)) {
warning("OneDriveStorage: 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));
}
/** Returns Common::Array<StorageFile> with list of files, which were not downloaded. */
-Networking::Request *OneDriveStorage::downloadFolder(Common::String remotePath, Common::String localPath, FileArrayCallback callback, bool recursive) {
- return ConnMan.addRequest(new FolderDownloadRequest(this, callback, remotePath, localPath, recursive));
+Networking::Request *OneDriveStorage::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));
}
-void OneDriveStorage::fileDownloaded(BoolResponse pair) {
- if (pair.value) debug("file downloaded!");
+void OneDriveStorage::fileDownloaded(BoolResponse response) {
+ if (response.value) debug("file downloaded!");
else debug("download failed!");
}
-void OneDriveStorage::printFiles(FileArrayResponse pair) {
+void OneDriveStorage::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].path().c_str());
}
-void OneDriveStorage::printBool(BoolResponse pair) {
- debug("bool: %s", pair.value ? "true" : "false");
+void OneDriveStorage::printBool(BoolResponse response) {
+ debug("bool: %s", response.value ? "true" : "false");
+}
+
+void OneDriveStorage::printErrorResponse(Networking::ErrorResponse error) {
+ debug("error response (%s, %ld):", (error.failed ? "failed" : "interrupted"), error.httpResponseCode);
+ debug("%s", error.response.c_str());
}
+Networking::ErrorCallback OneDriveStorage::getErrorPrintingCallback() {
+ return new Common::Callback<OneDriveStorage, Networking::ErrorResponse>(this, &OneDriveStorage::printErrorResponse);
+}
-Networking::Request *OneDriveStorage::syncSaves(BoolCallback callback) {
+Networking::Request *OneDriveStorage::syncSaves(BoolCallback callback, Networking::ErrorCallback errorCallback) {
//this is not the real syncSaves() implementation
/*
Networking::JsonCallback innerCallback = new Common::Callback<OneDriveStorage, Networking::RequestJsonPair>(this, &OneDriveStorage::printJson);
@@ -220,7 +228,7 @@ Networking::Request *OneDriveStorage::syncSaves(BoolCallback callback) {
return ConnMan.addRequest(request);
*/
//return downloadFolder("subfolder", "local/onedrive/subfolder_downloaded", new Common::Callback<OneDriveStorage, FileArrayResponse>(this, &OneDriveStorage::printFiles), false);
- return ConnMan.addRequest(new SavesSyncRequest(this, new Common::Callback<OneDriveStorage, BoolResponse>(this, &OneDriveStorage::printBool)));
+ return ConnMan.addRequest(new SavesSyncRequest(this, new Common::Callback<OneDriveStorage, BoolResponse>(this, &OneDriveStorage::printBool), getErrorPrintingCallback())); //TODO
}
OneDriveStorage *OneDriveStorage::loadFromConfig(Common::String keyPrefix) {
diff --git a/backends/cloud/onedrive/onedrivestorage.h b/backends/cloud/onedrive/onedrivestorage.h
index 43675fbfa5..f95ea89bc1 100644
--- a/backends/cloud/onedrive/onedrivestorage.h
+++ b/backends/cloud/onedrive/onedrivestorage.h
@@ -46,15 +46,18 @@ class OneDriveStorage: public Cloud::Storage {
*/
OneDriveStorage(Common::String code);
- void tokenRefreshed(BoolCallback callback, Networking::JsonResponse pair);
- void codeFlowComplete(BoolResponse pair);
+ void tokenRefreshed(BoolCallback callback, Networking::JsonResponse response);
+ void codeFlowComplete(BoolResponse response);
- void printJson(Networking::JsonResponse pair);
- void fileDownloaded(BoolResponse pair);
- void printFiles(FileArrayResponse pair);
- void printBool(BoolResponse pair);
+ void printJson(Networking::JsonResponse response);
+ void fileDownloaded(BoolResponse response);
+ void printFiles(FileArrayResponse response);
+ void printBool(BoolResponse response);
+ void printErrorResponse(Networking::ErrorResponse error);
- void fileInfoCallback(Networking::NetworkReadStreamCallback outerCallback, Networking::JsonResponse pair);
+ Networking::ErrorCallback getErrorPrintingCallback();
+
+ void fileInfoCallback(Networking::NetworkReadStreamCallback outerCallback, Networking::JsonResponse response);
public:
virtual ~OneDriveStorage();
@@ -74,35 +77,35 @@ 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) { return nullptr; } //TODO
- virtual Networking::Request *upload(Common::String remotePath, Common::String localPath, UploadCallback callback) { return nullptr; }
+ virtual Networking::Request *upload(Common::String path, Common::SeekableReadStream *contents, UploadCallback callback, Networking::ErrorCallback errorCallback) { return nullptr; } //TODO
+ virtual Networking::Request *upload(Common::String remotePath, Common::String localPath, UploadCallback callback, Networking::ErrorCallback errorCallback) { return nullptr; } //TODO
/** 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) { return nullptr; } //TODO
+ virtual Networking::Request *info(StorageInfoCallback callback, Networking::ErrorCallback errorCallback) { 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 a0c41ff471..bc7bd74dbe 100644
--- a/backends/cloud/onedrive/onedrivetokenrefresher.cpp
+++ b/backends/cloud/onedrive/onedrivetokenrefresher.cpp
@@ -31,16 +31,16 @@
namespace Cloud {
namespace OneDrive {
-OneDriveTokenRefresher::OneDriveTokenRefresher(OneDriveStorage *parent, Networking::JsonCallback callback, const char *url):
- CurlJsonRequest(callback, url), _parentStorage(parent) {}
+OneDriveTokenRefresher::OneDriveTokenRefresher(OneDriveStorage *parent, Networking::JsonCallback callback, Networking::ErrorCallback ecb, const char *url):
+ CurlJsonRequest(callback, ecb, url), _parentStorage(parent) {}
OneDriveTokenRefresher::~OneDriveTokenRefresher() {}
-void OneDriveTokenRefresher::tokenRefreshed(Storage::BoolResponse pair) {
- if (!pair.value) {
+void OneDriveTokenRefresher::tokenRefreshed(Storage::BoolResponse response) {
+ if (!response.value) {
//failed to refresh token, notify user with NULL in original callback
warning("OneDriveTokenRefresher: failed to refresh token");
- finish();
+ finishError(Networking::ErrorResponse(this, false, true, "", -1));
return;
}
@@ -56,11 +56,10 @@ void OneDriveTokenRefresher::tokenRefreshed(Storage::BoolResponse pair) {
retry(0);
}
-void OneDriveTokenRefresher::finishJson(Common::JSONValue *json) {
+void OneDriveTokenRefresher::finishSuccess(Common::JSONValue *json) {
if (!json) {
- //notify user of failure
- warning("OneDriveTokenRefresher: got NULL instead of JSON");
- CurlJsonRequest::finishJson(nullptr);
+ //that's probably not an error (200 OK)
+ CurlJsonRequest::finishSuccess(nullptr);
return;
}
@@ -74,19 +73,26 @@ void OneDriveTokenRefresher::finishJson(Common::JSONValue *json) {
Common::JSONObject error = result.getVal("error")->asObject();
bool irrecoverable = true;
+ Common::String code, message;
if (error.contains("code")) {
- Common::String code = error.getVal("code")->asString();
- debug("code = %s", code.c_str());
- //if (code == "itemNotFound") irrecoverable = true;
+ code = error.getVal("code")->asString();
+ debug("code = %s", code.c_str());
}
if (error.contains("message")) {
- Common::String message = error.getVal("message")->asString();
+ message = error.getVal("message")->asString();
debug("message = %s", message.c_str());
}
- if (irrecoverable) {
- CurlJsonRequest::finishJson(nullptr);
+ //determine whether token refreshing would help in this situation
+ if (code == "itemNotFound") {
+ if (message.contains("application ID"))
+ irrecoverable = false;
+ }
+
+ if (irrecoverable) {
+ finishError(Networking::ErrorResponse(this, false, true, json->stringify(true), -1)); //TODO: httpCode
+ delete json;
return;
}
@@ -97,7 +103,7 @@ void OneDriveTokenRefresher::finishJson(Common::JSONValue *json) {
}
//notify user of success
- CurlJsonRequest::finishJson(json);
+ CurlJsonRequest::finishSuccess(json);
}
void OneDriveTokenRefresher::setHeaders(Common::Array<Common::String> &headers) {
@@ -108,6 +114,10 @@ void OneDriveTokenRefresher::setHeaders(Common::Array<Common::String> &headers)
CurlJsonRequest::addHeader(headers[i]);
}
+void OneDriveTokenRefresher::addHeader(Common::String header) {
+ _headers.push_back(header);
+ CurlJsonRequest::addHeader(header);
+}
} // End of namespace OneDrive
} // End of namespace Cloud
diff --git a/backends/cloud/onedrive/onedrivetokenrefresher.h b/backends/cloud/onedrive/onedrivetokenrefresher.h
index 90ca9d603a..04b0bf26b8 100644
--- a/backends/cloud/onedrive/onedrivetokenrefresher.h
+++ b/backends/cloud/onedrive/onedrivetokenrefresher.h
@@ -35,19 +35,15 @@ class OneDriveTokenRefresher: public Networking::CurlJsonRequest {
OneDriveStorage *_parentStorage;
Common::Array<Common::String> _headers;
- void tokenRefreshed(Storage::BoolResponse pair);
+ void tokenRefreshed(Storage::BoolResponse response);
- virtual void finishJson(Common::JSONValue *json);
+ virtual void finishSuccess(Common::JSONValue *json);
public:
- OneDriveTokenRefresher(OneDriveStorage *parent, Networking::JsonCallback callback, const char *url);
+ OneDriveTokenRefresher(OneDriveStorage *parent, Networking::JsonCallback callback, Networking::ErrorCallback ecb, const char *url);
virtual ~OneDriveTokenRefresher();
virtual void setHeaders(Common::Array<Common::String> &headers);
-
- virtual void addHeader(Common::String header) {
- _headers.push_back(header);
- CurlJsonRequest::addHeader(header);
- }
+ virtual void addHeader(Common::String header);
};
} // End of namespace OneDrive