Home | History | Annotate | Download | only in storage
      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_SYNCABLE_SETTINGS_STORAGE_H_
      6 #define CHROME_BROWSER_EXTENSIONS_API_STORAGE_SYNCABLE_SETTINGS_STORAGE_H_
      7 
      8 #include "base/compiler_specific.h"
      9 #include "base/memory/ref_counted.h"
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/observer_list_threadsafe.h"
     12 #include "base/values.h"
     13 #include "chrome/browser/extensions/api/storage/setting_sync_data.h"
     14 #include "extensions/browser/api/storage/settings_observer.h"
     15 #include "extensions/browser/value_store/value_store.h"
     16 #include "sync/api/sync_change.h"
     17 #include "sync/api/syncable_service.h"
     18 
     19 namespace extensions {
     20 
     21 class SettingsSyncProcessor;
     22 
     23 // Decorates a ValueStore with sync behaviour.
     24 class SyncableSettingsStorage : public ValueStore {
     25  public:
     26   SyncableSettingsStorage(
     27       const scoped_refptr<SettingsObserverList>& observers,
     28       const std::string& extension_id,
     29       // Ownership taken.
     30       ValueStore* delegate,
     31       syncer::ModelType sync_type,
     32       const syncer::SyncableService::StartSyncFlare& flare);
     33 
     34   virtual ~SyncableSettingsStorage();
     35 
     36   // ValueStore implementation.
     37   virtual size_t GetBytesInUse(const std::string& key) OVERRIDE;
     38   virtual size_t GetBytesInUse(const std::vector<std::string>& keys) OVERRIDE;
     39   virtual size_t GetBytesInUse() OVERRIDE;
     40   virtual ReadResult Get(const std::string& key) OVERRIDE;
     41   virtual ReadResult Get(const std::vector<std::string>& keys) OVERRIDE;
     42   virtual ReadResult Get() OVERRIDE;
     43   virtual WriteResult Set(
     44       WriteOptions options,
     45       const std::string& key,
     46       const base::Value& value) OVERRIDE;
     47   virtual WriteResult Set(
     48       WriteOptions options, const base::DictionaryValue& values) OVERRIDE;
     49   virtual WriteResult Remove(const std::string& key) OVERRIDE;
     50   virtual WriteResult Remove(const std::vector<std::string>& keys) OVERRIDE;
     51   virtual WriteResult Clear() OVERRIDE;
     52   virtual bool Restore() OVERRIDE;
     53   virtual bool RestoreKey(const std::string& key) OVERRIDE;
     54 
     55   // Sync-related methods, analogous to those on SyncableService (handled by
     56   // ExtensionSettings), but with looser guarantees about when the methods
     57   // can be called.
     58 
     59   // Must only be called if sync isn't already active.
     60   syncer::SyncError StartSyncing(
     61       const base::DictionaryValue& sync_state,
     62       scoped_ptr<SettingsSyncProcessor> sync_processor);
     63 
     64   // May be called at any time (idempotent).
     65   void StopSyncing();
     66 
     67   // May be called at any time; changes will be ignored if sync isn't active.
     68   syncer::SyncError ProcessSyncChanges(const SettingSyncDataList& sync_changes);
     69 
     70  private:
     71   // Sends the changes from |result| to sync if it's enabled.
     72   void SyncResultIfEnabled(const ValueStore::WriteResult& result);
     73 
     74   // Sends all local settings to sync (synced settings assumed to be empty).
     75   syncer::SyncError SendLocalSettingsToSync(
     76       const base::DictionaryValue& settings);
     77 
     78   // Overwrites local state with sync state.
     79   syncer::SyncError OverwriteLocalSettingsWithSync(
     80       const base::DictionaryValue& sync_state,
     81       const base::DictionaryValue& settings);
     82 
     83   // Called when an Add/Update/Remove comes from sync.  Ownership of Value*s
     84   // are taken.
     85   syncer::SyncError OnSyncAdd(
     86       const std::string& key,
     87       base::Value* new_value,
     88       ValueStoreChangeList* changes);
     89   syncer::SyncError OnSyncUpdate(
     90       const std::string& key,
     91       base::Value* old_value,
     92       base::Value* new_value,
     93       ValueStoreChangeList* changes);
     94   syncer::SyncError OnSyncDelete(
     95       const std::string& key,
     96       base::Value* old_value,
     97       ValueStoreChangeList* changes);
     98 
     99   // List of observers to settings changes.
    100   const scoped_refptr<SettingsObserverList> observers_;
    101 
    102   // Id of the extension these settings are for.
    103   std::string const extension_id_;
    104 
    105   // Storage area to sync.
    106   const scoped_ptr<ValueStore> delegate_;
    107 
    108   // Object which sends changes to sync.
    109   scoped_ptr<SettingsSyncProcessor> sync_processor_;
    110 
    111   const syncer::ModelType sync_type_;
    112   const syncer::SyncableService::StartSyncFlare flare_;
    113 
    114   DISALLOW_COPY_AND_ASSIGN(SyncableSettingsStorage);
    115 };
    116 
    117 }  // namespace extensions
    118 
    119 #endif  // CHROME_BROWSER_EXTENSIONS_API_STORAGE_SYNCABLE_SETTINGS_STORAGE_H_
    120