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_SETTING_SYNC_DATA_H_
      6 #define CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTING_SYNC_DATA_H_
      7 
      8 #include "base/memory/ref_counted.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/values.h"
     11 #include "sync/api/sync_change.h"
     12 
     13 namespace syncer {
     14 class SyncData;
     15 }
     16 
     17 namespace sync_pb {
     18 class ExtensionSettingSpecifics;
     19 }
     20 
     21 namespace extensions {
     22 
     23 // Container for data interpreted from sync data/changes for an extension or
     24 // app setting. Safe and efficient to copy.
     25 class SettingSyncData {
     26  public:
     27   // Creates from a sync change.
     28   explicit SettingSyncData(const syncer::SyncChange& sync_change);
     29 
     30   // Creates from sync data. |change_type| will be ACTION_INVALID.
     31   explicit SettingSyncData(const syncer::SyncData& sync_data);
     32 
     33   // Creates explicitly.
     34   SettingSyncData(
     35       syncer::SyncChange::SyncChangeType change_type,
     36       const std::string& extension_id,
     37       const std::string& key,
     38       scoped_ptr<base::Value> value);
     39 
     40   ~SettingSyncData();
     41 
     42   // Returns the type of the sync change; may be ACTION_INVALID.
     43   syncer::SyncChange::SyncChangeType change_type() const;
     44 
     45   // Returns the extension id the setting is for.
     46   const std::string& extension_id() const;
     47 
     48   // Returns the settings key.
     49   const std::string& key() const;
     50 
     51   // Returns the value of the setting.
     52   const base::Value& value() const;
     53 
     54  private:
     55   // Ref-counted container for the data.
     56   // TODO(kalman): Use browser_sync::Immutable<Internal>.
     57   class Internal : public base::RefCountedThreadSafe<Internal> {
     58    public:
     59     Internal(
     60       syncer::SyncChange::SyncChangeType change_type,
     61       const std::string& extension_id,
     62       const std::string& key,
     63       scoped_ptr<base::Value> value);
     64 
     65     syncer::SyncChange::SyncChangeType change_type_;
     66     std::string extension_id_;
     67     std::string key_;
     68     scoped_ptr<base::Value> value_;
     69 
     70    private:
     71     friend class base::RefCountedThreadSafe<Internal>;
     72     ~Internal();
     73   };
     74 
     75   // Initializes internal_ from sync data for an extension or app setting.
     76   void Init(syncer::SyncChange::SyncChangeType change_type,
     77             const syncer::SyncData& sync_data);
     78 
     79   // Initializes internal_ from extension specifics.
     80   void InitFromExtensionSettingSpecifics(
     81       syncer::SyncChange::SyncChangeType change_type,
     82       const sync_pb::ExtensionSettingSpecifics& specifics);
     83 
     84   scoped_refptr<Internal> internal_;
     85 };
     86 
     87 typedef std::vector<SettingSyncData> SettingSyncDataList;
     88 
     89 }  // namespace extensions
     90 
     91 #endif  // CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTING_SYNC_DATA_H_
     92