diff options
author | Alexander Tkachev | 2016-05-31 20:54:41 +0600 |
---|---|---|
committer | Alexander Tkachev | 2016-08-24 16:07:55 +0600 |
commit | 4e7dec550077bc37cf254311aefb621cdeebbdfe (patch) | |
tree | 07d20f7a35a89f909f5f0ce69618b795104997bb | |
parent | 675e7a6ed1d19e64e2f80a4dd1f454e646cb52f5 (diff) | |
download | scummvm-rg350-4e7dec550077bc37cf254311aefb621cdeebbdfe.tar.gz scummvm-rg350-4e7dec550077bc37cf254311aefb621cdeebbdfe.tar.bz2 scummvm-rg350-4e7dec550077bc37cf254311aefb621cdeebbdfe.zip |
CLOUD: Add DropboxCreateDirectoryRequest
Also add CloudManager::testFeature(), because syncSaves() now works fine
and I don't want to break it again and again with my testing requests.
-rw-r--r-- | backends/cloud/dropbox/dropboxcreatedirectoryrequest.cpp | 109 | ||||
-rw-r--r-- | backends/cloud/dropbox/dropboxcreatedirectoryrequest.h | 55 | ||||
-rw-r--r-- | backends/cloud/dropbox/dropboxstorage.cpp | 12 | ||||
-rw-r--r-- | backends/cloud/dropbox/dropboxstorage.h | 2 | ||||
-rw-r--r-- | backends/cloud/manager.cpp | 11 | ||||
-rw-r--r-- | backends/cloud/manager.h | 3 | ||||
-rw-r--r-- | backends/cloud/onedrive/onedrivestorage.cpp | 5 | ||||
-rw-r--r-- | backends/cloud/savessyncrequest.cpp | 4 | ||||
-rw-r--r-- | backends/module.mk | 1 | ||||
-rw-r--r-- | base/main.cpp | 1 | ||||
-rw-r--r-- | common/cloudmanager.h | 5 |
11 files changed, 196 insertions, 12 deletions
diff --git a/backends/cloud/dropbox/dropboxcreatedirectoryrequest.cpp b/backends/cloud/dropbox/dropboxcreatedirectoryrequest.cpp new file mode 100644 index 0000000000..c077d8df11 --- /dev/null +++ b/backends/cloud/dropbox/dropboxcreatedirectoryrequest.cpp @@ -0,0 +1,109 @@ +/* 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. +* +*/ + +#include "backends/cloud/dropbox/dropboxcreatedirectoryrequest.h" +#include "backends/cloud/storage.h" +#include "backends/networking/curl/connectionmanager.h" +#include "backends/networking/curl/curljsonrequest.h" +#include "backends/networking/curl/networkreadstream.h" +#include "common/json.h" + +namespace Cloud { +namespace Dropbox { + +DropboxCreateDirectoryRequest::DropboxCreateDirectoryRequest(Common::String token, Common::String path, Storage::BoolCallback cb, Networking::ErrorCallback ecb): + Networking::Request(nullptr, ecb), _token(token), _path(path), _boolCallback(cb), + _workingRequest(nullptr), _ignoreCallback(false) { + start(); +} + +DropboxCreateDirectoryRequest::~DropboxCreateDirectoryRequest() { + _ignoreCallback = true; + if (_workingRequest) _workingRequest->finish(); + delete _boolCallback; +} + +void DropboxCreateDirectoryRequest::start() { + _ignoreCallback = true; + if (_workingRequest) _workingRequest->finish(); + _ignoreCallback = false; + + Networking::JsonCallback innerCallback = new Common::Callback<DropboxCreateDirectoryRequest, Networking::JsonResponse>(this, &DropboxCreateDirectoryRequest::responseCallback); + Networking::ErrorCallback errorCallback = new Common::Callback<DropboxCreateDirectoryRequest, Networking::ErrorResponse>(this, &DropboxCreateDirectoryRequest::errorCallback); + Networking::CurlJsonRequest *request = new Networking::CurlJsonRequest(innerCallback, errorCallback, "https://api.dropboxapi.com/2/files/create_folder"); + request->addHeader("Authorization: Bearer " + _token); + request->addHeader("Content-Type: application/json"); + + Common::JSONObject jsonRequestParameters; + jsonRequestParameters.setVal("path", new Common::JSONValue(_path)); + Common::JSONValue value(jsonRequestParameters); + request->addPostField(Common::JSON::stringify(&value)); + + _workingRequest = ConnMan.addRequest(request); +} + +void DropboxCreateDirectoryRequest::responseCallback(Networking::JsonResponse response) { + Common::JSONValue *json = response.value; + _workingRequest = nullptr; + if (_ignoreCallback) { + delete json; + return; + } + + Networking::ErrorResponse error(this); + Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request; + if (rq && rq->getNetworkReadStream()) + error.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode(); + + if (!json) { + warning("NULL passed instead of JSON"); + finishError(error); + return; + } + + Common::JSONObject info = json->asObject(); + if (info.contains("id")) finishSuccess(true); + else { + error.response = json->stringify(true); + finishError(error); + } + + delete json; +} + +void DropboxCreateDirectoryRequest::errorCallback(Networking::ErrorResponse error) { + _workingRequest = nullptr; + if (_ignoreCallback) return; + finishError(error); +} + +void DropboxCreateDirectoryRequest::handle() {} + +void DropboxCreateDirectoryRequest::restart() { start(); } + +void DropboxCreateDirectoryRequest::finishSuccess(bool success) { + Request::finishSuccess(); + if (_boolCallback) (*_boolCallback)(Storage::BoolResponse(this, success)); +} + +} // End of namespace Dropbox +} // End of namespace Cloud diff --git a/backends/cloud/dropbox/dropboxcreatedirectoryrequest.h b/backends/cloud/dropbox/dropboxcreatedirectoryrequest.h new file mode 100644 index 0000000000..ea3175bb50 --- /dev/null +++ b/backends/cloud/dropbox/dropboxcreatedirectoryrequest.h @@ -0,0 +1,55 @@ +/* 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 BACKENDS_CLOUD_DROPBOX_DROPBOXCREATEDIRECTORYREQUEST_H +#define BACKENDS_CLOUD_DROPBOX_DROPBOXCREATEDIRECTORYREQUEST_H + +#include "backends/cloud/storage.h" +#include "backends/networking/curl/request.h" +#include "backends/networking/curl/curljsonrequest.h" + +namespace Cloud { +namespace Dropbox { + +class DropboxCreateDirectoryRequest: public Networking::Request { + Common::String _token; + Common::String _path; + Storage::BoolCallback _boolCallback; + Request *_workingRequest; + bool _ignoreCallback; + + void start(); + void responseCallback(Networking::JsonResponse response); + void errorCallback(Networking::ErrorResponse error); + void finishSuccess(bool success); +public: + DropboxCreateDirectoryRequest(Common::String token, Common::String path, Storage::BoolCallback cb, Networking::ErrorCallback ecb); + virtual ~DropboxCreateDirectoryRequest(); + + virtual void handle(); + virtual void restart(); +}; + +} // End of namespace Dropbox +} // End of namespace Cloud + +#endif diff --git a/backends/cloud/dropbox/dropboxstorage.cpp b/backends/cloud/dropbox/dropboxstorage.cpp index acc96f9476..f51819ccae 100644 --- a/backends/cloud/dropbox/dropboxstorage.cpp +++ b/backends/cloud/dropbox/dropboxstorage.cpp @@ -22,20 +22,15 @@ #define FORBIDDEN_SYMBOL_ALLOW_ALL #include "backends/cloud/dropbox/dropboxstorage.h" +#include "backends/cloud/dropbox/dropboxcreatedirectoryrequest.h" #include "backends/cloud/dropbox/dropboxlistdirectoryrequest.h" #include "backends/cloud/dropbox/dropboxuploadrequest.h" -#include "backends/cloud/downloadrequest.h" -#include "backends/cloud/folderdownloadrequest.h" #include "backends/networking/curl/connectionmanager.h" #include "backends/networking/curl/curljsonrequest.h" #include "common/config-manager.h" #include "common/debug.h" -#include "common/file.h" #include "common/json.h" #include <curl/curl.h> -#include "common/system.h" -#include "common/savefile.h" -#include "../savessyncrequest.h" namespace Cloud { namespace Dropbox { @@ -137,6 +132,11 @@ Networking::Request *DropboxStorage::streamFile(Common::String path, Networking: return response.request; } +Networking::Request *DropboxStorage::createDirectory(Common::String path, BoolCallback callback, Networking::ErrorCallback errorCallback) { + if (!errorCallback) errorCallback = getErrorPrintingCallback(); + return ConnMan.addRequest(new DropboxCreateDirectoryRequest(_token, path, callback, errorCallback)); +} + 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, errorCallback, "https://api.dropboxapi.com/1/account/info"); diff --git a/backends/cloud/dropbox/dropboxstorage.h b/backends/cloud/dropbox/dropboxstorage.h index 5db2bb7ee3..2f57b052b2 100644 --- a/backends/cloud/dropbox/dropboxstorage.h +++ b/backends/cloud/dropbox/dropboxstorage.h @@ -80,7 +80,7 @@ public: virtual Networking::Request *remove(Common::String path, BoolCallback callback, Networking::ErrorCallback errorCallback) { return nullptr; } //TODO /** Calls the callback when finished. */ - virtual Networking::Request *createDirectory(Common::String path, BoolCallback callback, Networking::ErrorCallback errorCallback) { return nullptr; } //TODO + virtual Networking::Request *createDirectory(Common::String path, BoolCallback callback, Networking::ErrorCallback errorCallback); /** Calls the callback when finished. */ virtual Networking::Request *touch(Common::String path, BoolCallback callback, Networking::ErrorCallback errorCallback) { return nullptr; } //TODO diff --git a/backends/cloud/manager.cpp b/backends/cloud/manager.cpp index 2f1533c50d..70f2c3a3ef 100644 --- a/backends/cloud/manager.cpp +++ b/backends/cloud/manager.cpp @@ -25,6 +25,7 @@ #include "backends/cloud/onedrive/onedrivestorage.h" #include "common/config-manager.h" #include "common/random.h" +#include "common/debug.h" namespace Cloud { @@ -110,9 +111,19 @@ Storage *Manager::getCurrentStorage() { return nullptr; } +void Manager::printBool(Storage::BoolResponse response) { + debug("bool = %s", (response.value ? "true" : "false")); +} + void Manager::syncSaves(Storage::BoolCallback callback, Networking::ErrorCallback errorCallback) { Storage *storage = getCurrentStorage(); if (storage) storage->syncSaves(callback, errorCallback); } +void Manager::testFeature() { + Storage *storage = getCurrentStorage(); + if (storage) storage->createDirectory("/remote/sub2/dir", + new Common::Callback<Manager, Storage::BoolResponse>(this, &Manager::printBool), nullptr); +} + } // End of namespace Cloud diff --git a/backends/cloud/manager.h b/backends/cloud/manager.h index 013e117046..f68b33517d 100644 --- a/backends/cloud/manager.h +++ b/backends/cloud/manager.h @@ -33,6 +33,8 @@ class Manager: public Common::CloudManager { uint _currentStorageIndex; uint _deviceId; + void printBool(Storage::BoolResponse response); + public: Manager(); virtual ~Manager(); @@ -43,6 +45,7 @@ public: virtual Storage *getCurrentStorage(); virtual void syncSaves(Storage::BoolCallback callback, Networking::ErrorCallback errorCallback); + virtual void testFeature(); }; } // End of namespace Cloud diff --git a/backends/cloud/onedrive/onedrivestorage.cpp b/backends/cloud/onedrive/onedrivestorage.cpp index e1c6861efd..2adf5fffed 100644 --- a/backends/cloud/onedrive/onedrivestorage.cpp +++ b/backends/cloud/onedrive/onedrivestorage.cpp @@ -25,15 +25,12 @@ #include "backends/cloud/onedrive/onedrivetokenrefresher.h" #include "backends/cloud/onedrive/onedrivelistdirectoryrequest.h" #include "backends/cloud/onedrive/onedriveuploadrequest.h" -#include "backends/cloud/downloadrequest.h" -#include "backends/cloud/folderdownloadrequest.h" -#include "backends/cloud/savessyncrequest.h" #include "backends/networking/curl/connectionmanager.h" #include "backends/networking/curl/curljsonrequest.h" +#include "backends/networking/curl/networkreadstream.h" #include "common/cloudmanager.h" #include "common/config-manager.h" #include "common/debug.h" -#include "common/file.h" #include "common/json.h" #include "common/system.h" #include <curl/curl.h> diff --git a/backends/cloud/savessyncrequest.cpp b/backends/cloud/savessyncrequest.cpp index 9727738654..cf0c427294 100644 --- a/backends/cloud/savessyncrequest.cpp +++ b/backends/cloud/savessyncrequest.cpp @@ -59,8 +59,10 @@ void SavesSyncRequest::start() { loadTimestamps(); //list saves directory + Common::String dir = _storage->savesDirectoryPath(); + if (dir.lastChar() == '/') dir.deleteLastChar(); _workingRequest = _storage->listDirectory( - _storage->savesDirectoryPath(), + dir, new Common::Callback<SavesSyncRequest, Storage::ListDirectoryResponse>(this, &SavesSyncRequest::directoryListedCallback), new Common::Callback<SavesSyncRequest, Networking::ErrorResponse>(this, &SavesSyncRequest::directoryListedErrorCallback) ); diff --git a/backends/module.mk b/backends/module.mk index fd06e52f9d..96dfa2294f 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -29,6 +29,7 @@ MODULE_OBJS += \ cloud/folderdownloadrequest.o \ cloud/savessyncrequest.o \ cloud/dropbox/dropboxstorage.o \ + cloud/dropbox/dropboxcreatedirectoryrequest.o \ cloud/dropbox/dropboxlistdirectoryrequest.o \ cloud/dropbox/dropboxuploadrequest.o \ cloud/onedrive/onedrivestorage.o \ diff --git a/base/main.cpp b/base/main.cpp index f629eb98d8..36dd8c6f18 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -480,6 +480,7 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { #ifdef USE_CLOUD system.getCloudManager()->init(); system.getCloudManager()->syncSaves(); + system.getCloudManager()->testFeature(); //TODO: remove later #endif // Unless a game was specified, show the launcher dialog diff --git a/common/cloudmanager.h b/common/cloudmanager.h index 51c98e7d0c..936f0e0108 100644 --- a/common/cloudmanager.h +++ b/common/cloudmanager.h @@ -65,6 +65,11 @@ public: * Starts saves syncing process in currently active storage if there is any. */ virtual void syncSaves(Cloud::Storage::BoolCallback callback = nullptr, Networking::ErrorCallback errorCallback = nullptr) = 0; + + /** + * Starts feature testing (the one I'm working on currently). (Temporary) + */ + virtual void testFeature() = 0; }; } // End of namespace Common |