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 #include "chrome/browser/extensions/api/storage/setting_sync_data.h"
      6 
      7 #include "base/json/json_reader.h"
      8 #include "base/json/json_writer.h"
      9 #include "sync/api/sync_data.h"
     10 #include "sync/protocol/app_setting_specifics.pb.h"
     11 #include "sync/protocol/extension_setting_specifics.pb.h"
     12 #include "sync/protocol/sync.pb.h"
     13 
     14 namespace extensions {
     15 
     16 SettingSyncData::SettingSyncData(
     17     const syncer::SyncChange& sync_change) {
     18   Init(sync_change.change_type(), sync_change.sync_data());
     19 }
     20 
     21 SettingSyncData::SettingSyncData(
     22     const syncer::SyncData& sync_data) {
     23   Init(syncer::SyncChange::ACTION_INVALID, sync_data);
     24 }
     25 
     26 void SettingSyncData::Init(
     27     syncer::SyncChange::SyncChangeType change_type,
     28     const syncer::SyncData& sync_data) {
     29   DCHECK(!internal_.get());
     30   sync_pb::EntitySpecifics specifics = sync_data.GetSpecifics();
     31   // The data must only be either extension or app specfics.
     32   DCHECK_NE(specifics.has_extension_setting(),
     33             specifics.has_app_setting());
     34   if (specifics.has_extension_setting()) {
     35     InitFromExtensionSettingSpecifics(
     36         change_type,
     37         specifics.extension_setting());
     38   } else if (specifics.has_app_setting()) {
     39     InitFromExtensionSettingSpecifics(
     40         change_type,
     41         specifics.app_setting().extension_setting());
     42   }
     43 }
     44 
     45 void SettingSyncData::InitFromExtensionSettingSpecifics(
     46     syncer::SyncChange::SyncChangeType change_type,
     47     const sync_pb::ExtensionSettingSpecifics& specifics) {
     48   DCHECK(!internal_.get());
     49   scoped_ptr<base::Value> value(
     50       base::JSONReader::Read(specifics.value()));
     51   if (!value.get()) {
     52     LOG(WARNING) << "Specifics for " << specifics.extension_id() << "/" <<
     53         specifics.key() << " had bad JSON for value: " << specifics.value();
     54     value.reset(new base::DictionaryValue());
     55   }
     56   internal_ = new Internal(
     57       change_type,
     58       specifics.extension_id(),
     59       specifics.key(),
     60       value.Pass());
     61 }
     62 
     63 SettingSyncData::SettingSyncData(
     64     syncer::SyncChange::SyncChangeType change_type,
     65     const std::string& extension_id,
     66     const std::string& key,
     67     scoped_ptr<base::Value> value)
     68     : internal_(new Internal(change_type, extension_id, key, value.Pass())) {}
     69 
     70 SettingSyncData::~SettingSyncData() {}
     71 
     72 syncer::SyncChange::SyncChangeType SettingSyncData::change_type() const {
     73   return internal_->change_type_;
     74 }
     75 
     76 const std::string& SettingSyncData::extension_id() const {
     77   return internal_->extension_id_;
     78 }
     79 
     80 const std::string& SettingSyncData::key() const {
     81   return internal_->key_;
     82 }
     83 
     84 const base::Value& SettingSyncData::value() const {
     85   return *internal_->value_;
     86 }
     87 
     88 SettingSyncData::Internal::Internal(
     89     syncer::SyncChange::SyncChangeType change_type,
     90     const std::string& extension_id,
     91     const std::string& key,
     92     scoped_ptr<base::Value> value)
     93     : change_type_(change_type),
     94       extension_id_(extension_id),
     95       key_(key),
     96       value_(value.Pass()) {
     97   DCHECK(value_.get());
     98 }
     99 
    100 SettingSyncData::Internal::~Internal() {}
    101 
    102 }  // namespace extensions
    103