aboutsummaryrefslogtreecommitdiff
path: root/backends/cloud/dropbox/dropboxstorage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/cloud/dropbox/dropboxstorage.cpp')
-rw-r--r--backends/cloud/dropbox/dropboxstorage.cpp113
1 files changed, 28 insertions, 85 deletions
diff --git a/backends/cloud/dropbox/dropboxstorage.cpp b/backends/cloud/dropbox/dropboxstorage.cpp
index 04e9eeef0b..964b95bb09 100644
--- a/backends/cloud/dropbox/dropboxstorage.cpp
+++ b/backends/cloud/dropbox/dropboxstorage.cpp
@@ -35,17 +35,6 @@ namespace Dropbox {
Common::String DropboxStorage::KEY; //can't use ConfMan there yet, loading it on instance creation/auth
Common::String DropboxStorage::SECRET; //TODO: hide these secrets somehow
-static void printJsonCallback(Networking::Request* rq, void *ptr) {
- Common::JSONValue *json = (Common::JSONValue *)ptr;
- if (json) {
- debug("printJsonCallback:");
- debug("%s", json->stringify(true).c_str());
- delete json;
- } else {
- debug("printJsonCallback: got NULL instead of JSON!");
- }
-}
-
static void saveAccessTokenCallback(void *ptr) {
Common::JSONValue *json = (Common::JSONValue *)ptr;
if (json) {
@@ -69,53 +58,6 @@ static void saveAccessTokenCallback(void *ptr) {
}
}
-void infoCallback(Networking::Request* request, void *jsonPointer) {
- if (!request) {
- warning("infoCallback: got NULL instead of Request");
-
- Common::JSONValue *json = (Common::JSONValue *)jsonPointer;
- if (json) delete json; //yeah I know we can delete NULL safely
- return;
- }
-
- Storage::InfoCallback callback = (Storage::InfoCallback)request->pointer();
-
- Common::JSONValue *json = (Common::JSONValue *)jsonPointer;
- if (json) {
- //Common::JSONObject result = json->asObject();
- if (callback) {
- callback(StorageInfo(json->stringify()));
- }
- delete json;
- } else {
- warning("infoCallback: got NULL instead of JSON!");
- }
-}
-
-void info2Callback(Networking::Request* request, void *jsonPointer) {
- if (!request) {
- warning("infoCallback: got NULL instead of Request");
-
- Common::JSONValue *json = (Common::JSONValue *)jsonPointer;
- if (json) delete json; //yeah I know we can delete NULL safely
- return;
- }
-
- Common::BaseCallback *callback = (Common::BaseCallback *)request->pointer();
-
- Common::JSONValue *json = (Common::JSONValue *)jsonPointer;
- if (json) {
- //Common::JSONObject result = json->asObject();
- if (callback) {
- (*callback)(new StorageInfo(json->stringify()));
- delete callback;
- }
- delete json;
- } else {
- warning("infoCallback: got NULL instead of JSON!");
- }
-}
-
DropboxStorage::DropboxStorage(Common::String accessToken, Common::String userId): _token(accessToken), _uid(userId) {
curl_global_init(CURL_GLOBAL_ALL);
}
@@ -124,41 +66,42 @@ DropboxStorage::~DropboxStorage() {
curl_global_cleanup();
}
-void syncSavesInfoCallback(StorageInfo info) {
- debug("info: %s", info.info().c_str());
-}
-
-void DropboxStorage::infoMethodCallback(void *storageInfo) {
- StorageInfo *info = (StorageInfo *)storageInfo;
- debug("info: %s", info->info().c_str());
+void DropboxStorage::syncSaves(Common::BaseCallback<bool> *callback) {
+ //this is not the real syncSaves() implementation
+ info(new Common::Callback<DropboxStorage, StorageInfo>(this, &DropboxStorage::infoMethodCallback));
+ //that line meant the following:
+ //"please, do the info API request and, when it's finished, call the infoMethodCallback() of me"
}
-void DropboxStorage::syncSaves(OperationCallback callback) {
- //this is not the real syncSaves() implementation
- info2(new Common::Callback<DropboxStorage>(this, &DropboxStorage::infoMethodCallback));
-}
-
-void DropboxStorage::info(InfoCallback callback) {
- /*
- Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(infoCallback, "https://api.dropboxapi.com/1/account/info");
+void DropboxStorage::info(Common::BaseCallback<StorageInfo> *outerCallback) {
+ Common::BaseCallback<> *innerCallback = new Common::CallbackBridge<DropboxStorage, StorageInfo>(this, &DropboxStorage::infoInnerCallback, outerCallback);
+ Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, "https://api.dropboxapi.com/1/account/info");
request->addHeader("Authorization: Bearer " + _token);
ConnMan.addRequest(request);
-
- request->setPointer(callback);
- */
+ //that callback bridge wraps the outerCallback (passed in arguments from user) into innerCallback
+ //so, when CurlJsonRequest is finished, it calls the innerCallback
+ //innerCallback (which is DropboxStorage::infoInnerCallback in this case) processes the void *ptr
+ //and then calls the outerCallback (which wants to receive StorageInfo, not void *)
}
-void DropboxStorage::info2BridgeCallback(Common::BaseCallback *outerCallback, void *ptr) {
- //no NULL checks, delete and such yet
+void DropboxStorage::infoInnerCallback(Common::BaseCallback<StorageInfo> *outerCallback, void *ptr) {
Common::JSONValue *json = (Common::JSONValue *)ptr;
- (*outerCallback)(new StorageInfo(json->stringify()));
+ if (!json) {
+ warning("NULL passed instead of JSON");
+ delete outerCallback;
+ return;
+ }
+
+ if (outerCallback) {
+ (*outerCallback)(StorageInfo(json->stringify()));
+ delete outerCallback;
+ }
+
+ delete json;
}
-void DropboxStorage::info2(Common::BaseCallback *outerCallback) {
- Common::BaseCallback *innerCallback = new Common::CallbackBridge<DropboxStorage>(this, &DropboxStorage::info2BridgeCallback, outerCallback);
- Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, "https://api.dropboxapi.com/1/account/info");
- request->addHeader("Authorization: Bearer " + _token);
- ConnMan.addRequest(request);
+void DropboxStorage::infoMethodCallback(StorageInfo storageInfo) {
+ debug("info: %s", storageInfo.info().c_str());
}
DropboxStorage *DropboxStorage::loadFromConfig() {
@@ -212,7 +155,7 @@ void DropboxStorage::authThroughConsole() {
}
void DropboxStorage::getAccessToken(Common::String code) {
- Common::BaseCallback *callback = new Common::GlobalFunctionCallback(saveAccessTokenCallback);
+ Common::BaseCallback<> *callback = new Common::GlobalFunctionCallback(saveAccessTokenCallback);
Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(callback, "https://api.dropboxapi.com/1/oauth2/token");
request->addPostField("code=" + code);
request->addPostField("grant_type=authorization_code");