diff options
author | Alexander Tkachev | 2016-07-14 07:44:58 +0600 |
---|---|---|
committer | Alexander Tkachev | 2016-08-24 16:07:55 +0600 |
commit | 5cbb3e8705f51337c6455ecb5dc7004abf82bd89 (patch) | |
tree | 8ce11f96b7b7fb898e47462e9209d60c3bc1f2ea | |
parent | d96cdacb38afd9394ab442e7b5a74cc87a495092 (diff) | |
download | scummvm-rg350-5cbb3e8705f51337c6455ecb5dc7004abf82bd89.tar.gz scummvm-rg350-5cbb3e8705f51337c6455ecb5dc7004abf82bd89.tar.bz2 scummvm-rg350-5cbb3e8705f51337c6455ecb5dc7004abf82bd89.zip |
CLOUD: Add Storage::uploadStreamSupported()
Box uses POST multipart/form requests for uploading. Such requests could
be sent with libcurl if we either have a file available or a buffer with
this file's contents.
SavesSyncRequest was using Storage::upload(ReadStream *), which couldn't
be implemented in BoxStorage. Thus I've added a method to test whether
such upload is supported and, if it's not, SavesSyncRequest uses the
other.
-rw-r--r-- | backends/cloud/box/boxstorage.cpp | 7 | ||||
-rw-r--r-- | backends/cloud/box/boxstorage.h | 3 | ||||
-rw-r--r-- | backends/cloud/savessyncrequest.cpp | 15 | ||||
-rw-r--r-- | backends/cloud/storage.cpp | 4 | ||||
-rw-r--r-- | backends/cloud/storage.h | 3 |
5 files changed, 28 insertions, 4 deletions
diff --git a/backends/cloud/box/boxstorage.cpp b/backends/cloud/box/boxstorage.cpp index 628d18b89a..35e86409c3 100644 --- a/backends/cloud/box/boxstorage.cpp +++ b/backends/cloud/box/boxstorage.cpp @@ -252,9 +252,16 @@ Networking::Request *BoxStorage::upload(Common::String remotePath, Common::Strin Networking::Request *BoxStorage::upload(Common::String path, Common::SeekableReadStream *contents, UploadCallback callback, Networking::ErrorCallback errorCallback) { warning("BoxStorage::upload(ReadStream) not implemented"); + if (errorCallback) (*errorCallback)(Networking::ErrorResponse(nullptr, false, true, "BoxStorage::upload(ReadStream) not implemented", -1)); + delete callback; + delete errorCallback; return nullptr; } +bool BoxStorage::uploadStreamSupported() { + return false; +} + Networking::Request *BoxStorage::streamFileById(Common::String id, Networking::NetworkReadStreamCallback callback, Networking::ErrorCallback errorCallback) { if (callback) { Common::String url = "https://api.box.com/2.0/files/" + id + "/content"; diff --git a/backends/cloud/box/boxstorage.h b/backends/cloud/box/boxstorage.h index 93afe4fabb..a737e9d4a1 100644 --- a/backends/cloud/box/boxstorage.h +++ b/backends/cloud/box/boxstorage.h @@ -83,6 +83,9 @@ public: virtual Networking::Request *upload(Common::String remotePath, Common::String localPath, UploadCallback callback, Networking::ErrorCallback errorCallback); virtual Networking::Request *upload(Common::String path, Common::SeekableReadStream *contents, UploadCallback callback, Networking::ErrorCallback errorCallback); + /** Returns whether Storage supports upload(ReadStream). */ + virtual bool uploadStreamSupported(); + /** Returns pointer to Networking::NetworkReadStream. */ virtual Networking::Request *streamFileById(Common::String path, Networking::NetworkReadStreamCallback callback, Networking::ErrorCallback errorCallback); diff --git a/backends/cloud/savessyncrequest.cpp b/backends/cloud/savessyncrequest.cpp index e12f5af7cc..32b22edcaa 100644 --- a/backends/cloud/savessyncrequest.cpp +++ b/backends/cloud/savessyncrequest.cpp @@ -279,10 +279,17 @@ void SavesSyncRequest::uploadNextFile() { /////// debug("uploading %s (%d %%)", _currentUploadingFile.c_str(), (int)(getProgress()*100)); /////// - _workingRequest = _storage->upload(_storage->savesDirectoryPath() + _currentUploadingFile, g_system->getSavefileManager()->openRawFile(_currentUploadingFile), - new Common::Callback<SavesSyncRequest, Storage::UploadResponse>(this, &SavesSyncRequest::fileUploadedCallback), - new Common::Callback<SavesSyncRequest, Networking::ErrorResponse>(this, &SavesSyncRequest::fileUploadedErrorCallback) - ); + if (_storage->uploadStreamSupported()) { + _workingRequest = _storage->upload(_storage->savesDirectoryPath() + _currentUploadingFile, g_system->getSavefileManager()->openRawFile(_currentUploadingFile), + new Common::Callback<SavesSyncRequest, Storage::UploadResponse>(this, &SavesSyncRequest::fileUploadedCallback), + new Common::Callback<SavesSyncRequest, Networking::ErrorResponse>(this, &SavesSyncRequest::fileUploadedErrorCallback) + ); + } else { + _workingRequest = _storage->upload(_storage->savesDirectoryPath() + _currentUploadingFile, DefaultSaveFileManager::concatWithSavesPath(_currentUploadingFile), + new Common::Callback<SavesSyncRequest, Storage::UploadResponse>(this, &SavesSyncRequest::fileUploadedCallback), + new Common::Callback<SavesSyncRequest, Networking::ErrorResponse>(this, &SavesSyncRequest::fileUploadedErrorCallback) + ); + } if (!_workingRequest) finishError(Networking::ErrorResponse(this)); } diff --git a/backends/cloud/storage.cpp b/backends/cloud/storage.cpp index 2cf851f3ba..110c97ad9c 100644 --- a/backends/cloud/storage.cpp +++ b/backends/cloud/storage.cpp @@ -85,6 +85,10 @@ Networking::Request *Storage::upload(Common::String remotePath, Common::String l return upload(remotePath, f, callback, errorCallback); } +bool Storage::uploadStreamSupported() { + return true; +} + Networking::Request *Storage::streamFile(Common::String path, Networking::NetworkReadStreamCallback callback, Networking::ErrorCallback errorCallback) { //most Storages use paths instead of ids, so this should work return streamFileById(path, callback, errorCallback); diff --git a/backends/cloud/storage.h b/backends/cloud/storage.h index 62b42697e6..273b93c764 100644 --- a/backends/cloud/storage.h +++ b/backends/cloud/storage.h @@ -126,6 +126,9 @@ public: virtual Networking::Request *upload(Common::String path, Common::SeekableReadStream *contents, UploadCallback callback, Networking::ErrorCallback errorCallback) = 0; virtual Networking::Request *upload(Common::String remotePath, Common::String localPath, UploadCallback callback, Networking::ErrorCallback errorCallback); + /** Returns whether Storage supports upload(ReadStream). */ + virtual bool uploadStreamSupported(); + /** Returns pointer to Networking::NetworkReadStream. */ virtual Networking::Request *streamFile(Common::String path, Networking::NetworkReadStreamCallback callback, Networking::ErrorCallback errorCallback); virtual Networking::Request *streamFileById(Common::String id, Networking::NetworkReadStreamCallback callback, Networking::ErrorCallback errorCallback) = 0; |