diff options
-rw-r--r-- | backends/cloud/dropbox/dropboxstorage.cpp | 25 | ||||
-rw-r--r-- | backends/cloud/dropbox/dropboxstorage.h | 22 | ||||
-rw-r--r-- | backends/cloud/manager.cpp | 59 | ||||
-rw-r--r-- | backends/cloud/manager.h | 6 | ||||
-rw-r--r-- | backends/cloud/storage.h | 16 | ||||
-rw-r--r-- | common/cloudmanager.h | 8 |
6 files changed, 112 insertions, 24 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; diff --git a/common/cloudmanager.h b/common/cloudmanager.h index 5919937720..d1c89454b1 100644 --- a/common/cloudmanager.h +++ b/common/cloudmanager.h @@ -41,13 +41,19 @@ public: virtual void init() = 0; /** + * Saves all information into configuration file. + */ + + virtual void save() = 0; + + /** * Returns active Storage, which could be used to interact * with cloud storage. * * @return active Cloud::Storage or null, if there is no active Storage. */ - virtual Cloud::Storage* getCurrentStorage() = 0; + virtual Cloud::Storage *getCurrentStorage() = 0; /** * Starts saves syncing process in currently active storage if there is any. |