1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTINGS_BACKEND_H_ 6 #define CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTINGS_BACKEND_H_ 7 8 #include <map> 9 #include <set> 10 #include <string> 11 12 #include "base/compiler_specific.h" 13 #include "base/files/file_path.h" 14 #include "base/memory/linked_ptr.h" 15 #include "base/memory/ref_counted.h" 16 #include "base/memory/scoped_ptr.h" 17 #include "chrome/browser/extensions/api/storage/settings_observer.h" 18 #include "chrome/browser/extensions/api/storage/settings_storage_factory.h" 19 #include "chrome/browser/extensions/api/storage/settings_storage_quota_enforcer.h" 20 #include "sync/api/syncable_service.h" 21 22 namespace syncer { 23 class SyncErrorFactory; 24 } 25 26 namespace extensions { 27 28 class SettingsSyncProcessor; 29 class SyncableSettingsStorage; 30 31 // Manages ValueStore objects for extensions, including routing 32 // changes from sync to them. 33 // Lives entirely on the FILE thread. 34 class SettingsBackend : public syncer::SyncableService { 35 public: 36 // |storage_factory| is use to create leveldb storage areas. 37 // |base_path| is the base of the extension settings directory, so the 38 // databases will be at base_path/extension_id. 39 // |observers| is the list of observers to settings changes. 40 SettingsBackend( 41 const scoped_refptr<SettingsStorageFactory>& storage_factory, 42 const base::FilePath& base_path, 43 syncer::ModelType sync_type, 44 const syncer::SyncableService::StartSyncFlare& flare, 45 const SettingsStorageQuotaEnforcer::Limits& quota, 46 const scoped_refptr<SettingsObserverList>& observers); 47 48 virtual ~SettingsBackend(); 49 50 // Gets a weak reference to the storage area for |extension_id|. 51 // Must be run on the FILE thread. 52 ValueStore* GetStorage(const std::string& extension_id) const; 53 54 // Deletes all setting data for an extension. Call on the FILE thread. 55 void DeleteStorage(const std::string& extension_id); 56 57 // syncer::SyncableService implementation. 58 virtual syncer::SyncDataList GetAllSyncData( 59 syncer::ModelType type) const OVERRIDE; 60 virtual syncer::SyncMergeResult MergeDataAndStartSyncing( 61 syncer::ModelType type, 62 const syncer::SyncDataList& initial_sync_data, 63 scoped_ptr<syncer::SyncChangeProcessor> sync_processor, 64 scoped_ptr<syncer::SyncErrorFactory> sync_error_factory) OVERRIDE; 65 virtual syncer::SyncError ProcessSyncChanges( 66 const tracked_objects::Location& from_here, 67 const syncer::SyncChangeList& change_list) OVERRIDE; 68 virtual void StopSyncing(syncer::ModelType type) OVERRIDE; 69 70 private: 71 // Gets a weak reference to the storage area for a given extension, 72 // initializing sync with some initial data if sync enabled. 73 SyncableSettingsStorage* GetOrCreateStorageWithSyncData( 74 const std::string& extension_id, 75 const base::DictionaryValue& sync_data) const; 76 77 // Gets all extension IDs known to extension settings. This may not be all 78 // installed extensions. 79 std::set<std::string> GetKnownExtensionIDs() const; 80 81 // Creates a new SettingsSyncProcessor for an extension. 82 scoped_ptr<SettingsSyncProcessor> CreateSettingsSyncProcessor( 83 const std::string& extension_id) const; 84 85 // The Factory to use for creating leveldb storage areas. 86 const scoped_refptr<SettingsStorageFactory> storage_factory_; 87 88 // The base file path to create any leveldb databases at. 89 const base::FilePath base_path_; 90 91 // Quota limits (see SettingsStorageQuotaEnforcer). 92 const SettingsStorageQuotaEnforcer::Limits quota_; 93 94 // The list of observers to settings changes. 95 const scoped_refptr<SettingsObserverList> observers_; 96 97 // A cache of ValueStore objects that have already been created. 98 // Ensure that there is only ever one created per extension. 99 typedef std::map<std::string, linked_ptr<SyncableSettingsStorage> > 100 StorageObjMap; 101 mutable StorageObjMap storage_objs_; 102 103 // Current sync model type. Either EXTENSION_SETTINGS or APP_SETTINGS. 104 syncer::ModelType sync_type_; 105 106 // Current sync processor, if any. 107 scoped_ptr<syncer::SyncChangeProcessor> sync_processor_; 108 109 // Current sync error handler if any. 110 scoped_ptr<syncer::SyncErrorFactory> sync_error_factory_; 111 112 syncer::SyncableService::StartSyncFlare flare_; 113 114 DISALLOW_COPY_AND_ASSIGN(SettingsBackend); 115 }; 116 117 } // namespace extensions 118 119 #endif // CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTINGS_BACKEND_H_ 120