aboutsummaryrefslogtreecommitdiff
path: root/backends/cloud
diff options
context:
space:
mode:
Diffstat (limited to 'backends/cloud')
-rw-r--r--backends/cloud/dropbox/dropboxstorage.cpp25
-rw-r--r--backends/cloud/dropbox/dropboxstorage.h22
-rw-r--r--backends/cloud/manager.cpp59
-rw-r--r--backends/cloud/manager.h6
-rw-r--r--backends/cloud/storage.h16
5 files changed, 105 insertions, 23 deletions
diff --git a/backends/cloud/dropbox/dropboxstorage.cpp b/backends/cloud/dropbox/dropboxstorage.cpp
index 49355fa845..d32d86567a 100644
--- a/backends/cloud/dropbox/dropboxstorage.cpp
+++ b/backends/cloud/dropbox/dropboxstorage.cpp
@@ -45,9 +45,12 @@ static void saveAccessTokenCallback(void *ptr) {
if (!result.contains("access_token") || !result.contains("uid")) {
warning("Bad response, no token/uid passed");
} else {
- ConfMan.set("current_storage_type", "Dropbox", "cloud");
- ConfMan.set("current_storage_access_token", result.getVal("access_token")->asString(), "cloud");
- ConfMan.set("current_storage_user_id", result.getVal("uid")->asString(), "cloud");
+ //we suppose that's the first storage
+ ConfMan.set("storages_number", "1", "cloud");
+ ConfMan.set("current_storage", "1", "cloud");
+ ConfMan.set("storage1_type", "Dropbox", "cloud");
+ ConfMan.set("storage1_access_token", result.getVal("access_token")->asString(), "cloud");
+ ConfMan.set("storage1_user_id", result.getVal("uid")->asString(), "cloud");
ConfMan.removeKey("dropbox_code", "cloud");
debug("Now please restart ScummVM to apply the changes.");
}
@@ -66,6 +69,12 @@ DropboxStorage::~DropboxStorage() {
curl_global_cleanup();
}
+void DropboxStorage::saveConfig(Common::String keyPrefix) {
+ ConfMan.set(keyPrefix + "type", "Dropbox", "cloud");
+ ConfMan.set(keyPrefix + "access_token", _token, "cloud");
+ ConfMan.set(keyPrefix + "user_id", _uid, "cloud");
+}
+
void DropboxStorage::syncSaves(BoolCallback callback) {
//this is not the real syncSaves() implementation
info(new Common::Callback<DropboxStorage, StorageInfo>(this, &DropboxStorage::infoMethodCallback));
@@ -106,22 +115,22 @@ void DropboxStorage::infoMethodCallback(StorageInfo storageInfo) {
debug("info: %s", storageInfo.info().c_str());
}
-DropboxStorage *DropboxStorage::loadFromConfig() {
+DropboxStorage *DropboxStorage::loadFromConfig(Common::String keyPrefix) {
KEY = ConfMan.get("DROPBOX_KEY", "cloud");
SECRET = ConfMan.get("DROPBOX_SECRET", "cloud");
- if (!ConfMan.hasKey("current_storage_access_token", "cloud")) {
+ if (!ConfMan.hasKey(keyPrefix + "access_token", "cloud")) {
warning("No access_token found");
return 0;
}
- if (!ConfMan.hasKey("current_storage_user_id", "cloud")) {
+ if (!ConfMan.hasKey(keyPrefix + "user_id", "cloud")) {
warning("No user_id found");
return 0;
}
- Common::String accessToken = ConfMan.get("current_storage_access_token", "cloud");
- Common::String userId = ConfMan.get("current_storage_user_id", "cloud");
+ Common::String accessToken = ConfMan.get(keyPrefix + "access_token", "cloud");
+ Common::String userId = ConfMan.get(keyPrefix + "user_id", "cloud");
return new DropboxStorage(accessToken, userId);
}
diff --git a/backends/cloud/dropbox/dropboxstorage.h b/backends/cloud/dropbox/dropboxstorage.h
index 3fc38bc1bb..493fcdd25d 100644
--- a/backends/cloud/dropbox/dropboxstorage.h
+++ b/backends/cloud/dropbox/dropboxstorage.h
@@ -45,7 +45,23 @@ class DropboxStorage: public Cloud::Storage {
public:
virtual ~DropboxStorage();
- /** Returns pointer to Common::Array<StorageFile>. */
+ /**
+ * Storage methods, which are used by CloudManager to save
+ * storage in configuration file.
+ */
+
+ /**
+ * Save storage data using ConfMan.
+ * @param keyPrefix all saved keys must start with this prefix.
+ * @note every Storage must write keyPrefix + "type" key
+ * with common value (e.g. "Dropbox").
+ */
+
+ virtual void saveConfig(Common::String keyPrefix);
+
+ /** Public Cloud API comes down there. */
+
+ /** Returns Common::Array<StorageFile>. */
virtual void listDirectory(Common::String path, FileArrayCallback callback) {} //TODO
/** Calls the callback when finished. */
@@ -66,7 +82,7 @@ public:
/** Calls the callback when finished. */
virtual void touch(Common::String path, BoolCallback callback) {} //TODO
- /** Returns pointer to the StorageInfo struct. */
+ /** Returns the StorageInfo struct. */
virtual void info(StorageInfoCallback callback);
/** This method is passed into info(). (Temporary) */
@@ -82,7 +98,7 @@ public:
* Load token and user id from configs and return DropboxStorage for those.
* @return pointer to the newly created DropboxStorage or 0 if some problem occured.
*/
- static DropboxStorage *loadFromConfig();
+ static DropboxStorage *loadFromConfig(Common::String keyPrefix);
/**
* Returns Dropbox auth link.
diff --git a/backends/cloud/manager.cpp b/backends/cloud/manager.cpp
index 7caf241497..1c11efbcef 100644
--- a/backends/cloud/manager.cpp
+++ b/backends/cloud/manager.cpp
@@ -26,28 +26,67 @@
namespace Cloud {
-Manager::Manager(): _currentStorage(0) {}
+Manager::Manager(): _currentStorageIndex(0) {}
-Manager::~Manager() { delete _currentStorage; }
+Manager::~Manager() {
+ //TODO: do we have to save storages on manager destruction?
+ for (uint32 i = 0; i < _storages.size(); ++i)
+ delete _storages[i];
+ _storages.clear();
+}
void Manager::init() {
- if (ConfMan.hasKey("current_storage_type", "cloud")) {
- Common::String storageType = ConfMan.get("current_storage_type", "cloud");
- if (storageType == "Dropbox") _currentStorage = Dropbox::DropboxStorage::loadFromConfig();
- else warning("Unknown cloud storage type '%s' passed", storageType.c_str());
+ bool offerDropbox = false;
+
+ if (ConfMan.hasKey("storages_number", "cloud")) {
+ int storages = ConfMan.getInt("storages_number", "cloud");
+ for (int i = 1; i <= storages; ++i) {
+ Storage *loaded = 0;
+ Common::String keyPrefix = Common::String::format("storage%d_", i);
+ if (ConfMan.hasKey(keyPrefix + "type", "cloud")) {
+ Common::String storageType = ConfMan.get(keyPrefix + "type", "cloud");
+ if (storageType == "Dropbox") loaded = Dropbox::DropboxStorage::loadFromConfig(keyPrefix);
+ else warning("Unknown cloud storage type '%s' passed", storageType.c_str());
+ } else {
+ warning("Cloud storage #%d (out of %d) is missing.", i, storages);
+ }
+ if (loaded) _storages.push_back(loaded);
+ }
+
+ uint32 index = 0;
+ if (ConfMan.hasKey("current_storage", "cloud")) {
+ index = ConfMan.getInt("current_storage", "cloud") - 1; //count from 1, all for UX
+ }
+ if (index >= _storages.size()) index = 0;
+ _currentStorageIndex = index;
+
+ if (_storages.size() == 0) offerDropbox = true;
+ } else {
+ offerDropbox = true;
}
- else {
+
+ if (offerDropbox) {
//this is temporary console offer to auth with Dropbox (because there is no other storage type yet anyway)
Dropbox::DropboxStorage::authThroughConsole();
}
}
-Storage* Manager::getCurrentStorage() {
- return _currentStorage;
+void Manager::save() {
+ ConfMan.set("storages_number", Common::String::format("%d", _storages.size()), "cloud");
+ ConfMan.set("current_storage", Common::String::format("%d", _currentStorageIndex + 1), "cloud");
+ for (uint32 i = 0; i < _storages.size(); ++i)
+ _storages[i]->saveConfig(Common::String::format("storage%d_", i+1));
+ ConfMan.flushToDisk();
+}
+
+Storage *Manager::getCurrentStorage() {
+ if (_currentStorageIndex < _storages.size())
+ return _storages[_currentStorageIndex];
+ return 0;
}
void Manager::syncSaves(Storage::BoolCallback callback) {
- Storage* storage = getCurrentStorage();
+ Storage *storage = getCurrentStorage();
if (storage) storage->syncSaves(callback);
}
diff --git a/backends/cloud/manager.h b/backends/cloud/manager.h
index 3ad2e0d607..e531854ba9 100644
--- a/backends/cloud/manager.h
+++ b/backends/cloud/manager.h
@@ -29,15 +29,17 @@
namespace Cloud {
class Manager: public Common::CloudManager {
- Storage* _currentStorage;
+ Common::Array<Storage *> _storages;
+ uint _currentStorageIndex;
public:
Manager();
virtual ~Manager();
virtual void init();
+ virtual void save();
- virtual Storage* getCurrentStorage();
+ virtual Storage *getCurrentStorage();
virtual void syncSaves(Storage::BoolCallback callback);
};
diff --git a/backends/cloud/storage.h b/backends/cloud/storage.h
index eaf0ba1cc8..a6b6c48fbe 100644
--- a/backends/cloud/storage.h
+++ b/backends/cloud/storage.h
@@ -42,6 +42,22 @@ public:
Storage() {}
virtual ~Storage() {}
+ /**
+ * Storage methods, which are used by CloudManager to save
+ * storage in configuration file.
+ */
+
+ /**
+ * Save storage data using ConfMan.
+ * @param keyPrefix all saved keys must start with this prefix.
+ * @note every Storage must write keyPrefix + "type" key
+ * with common value (e.g. "Dropbox").
+ */
+
+ virtual void saveConfig(Common::String keyPrefix) = 0;
+
+ /** Public Cloud API comes down there. */
+
/** Returns Common::Array<StorageFile>. */
virtual void listDirectory(Common::String path, FileArrayCallback callback) = 0;