diff options
author | Alexander Tkachev | 2016-05-21 14:06:50 +0600 |
---|---|---|
committer | Alexander Tkachev | 2016-08-24 16:07:55 +0600 |
commit | ca456a7241fb4b46f9c76c86eeecc273ca31d8f6 (patch) | |
tree | 0c2ea21d76d86376ea865a5104770979def98e7f | |
parent | 17eb5f91433f2414dc73f89abfdd316407259b61 (diff) | |
download | scummvm-rg350-ca456a7241fb4b46f9c76c86eeecc273ca31d8f6.tar.gz scummvm-rg350-ca456a7241fb4b46f9c76c86eeecc273ca31d8f6.tar.bz2 scummvm-rg350-ca456a7241fb4b46f9c76c86eeecc273ca31d8f6.zip |
CLOUD: Add object-oriented Callbacks
These callbacks can call object's methods, not some global C functions.
DropboxStorage::info2() and DropboxStorage::infoMethodCallback()
demonstrate the idea.
-rw-r--r-- | backends/cloud/dropbox/dropboxstorage.cpp | 41 | ||||
-rw-r--r-- | backends/cloud/dropbox/dropboxstorage.h | 4 | ||||
-rw-r--r-- | backends/networking/curl/curljsonrequest.cpp | 2 | ||||
-rw-r--r-- | backends/networking/curl/curljsonrequest.h | 2 | ||||
-rw-r--r-- | backends/networking/curl/request.h | 6 | ||||
-rw-r--r-- | common/callback.h | 47 |
6 files changed, 95 insertions, 7 deletions
diff --git a/backends/cloud/dropbox/dropboxstorage.cpp b/backends/cloud/dropbox/dropboxstorage.cpp index f2270f79cd..94bdb43450 100644 --- a/backends/cloud/dropbox/dropboxstorage.cpp +++ b/backends/cloud/dropbox/dropboxstorage.cpp @@ -92,6 +92,30 @@ void infoCallback(Networking::Request* request, void *jsonPointer) { } } +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); } @@ -104,9 +128,14 @@ 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(OperationCallback callback) { - //this is not the real syncSaves() implementation - info(syncSavesInfoCallback); + //this is not the real syncSaves() implementation + info2(new Common::Callback<DropboxStorage>(this, &DropboxStorage::infoMethodCallback)); } void DropboxStorage::info(InfoCallback callback) { @@ -117,6 +146,14 @@ void DropboxStorage::info(InfoCallback callback) { request->setPointer(callback); } +void DropboxStorage::info2(Common::Callback<DropboxStorage> *callback) { + Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(info2Callback, "https://api.dropboxapi.com/1/account/info"); + request->addHeader("Authorization: Bearer " + _token); + ConnMan.addRequest(request); + + request->setPointer(callback); +} + DropboxStorage *DropboxStorage::loadFromConfig() { KEY = ConfMan.get("DROPBOX_KEY", "cloud"); SECRET = ConfMan.get("DROPBOX_SECRET", "cloud"); diff --git a/backends/cloud/dropbox/dropboxstorage.h b/backends/cloud/dropbox/dropboxstorage.h index d60dec29de..1cf657bc36 100644 --- a/backends/cloud/dropbox/dropboxstorage.h +++ b/backends/cloud/dropbox/dropboxstorage.h @@ -25,6 +25,7 @@ #include "backends/cloud/storage.h" #include "backends/cloud/manager.h" +#include "common/callback.h" namespace Cloud { namespace Dropbox { @@ -39,6 +40,8 @@ class DropboxStorage: public Cloud::Storage { static void getAccessToken(Common::String code); + void infoMethodCallback(void *serviceInfoPtr); + public: virtual ~DropboxStorage(); @@ -65,6 +68,7 @@ public: /** Returns pointer to the ServiceInfo struct. */ virtual void info(InfoCallback callback); + void info2(Common::Callback<DropboxStorage> *callback); /** Returns whether saves sync process is running. */ virtual bool isSyncing() { return false; } //TODO diff --git a/backends/networking/curl/curljsonrequest.cpp b/backends/networking/curl/curljsonrequest.cpp index 929723c671..fe6e218269 100644 --- a/backends/networking/curl/curljsonrequest.cpp +++ b/backends/networking/curl/curljsonrequest.cpp @@ -31,7 +31,7 @@ namespace Networking { -CurlJsonRequest::CurlJsonRequest(Callback cb, const char *url) : Request(cb), _stream(0), _headersList(0), _contentsStream(DisposeAfterUse::YES) { +CurlJsonRequest::CurlJsonRequest(SimpleCallback cb, const char *url) : Request(cb), _stream(0), _headersList(0), _contentsStream(DisposeAfterUse::YES) { _url = url; } diff --git a/backends/networking/curl/curljsonrequest.h b/backends/networking/curl/curljsonrequest.h index cbf3f6dd56..56e7205512 100644 --- a/backends/networking/curl/curljsonrequest.h +++ b/backends/networking/curl/curljsonrequest.h @@ -43,7 +43,7 @@ class CurlJsonRequest : public Request { char *getPreparedContents(); public: - CurlJsonRequest(Callback cb, const char *url); + CurlJsonRequest(SimpleCallback cb, const char *url); virtual ~CurlJsonRequest(); virtual bool handle(); diff --git a/backends/networking/curl/request.h b/backends/networking/curl/request.h index d405ec8551..b9571075cb 100644 --- a/backends/networking/curl/request.h +++ b/backends/networking/curl/request.h @@ -27,14 +27,14 @@ namespace Networking { class Request { protected: - typedef void(*Callback)(Request* request, void *result); + typedef void(*SimpleCallback)(Request* request, void *result); /** * Callback, which should be called before Request returns true in handle(). * That's the way Requests pass the result to the code which asked to create this request. */ - Callback _callback; + SimpleCallback _callback; /** * Pointer, which could be set by Request creating code. It might be accessed @@ -44,7 +44,7 @@ protected: void *_pointer; public: - Request(Callback cb): _callback(cb) {}; + Request(SimpleCallback cb): _callback(cb) {}; virtual ~Request() {}; /** diff --git a/common/callback.h b/common/callback.h new file mode 100644 index 0000000000..4cfdd53fd9 --- /dev/null +++ b/common/callback.h @@ -0,0 +1,47 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef COMMON_CALLBACK_H +#define COMMON_CALLBACK_H + +namespace Common { + +class BaseCallback { +public: + BaseCallback() {} + virtual ~BaseCallback() {} + virtual void operator()(void *ptr) = 0; +}; + +template<class T> class Callback: public BaseCallback { + typedef void(T::*TMethod)(void *); + T *_object; + TMethod _method; +public: + Callback(T *object, TMethod method): _object(object), _method(method) {} + virtual ~Callback() {} + void operator()(void *ptr) { (_object->*_method)(ptr); } +}; + +} // End of namespace Common + +#endif |