OLD | NEW |
| (Empty) |
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<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 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<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 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<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 | |
OLD | NEW |