diff options
Diffstat (limited to 'backends/cloud/dropbox/dropboxstorage.cpp')
-rw-r--r-- | backends/cloud/dropbox/dropboxstorage.cpp | 113 |
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"); |