// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTINGS_BACKEND_H_ #define CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTINGS_BACKEND_H_ #include #include #include #include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "chrome/browser/extensions/api/storage/settings_observer.h" #include "chrome/browser/extensions/api/storage/settings_storage_factory.h" #include "chrome/browser/extensions/api/storage/settings_storage_quota_enforcer.h" #include "sync/api/syncable_service.h" namespace syncer { class SyncErrorFactory; } namespace extensions { class SettingsSyncProcessor; class SyncableSettingsStorage; // Manages ValueStore objects for extensions, including routing // changes from sync to them. // Lives entirely on the FILE thread. class SettingsBackend : public syncer::SyncableService { public: // |storage_factory| is use to create leveldb storage areas. // |base_path| is the base of the extension settings directory, so the // databases will be at base_path/extension_id. // |observers| is the list of observers to settings changes. SettingsBackend( const scoped_refptr& storage_factory, const base::FilePath& base_path, syncer::ModelType sync_type, const syncer::SyncableService::StartSyncFlare& flare, const SettingsStorageQuotaEnforcer::Limits& quota, const scoped_refptr& observers); virtual ~SettingsBackend(); // Gets a weak reference to the storage area for |extension_id|. // Must be run on the FILE thread. ValueStore* GetStorage(const std::string& extension_id) const; // Deletes all setting data for an extension. Call on the FILE thread. void DeleteStorage(const std::string& extension_id); // syncer::SyncableService implementation. virtual syncer::SyncDataList GetAllSyncData( syncer::ModelType type) const OVERRIDE; virtual syncer::SyncMergeResult MergeDataAndStartSyncing( syncer::ModelType type, const syncer::SyncDataList& initial_sync_data, scoped_ptr sync_processor, scoped_ptr sync_error_factory) OVERRIDE; virtual syncer::SyncError ProcessSyncChanges( const tracked_objects::Location& from_here, const syncer::SyncChangeList& change_list) OVERRIDE; virtual void StopSyncing(syncer::ModelType type) OVERRIDE; private: // Gets a weak reference to the storage area for a given extension, // initializing sync with some initial data if sync enabled. SyncableSettingsStorage* GetOrCreateStorageWithSyncData( const std::string& extension_id, const base::DictionaryValue& sync_data) const; // Gets all extension IDs known to extension settings. This may not be all // installed extensions. std::set GetKnownExtensionIDs() const; // Creates a new SettingsSyncProcessor for an extension. scoped_ptr CreateSettingsSyncProcessor( const std::string& extension_id) const; // The Factory to use for creating leveldb storage areas. const scoped_refptr storage_factory_; // The base file path to create any leveldb databases at. const base::FilePath base_path_; // Quota limits (see SettingsStorageQuotaEnforcer). const SettingsStorageQuotaEnforcer::Limits quota_; // The list of observers to settings changes. const scoped_refptr observers_; // A cache of ValueStore objects that have already been created. // Ensure that there is only ever one created per extension. typedef std::map > StorageObjMap; mutable StorageObjMap storage_objs_; // Current sync model type. Either EXTENSION_SETTINGS or APP_SETTINGS. syncer::ModelType sync_type_; // Current sync processor, if any. scoped_ptr sync_processor_; // Current sync error handler if any. scoped_ptr sync_error_factory_; syncer::SyncableService::StartSyncFlare flare_; DISALLOW_COPY_AND_ASSIGN(SettingsBackend); }; } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTINGS_BACKEND_H_