aboutsummaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
Diffstat (limited to 'backends')
-rw-r--r--backends/cloud/cloudmanager.cpp32
-rw-r--r--backends/cloud/cloudmanager.h19
-rw-r--r--backends/cloud/folderdownloadrequest.cpp4
-rw-r--r--backends/cloud/folderdownloadrequest.h8
-rw-r--r--backends/cloud/storage.cpp71
-rw-r--r--backends/cloud/storage.h28
6 files changed, 158 insertions, 4 deletions
diff --git a/backends/cloud/cloudmanager.cpp b/backends/cloud/cloudmanager.cpp
index 68c7e9aa8a..a1756ed5a6 100644
--- a/backends/cloud/cloudmanager.cpp
+++ b/backends/cloud/cloudmanager.cpp
@@ -274,6 +274,8 @@ bool CloudManager::isWorking() {
return false;
}
+///// SavesSyncRequest-related /////
+
bool CloudManager::isSyncing() {
Storage *storage = getCurrentStorage();
if (storage) return storage->isSyncing();
@@ -308,4 +310,34 @@ void CloudManager::setSyncTarget(GUI::CommandReceiver *target) {
if (storage) storage->setSyncTarget(target);
}
+///// DownloadFolderRequest-related /////
+
+bool CloudManager::startDownload(Common::String remotePath, Common::String localPath) {
+ Storage *storage = getCurrentStorage();
+ if (storage) return storage->startDownload(remotePath, localPath);
+ return false;
+}
+
+void CloudManager::cancelDownload() {
+ Storage *storage = getCurrentStorage();
+ if (storage) storage->cancelDownload();
+}
+
+void CloudManager::setDownloadTarget(GUI::CommandReceiver *target) {
+ Storage *storage = getCurrentStorage();
+ if (storage) storage->setDownloadTarget(target);
+}
+
+bool CloudManager::isDownloading() {
+ Storage *storage = getCurrentStorage();
+ if (storage) return storage->isDownloading();
+ return false;
+}
+
+double CloudManager::getDownloadingProgress() {
+ Storage *storage = getCurrentStorage();
+ if (storage) return storage->getDownloadingProgress();
+ return 1;
+}
+
} // End of namespace Cloud
diff --git a/backends/cloud/cloudmanager.h b/backends/cloud/cloudmanager.h
index 574c51a439..2617a9c62e 100644
--- a/backends/cloud/cloudmanager.h
+++ b/backends/cloud/cloudmanager.h
@@ -206,6 +206,8 @@ public:
/** Returns whether there are any requests running. */
bool isWorking();
+ ///// SavesSyncRequest-related /////
+
/** Returns whether there is a SavesSyncRequest running. */
bool isSyncing();
@@ -223,6 +225,23 @@ public:
/** Sets SavesSyncRequest's target to given CommandReceiver. */
void setSyncTarget(GUI::CommandReceiver *target);
+
+ ///// DownloadFolderRequest-related /////
+
+ /** Starts a folder download. */
+ bool startDownload(Common::String remotePath, Common::String localPath);
+
+ /** Cancels running download. */
+ void cancelDownload();
+
+ /** Sets FolderDownloadRequest's target to given CommandReceiver. */
+ void setDownloadTarget(GUI::CommandReceiver *target);
+
+ /** Returns whether there is a FolderDownloadRequest running. */
+ bool isDownloading();
+
+ /** Returns a number in [0, 1] range which represents current download progress (1 = complete). */
+ double getDownloadingProgress();
};
/** Shortcut for accessing the connection manager. */
diff --git a/backends/cloud/folderdownloadrequest.cpp b/backends/cloud/folderdownloadrequest.cpp
index 83296c3d15..e00f85121f 100644
--- a/backends/cloud/folderdownloadrequest.cpp
+++ b/backends/cloud/folderdownloadrequest.cpp
@@ -26,7 +26,7 @@
namespace Cloud {
FolderDownloadRequest::FolderDownloadRequest(Storage *storage, Storage::FileArrayCallback callback, Networking::ErrorCallback ecb, Common::String remoteDirectoryPath, Common::String localDirectoryPath, bool recursive):
- Request(nullptr, ecb), _storage(storage), _fileArrayCallback(callback),
+ Request(nullptr, ecb), CommandSender(nullptr), _storage(storage), _fileArrayCallback(callback),
_remoteDirectoryPath(remoteDirectoryPath), _localDirectoryPath(localDirectoryPath), _recursive(recursive),
_workingRequest(nullptr), _ignoreCallback(false) {
start();
@@ -125,4 +125,6 @@ void FolderDownloadRequest::finishDownload(Common::Array<StorageFile> &files) {
if (_fileArrayCallback) (*_fileArrayCallback)(Storage::FileArrayResponse(this, files));
}
+double FolderDownloadRequest::getProgress() { return 0; } //TODO
+
} // End of namespace Cloud
diff --git a/backends/cloud/folderdownloadrequest.h b/backends/cloud/folderdownloadrequest.h
index bf55567b2d..83d3432746 100644
--- a/backends/cloud/folderdownloadrequest.h
+++ b/backends/cloud/folderdownloadrequest.h
@@ -26,10 +26,11 @@
#include "backends/networking/curl/request.h"
#include "backends/networking/curl/networkreadstream.h"
#include "backends/cloud/storage.h"
+#include "gui/object.h"
namespace Cloud {
-class FolderDownloadRequest: public Networking::Request {
+class FolderDownloadRequest: public Networking::Request, public GUI::CommandSender {
Storage *_storage;
Storage::FileArrayCallback _fileArrayCallback;
Common::String _remoteDirectoryPath, _localDirectoryPath;
@@ -51,7 +52,10 @@ public:
virtual ~FolderDownloadRequest();
virtual void handle();
- virtual void restart();
+ virtual void restart();
+
+ /** Returns a number in range [0, 1], where 1 is "complete". */
+ double getProgress();
};
} // End of namespace Cloud
diff --git a/backends/cloud/storage.cpp b/backends/cloud/storage.cpp
index b98f213327..a08fe11a70 100644
--- a/backends/cloud/storage.cpp
+++ b/backends/cloud/storage.cpp
@@ -30,7 +30,9 @@
namespace Cloud {
-Storage::Storage(): _runningRequestsCount(0), _savesSyncRequest(nullptr) {}
+Storage::Storage():
+ _runningRequestsCount(0), _savesSyncRequest(nullptr), _syncRestartRequestsed(false),
+ _downloadFolderRequest(nullptr) {}
Storage::~Storage() {}
@@ -135,6 +137,8 @@ bool Storage::isWorking() {
return working;
}
+///// SavesSyncRequest-related /////
+
bool Storage::isSyncing() {
_runningRequestsMutex.lock();
bool syncing = _savesSyncRequest != nullptr;
@@ -183,5 +187,70 @@ void Storage::setSyncTarget(GUI::CommandReceiver *target) {
_runningRequestsMutex.unlock();
}
+///// DownloadFolderRequest-related /////
+
+bool Storage::startDownload(Common::String remotePath, Common::String localPath) {
+ _runningRequestsMutex.lock();
+ if (_downloadFolderRequest) {
+ warning("Storage::startDownload: there is a download in progress already");
+ _runningRequestsMutex.unlock();
+ return false;
+ }
+ _downloadFolderRequest = (FolderDownloadRequest *)downloadFolder(
+ remotePath, localPath,
+ new Common::Callback<Storage, Cloud::Storage::FileArrayResponse>(this, &Storage::directoryDownloadedCallback),
+ new Common::Callback<Storage, Networking::ErrorResponse>(this, &Storage::directoryDownloadedErrorCallback),
+ true
+ );
+ _runningRequestsMutex.unlock();
+ return true;
+}
+
+void Storage::cancelDownload() {
+ _runningRequestsMutex.lock();
+ if (_downloadFolderRequest)
+ _downloadFolderRequest->finish();
+ _runningRequestsMutex.unlock();
+}
+
+void Storage::setDownloadTarget(GUI::CommandReceiver *target) {
+ _runningRequestsMutex.lock();
+ if (_downloadFolderRequest)
+ _downloadFolderRequest->setTarget(target);
+ _runningRequestsMutex.unlock();
+}
+
+bool Storage::isDownloading() {
+ _runningRequestsMutex.lock();
+ bool syncing = _downloadFolderRequest != nullptr;
+ _runningRequestsMutex.unlock();
+ return syncing;
+}
+
+double Storage::getDownloadingProgress() {
+ double result = 1;
+ _runningRequestsMutex.lock();
+ if (_downloadFolderRequest)
+ result = _downloadFolderRequest->getProgress();
+ _runningRequestsMutex.unlock();
+ return result;
+}
+
+void Storage::directoryDownloadedCallback(Cloud::Storage::FileArrayResponse response) {
+ _runningRequestsMutex.lock();
+ _downloadFolderRequest = nullptr;
+ _runningRequestsMutex.unlock();
+
+ //TODO: show response.value (if not empty), show message on OSD
+}
+
+void Storage::directoryDownloadedErrorCallback(Networking::ErrorResponse error) {
+ _runningRequestsMutex.lock();
+ _downloadFolderRequest = nullptr;
+ _runningRequestsMutex.unlock();
+
+ //TODO: _showError = true;
+}
+
} // End of namespace Cloud
diff --git a/backends/cloud/storage.h b/backends/cloud/storage.h
index ace2f30864..28a20720b7 100644
--- a/backends/cloud/storage.h
+++ b/backends/cloud/storage.h
@@ -42,6 +42,7 @@ class CommandReceiver;
namespace Cloud {
class SavesSyncRequest;
+class FolderDownloadRequest;
class Storage {
public:
@@ -63,6 +64,7 @@ protected:
Common::Mutex _runningRequestsMutex;
SavesSyncRequest *_savesSyncRequest;
bool _syncRestartRequestsed;
+ FolderDownloadRequest *_downloadFolderRequest;
/** Returns default error callback (printErrorResponse). */
virtual Networking::ErrorCallback getErrorPrintingCallback();
@@ -159,6 +161,8 @@ public:
/** Returns whether there are any requests running. */
virtual bool isWorking();
+ ///// SavesSyncRequest-related /////
+
/** Returns whether there is a SavesSyncRequest running. */
virtual bool isSyncing();
@@ -176,6 +180,30 @@ public:
/** Sets SavesSyncRequest's target to given CommandReceiver. */
virtual void setSyncTarget(GUI::CommandReceiver *target);
+
+ ///// DownloadFolderRequest-related /////
+
+ /** Starts a folder download. */
+ virtual bool startDownload(Common::String remotePath, Common::String localPath);
+
+ /** Cancels running download. */
+ virtual void cancelDownload();
+
+ /** Sets FolderDownloadRequest's target to given CommandReceiver. */
+ virtual void setDownloadTarget(GUI::CommandReceiver *target);
+
+ /** Returns whether there is a FolderDownloadRequest running. */
+ virtual bool isDownloading();
+
+ /** Returns a number in [0, 1] range which represents current download progress (1 = complete). */
+ virtual double getDownloadingProgress();
+
+protected:
+ /** Finishes the download. Shows an OSD message. */
+ virtual void directoryDownloadedCallback(FileArrayResponse response);
+
+ /** Finishes the download. Shows an OSD message. */
+ virtual void directoryDownloadedErrorCallback(Networking::ErrorResponse error);
};
} // End of namespace Cloud