diff options
author | Alexander Tkachev | 2016-07-13 14:57:01 +0600 |
---|---|---|
committer | Alexander Tkachev | 2016-08-24 16:07:55 +0600 |
commit | 2b3caf1efadd2a68384978e77cfceab158c703f3 (patch) | |
tree | e694877b876d6fdf578f1c9e9a73ea6b2ebbfe75 /backends/cloud/box | |
parent | e0a6b2135de6a83f2ed4177c96fabf216412e5fb (diff) | |
download | scummvm-rg350-2b3caf1efadd2a68384978e77cfceab158c703f3.tar.gz scummvm-rg350-2b3caf1efadd2a68384978e77cfceab158c703f3.tar.bz2 scummvm-rg350-2b3caf1efadd2a68384978e77cfceab158c703f3.zip |
CLOUD: Add IdStorage
This is a special base class for Storages which are using ids instead of
paths in their APIs, like Box or Google Drive.
This commit makes Box derived from IdStorage.
Diffstat (limited to 'backends/cloud/box')
-rw-r--r-- | backends/cloud/box/boxlistdirectoryrequest.cpp | 129 | ||||
-rw-r--r-- | backends/cloud/box/boxlistdirectoryrequest.h | 66 | ||||
-rw-r--r-- | backends/cloud/box/boxresolveidrequest.cpp | 125 | ||||
-rw-r--r-- | backends/cloud/box/boxresolveidrequest.h | 60 | ||||
-rw-r--r-- | backends/cloud/box/boxstorage.cpp | 49 | ||||
-rw-r--r-- | backends/cloud/box/boxstorage.h | 15 |
6 files changed, 9 insertions, 435 deletions
diff --git a/backends/cloud/box/boxlistdirectoryrequest.cpp b/backends/cloud/box/boxlistdirectoryrequest.cpp deleted file mode 100644 index b35c8c80d5..0000000000 --- a/backends/cloud/box/boxlistdirectoryrequest.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* 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/box/boxlistdirectoryrequest.h" -#include "backends/cloud/box/boxstorage.h" - -namespace Cloud { -namespace Box { - -BoxListDirectoryRequest::BoxListDirectoryRequest(BoxStorage *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(); -} - -BoxListDirectoryRequest::~BoxListDirectoryRequest() { - _ignoreCallback = true; - if (_workingRequest) _workingRequest->finish(); - delete _listDirectoryCallback; -} - -void BoxListDirectoryRequest::start() { - //cleanup - _ignoreCallback = true; - if (_workingRequest) _workingRequest->finish(); - _workingRequest = nullptr; - _files.clear(); - _directoriesQueue.clear(); - _currentDirectory = StorageFile(); - _ignoreCallback = false; - - //find out that directory's id - Storage::UploadCallback innerCallback = new Common::Callback<BoxListDirectoryRequest, Storage::UploadResponse>(this, &BoxListDirectoryRequest::idResolvedCallback); - Networking::ErrorCallback innerErrorCallback = new Common::Callback<BoxListDirectoryRequest, Networking::ErrorResponse>(this, &BoxListDirectoryRequest::idResolveErrorCallback); - _workingRequest = _storage->resolveFileId(_requestedPath, innerCallback, innerErrorCallback); -} - -void BoxListDirectoryRequest::idResolvedCallback(Storage::UploadResponse response) { - _workingRequest = nullptr; - if (_ignoreCallback) return; - if (response.request) _date = response.request->date(); - - StorageFile directory = response.value; - directory.setPath(_requestedPath); - _directoriesQueue.push_back(directory); - listNextDirectory(); -} - -void BoxListDirectoryRequest::idResolveErrorCallback(Networking::ErrorResponse error) { - _workingRequest = nullptr; - if (_ignoreCallback) return; - if (error.request) _date = error.request->date(); - finishError(error); -} - -void BoxListDirectoryRequest::listNextDirectory() { - if (_directoriesQueue.empty()) { - finishListing(_files); - return; - } - - _currentDirectory = _directoriesQueue.back(); - _directoriesQueue.pop_back(); - - Storage::FileArrayCallback callback = new Common::Callback<BoxListDirectoryRequest, Storage::FileArrayResponse>(this, &BoxListDirectoryRequest::listedDirectoryCallback); - Networking::ErrorCallback failureCallback = new Common::Callback<BoxListDirectoryRequest, Networking::ErrorResponse>(this, &BoxListDirectoryRequest::listedDirectoryErrorCallback); - _workingRequest = _storage->listDirectoryById(_currentDirectory.id(), callback, failureCallback); -} - -void BoxListDirectoryRequest::listedDirectoryCallback(Storage::FileArrayResponse response) { - _workingRequest = nullptr; - if (_ignoreCallback) return; - if (response.request) _date = response.request->date(); - - for (uint32 i = 0; i < response.value.size(); ++i) { - StorageFile &file = response.value[i]; - Common::String path = _currentDirectory.path(); - if (path.size() && path.lastChar() != '/' && path.lastChar() != '\\') path += '/'; - path += file.name(); - file.setPath(path); - _files.push_back(file); - if (_requestedRecursive && file.isDirectory()) { - _directoriesQueue.push_back(file); - } - } - - listNextDirectory(); -} - -void BoxListDirectoryRequest::listedDirectoryErrorCallback(Networking::ErrorResponse error) { - _workingRequest = nullptr; - if (_ignoreCallback) return; - if (error.request) _date = error.request->date(); - finishError(error); -} - -void BoxListDirectoryRequest::handle() {} - -void BoxListDirectoryRequest::restart() { start(); } - -Common::String BoxListDirectoryRequest::date() const { return _date; } - -void BoxListDirectoryRequest::finishListing(Common::Array<StorageFile> &files) { - Request::finishSuccess(); - if (_listDirectoryCallback) (*_listDirectoryCallback)(Storage::ListDirectoryResponse(this, files)); -} - -} // End of namespace Box -} // End of namespace Cloud diff --git a/backends/cloud/box/boxlistdirectoryrequest.h b/backends/cloud/box/boxlistdirectoryrequest.h deleted file mode 100644 index 7392cdd84c..0000000000 --- a/backends/cloud/box/boxlistdirectoryrequest.h +++ /dev/null @@ -1,66 +0,0 @@ -/* 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_BOX_BOXLISTDIRECTORYREQUEST_H -#define BACKENDS_CLOUD_BOX_BOXLISTDIRECTORYREQUEST_H - -#include "backends/cloud/storage.h" -#include "backends/networking/curl/request.h" -#include "common/callback.h" - -namespace Cloud { -namespace Box { - -class BoxStorage; - -class BoxListDirectoryRequest: public Networking::Request { - Common::String _requestedPath; - bool _requestedRecursive; - BoxStorage *_storage; - Storage::ListDirectoryCallback _listDirectoryCallback; - Common::Array<StorageFile> _files; - Common::Array<StorageFile> _directoriesQueue; - StorageFile _currentDirectory; - Request *_workingRequest; - bool _ignoreCallback; - Common::String _date; - - void start(); - void idResolvedCallback(Storage::UploadResponse response); - void idResolveErrorCallback(Networking::ErrorResponse error); - void listNextDirectory(); - void listedDirectoryCallback(Storage::FileArrayResponse response); - void listedDirectoryErrorCallback(Networking::ErrorResponse error); - void finishListing(Common::Array<StorageFile> &files); -public: - BoxListDirectoryRequest(BoxStorage *storage, Common::String path, Storage::ListDirectoryCallback cb, Networking::ErrorCallback ecb, bool recursive = false); - virtual ~BoxListDirectoryRequest(); - - virtual void handle(); - virtual void restart(); - virtual Common::String date() const; -}; - -} // End of namespace Box -} // End of namespace Cloud - -#endif diff --git a/backends/cloud/box/boxresolveidrequest.cpp b/backends/cloud/box/boxresolveidrequest.cpp deleted file mode 100644 index f07a94b92b..0000000000 --- a/backends/cloud/box/boxresolveidrequest.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* 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/box/boxresolveidrequest.h" -#include "backends/cloud/box/boxstorage.h" - -namespace Cloud { -namespace Box { - -BoxResolveIdRequest::BoxResolveIdRequest(BoxStorage *storage, Common::String path, Storage::UploadCallback cb, Networking::ErrorCallback ecb, bool recursive): - Networking::Request(nullptr, ecb), - _requestedPath(path), _storage(storage), _uploadCallback(cb), - _workingRequest(nullptr), _ignoreCallback(false) { - start(); -} - -BoxResolveIdRequest::~BoxResolveIdRequest() { - _ignoreCallback = true; - if (_workingRequest) _workingRequest->finish(); - delete _uploadCallback; -} - -void BoxResolveIdRequest::start() { - //cleanup - _ignoreCallback = true; - if (_workingRequest) _workingRequest->finish(); - _workingRequest = nullptr; - _currentDirectory = ""; - _currentDirectoryId = "0"; - _ignoreCallback = false; - - listNextDirectory(StorageFile(_currentDirectoryId, 0, 0, true)); -} - -void BoxResolveIdRequest::listNextDirectory(StorageFile fileToReturn) { - if (_currentDirectory.equalsIgnoreCase(_requestedPath)) { - finishFile(fileToReturn); - return; - } - - Storage::FileArrayCallback callback = new Common::Callback<BoxResolveIdRequest, Storage::FileArrayResponse>(this, &BoxResolveIdRequest::listedDirectoryCallback); - Networking::ErrorCallback failureCallback = new Common::Callback<BoxResolveIdRequest, Networking::ErrorResponse>(this, &BoxResolveIdRequest::listedDirectoryErrorCallback); - _workingRequest = _storage->listDirectoryById(_currentDirectoryId, callback, failureCallback); -} - -void BoxResolveIdRequest::listedDirectoryCallback(Storage::FileArrayResponse response) { - _workingRequest = nullptr; - if (_ignoreCallback) return; - - Common::String currentLevelName = _requestedPath; - ///debug("'%s'", currentLevelName.c_str()); - if (_currentDirectory.size()) currentLevelName.erase(0, _currentDirectory.size()); - if (currentLevelName.size() && (currentLevelName[0] == '/' || currentLevelName[0] == '\\')) currentLevelName.erase(0, 1); - ///debug("'%s'", currentLevelName.c_str()); - for (uint32 i = 0; i < currentLevelName.size(); ++i) { - if (currentLevelName[i] == '/' || currentLevelName[i] == '\\') { - currentLevelName.erase(i); - ///debug("'%s'", currentLevelName.c_str()); - break; - } - } - - Common::String path = _currentDirectory; - if (path != "") path += "/"; - path += currentLevelName; - bool lastLevel = (path.equalsIgnoreCase(_requestedPath)); - - ///debug("so, searching for '%s' in '%s'", currentLevelName.c_str(), _currentDirectory.c_str()); - - Common::Array<StorageFile> &files = response.value; - bool found = false; - for (uint32 i = 0; i < files.size(); ++i) { - if ((files[i].isDirectory() || lastLevel) && files[i].name().equalsIgnoreCase(currentLevelName)) { - if (_currentDirectory != "") _currentDirectory += "/"; - _currentDirectory += files[i].name(); - _currentDirectoryId = files[i].id(); - ///debug("found it! new directory and its id: '%s', '%s'", _currentDirectory.c_str(), _currentDirectoryId.c_str()); - listNextDirectory(files[i]); - found = true; - break; - } - } - - if (!found) { - if (lastLevel) finishError(Networking::ErrorResponse(this, false, true, Common::String("no such file found in its parent directory\n")+_currentDirectoryId, 404)); - else finishError(Networking::ErrorResponse(this, false, true, "subdirectory not found", 400)); - } -} - -void BoxResolveIdRequest::listedDirectoryErrorCallback(Networking::ErrorResponse error) { - _workingRequest = nullptr; - if (_ignoreCallback) return; - finishError(error); -} - -void BoxResolveIdRequest::handle() {} - -void BoxResolveIdRequest::restart() { start(); } - -void BoxResolveIdRequest::finishFile(StorageFile file) { - Request::finishSuccess(); - if (_uploadCallback) (*_uploadCallback)(Storage::UploadResponse(this, file)); -} - -} // End of namespace Box -} // End of namespace Cloud diff --git a/backends/cloud/box/boxresolveidrequest.h b/backends/cloud/box/boxresolveidrequest.h deleted file mode 100644 index 3807549002..0000000000 --- a/backends/cloud/box/boxresolveidrequest.h +++ /dev/null @@ -1,60 +0,0 @@ -/* 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_BOX_BOXRESOLVEIDREQUEST_H -#define BACKENDS_CLOUD_BOX_BOXRESOLVEIDREQUEST_H - -#include "backends/cloud/storage.h" -#include "backends/networking/curl/request.h" -#include "common/callback.h" - -namespace Cloud { -namespace Box { - -class BoxStorage; - -class BoxResolveIdRequest: public Networking::Request { - Common::String _requestedPath; - BoxStorage *_storage; - Storage::UploadCallback _uploadCallback; - Common::String _currentDirectory; - Common::String _currentDirectoryId; - Request *_workingRequest; - bool _ignoreCallback; - - void start(); - void listNextDirectory(StorageFile fileToReturn); - void listedDirectoryCallback(Storage::FileArrayResponse response); - void listedDirectoryErrorCallback(Networking::ErrorResponse error); - void finishFile(StorageFile file); -public: - BoxResolveIdRequest(BoxStorage *storage, Common::String path, Storage::UploadCallback cb, Networking::ErrorCallback ecb, bool recursive = false); //TODO: why upload? - virtual ~BoxResolveIdRequest(); - - virtual void handle(); - virtual void restart(); -}; - -} // End of namespace Box -} // End of namespace Cloud - -#endif diff --git a/backends/cloud/box/boxstorage.cpp b/backends/cloud/box/boxstorage.cpp index 65f90a51d2..3681cbfaa8 100644 --- a/backends/cloud/box/boxstorage.cpp +++ b/backends/cloud/box/boxstorage.cpp @@ -23,8 +23,6 @@ #include "backends/cloud/box/boxstorage.h" #include "backends/cloud/box/boxlistdirectorybyidrequest.h" -#include "backends/cloud/box/boxlistdirectoryrequest.h" -#include "backends/cloud/box/boxresolveidrequest.h" #include "backends/cloud/box/boxtokenrefresher.h" #include "backends/cloud/cloudmanager.h" #include "backends/networking/curl/connectionmanager.h" @@ -178,17 +176,6 @@ void BoxStorage::infoInnerCallback(StorageInfoCallback outerCallback, Networking delete json; } -void BoxStorage::printJson(Networking::JsonResponse response) { - Common::JSONValue *json = response.value; - if (!json) { - warning("printJson: NULL"); - return; - } - - debug("%s", json->stringify().c_str()); - delete json; -} - void BoxStorage::fileInfoCallback(Networking::NetworkReadStreamCallback outerCallback, Networking::JsonResponse response) { if (!response.value) { warning("fileInfoCallback: NULL"); @@ -212,21 +199,9 @@ void BoxStorage::fileInfoCallback(Networking::NetworkReadStreamCallback outerCal delete response.value; } -Networking::Request *BoxStorage::resolveFileId(Common::String path, UploadCallback callback, Networking::ErrorCallback errorCallback) { - if (!errorCallback) errorCallback = getErrorPrintingCallback(); - if (!callback) callback = new Common::Callback<BoxStorage, UploadResponse>(this, &BoxStorage::printFile); - return addRequest(new BoxResolveIdRequest(this, path, callback, errorCallback)); -} - -Networking::Request *BoxStorage::listDirectory(Common::String path, ListDirectoryCallback callback, Networking::ErrorCallback errorCallback, bool recursive) { - if (!errorCallback) errorCallback = getErrorPrintingCallback(); - if (!callback) callback = new Common::Callback<BoxStorage, FileArrayResponse>(this, &BoxStorage::printFiles); - return addRequest(new BoxListDirectoryRequest(this, path, callback, errorCallback, recursive)); -} - Networking::Request *BoxStorage::listDirectoryById(Common::String id, ListDirectoryCallback callback, Networking::ErrorCallback errorCallback) { if (!errorCallback) errorCallback = getErrorPrintingCallback(); - if (!callback) callback = new Common::Callback<BoxStorage, FileArrayResponse>(this, &BoxStorage::printFiles); + if (!callback) callback = getPrintFilesCallback(); return addRequest(new BoxListDirectoryByIdRequest(this, id, callback, errorCallback)); } @@ -251,24 +226,6 @@ void BoxStorage::fileDownloaded(BoolResponse response) { else debug("download failed!"); } -void BoxStorage::printFiles(FileArrayResponse response) { - debug("files:"); - Common::Array<StorageFile> &files = response.value; - for (uint32 i = 0; i < files.size(); ++i) - debug("\t%s", files[i].path().c_str()); -} - -void BoxStorage::printBool(BoolResponse response) { - debug("bool: %s", response.value ? "true" : "false"); -} - -void BoxStorage::printFile(UploadResponse response) { - debug("\nuploaded file info:"); - debug("\tpath: %s", response.value.path().c_str()); - debug("\tsize: %u", response.value.size()); - debug("\ttimestamp: %u", response.value.timestamp()); -} - Networking::Request *BoxStorage::createDirectory(Common::String path, BoolCallback callback, Networking::ErrorCallback errorCallback) { if (!errorCallback) errorCallback = getErrorPrintingCallback(); //return addRequest(new BoxCreateDirectoryRequest(this, path, callback, errorCallback)); @@ -307,5 +264,9 @@ Common::String BoxStorage::getAuthLink() { return ""; } +Common::String BoxStorage::getRootDirectoryId() { + return "0"; +} + } // End of namespace Box } // End of namespace Cloud diff --git a/backends/cloud/box/boxstorage.h b/backends/cloud/box/boxstorage.h index d0b4d1aa84..865358c845 100644 --- a/backends/cloud/box/boxstorage.h +++ b/backends/cloud/box/boxstorage.h @@ -23,14 +23,14 @@ #ifndef BACKENDS_CLOUD_BOX_BOXSTORAGE_H #define BACKENDS_CLOUD_BOX_BOXSTORAGE_H -#include "backends/cloud/storage.h" +#include "backends/cloud/id/idstorage.h" #include "common/callback.h" #include "backends/networking/curl/curljsonrequest.h" namespace Cloud { namespace Box { -class BoxStorage: public Cloud::Storage { +class BoxStorage: public Id::IdStorage { static char *KEY, *SECRET; static void loadKeyAndSecret(); @@ -46,11 +46,7 @@ class BoxStorage: public Cloud::Storage { /** Constructs StorageInfo based on JSON response from cloud. */ void infoInnerCallback(StorageInfoCallback outerCallback, Networking::JsonResponse json); - void printJson(Networking::JsonResponse response); void fileDownloaded(BoolResponse response); - void printFiles(FileArrayResponse response); - void printBool(BoolResponse response); - void printFile(UploadResponse response); void fileInfoCallback(Networking::NetworkReadStreamCallback outerCallback, Networking::JsonResponse response); public: @@ -79,11 +75,6 @@ public: /** Public Cloud API comes down there. */ - /** Returns StorageFile with the resolved file's id. */ - virtual Networking::Request *resolveFileId(Common::String path, UploadCallback callback, Networking::ErrorCallback errorCallback); - - /** Returns ListDirectoryStatus struct with list of files. */ - virtual Networking::Request *listDirectory(Common::String path, ListDirectoryCallback callback, Networking::ErrorCallback errorCallback, bool recursive = false); virtual Networking::Request *listDirectoryById(Common::String id, ListDirectoryCallback callback, Networking::ErrorCallback errorCallback); /** Returns UploadStatus struct with info about uploaded file. */ @@ -115,6 +106,8 @@ public: */ static Common::String getAuthLink(); + virtual Common::String getRootDirectoryId(); + /** * Gets new access_token. If <code> passed is "", refresh_token is used. * Use "" in order to refresh token and pass a callback, so you could |