• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
SettingSyncData(const syncer::SyncChange & sync_change)16 SettingSyncData::SettingSyncData(
17     const syncer::SyncChange& sync_change) {
18   Init(sync_change.change_type(), sync_change.sync_data());
19 }
20 
SettingSyncData(const syncer::SyncData & sync_data)21 SettingSyncData::SettingSyncData(
22     const syncer::SyncData& sync_data) {
23   Init(syncer::SyncChange::ACTION_INVALID, sync_data);
24 }
25 
Init(syncer::SyncChange::SyncChangeType change_type,const syncer::SyncData & sync_data)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 
InitFromExtensionSettingSpecifics(syncer::SyncChange::SyncChangeType change_type,const sync_pb::ExtensionSettingSpecifics & specifics)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 
SettingSyncData(syncer::SyncChange::SyncChangeType change_type,const std::string & extension_id,const std::string & key,scoped_ptr<base::Value> value)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 
~SettingSyncData()70 SettingSyncData::~SettingSyncData() {}
71 
change_type() const72 syncer::SyncChange::SyncChangeType SettingSyncData::change_type() const {
73   return internal_->change_type_;
74 }
75 
extension_id() const76 const std::string& SettingSyncData::extension_id() const {
77   return internal_->extension_id_;
78 }
79 
key() const80 const std::string& SettingSyncData::key() const {
81   return internal_->key_;
82 }
83 
value() const84 const base::Value& SettingSyncData::value() const {
85   return *internal_->value_;
86 }
87 
Internal(syncer::SyncChange::SyncChangeType change_type,const std::string & extension_id,const std::string & key,scoped_ptr<base::Value> value)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 
~Internal()100 SettingSyncData::Internal::~Internal() {}
101 
102 }  // namespace extensions
103