Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(280)

Side by Side Diff: components/sync_driver/device_info_service.cc

Issue 1712863002: [Sync] DeviceInfo implementation of MergeSyncData. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@diapply
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | components/sync_driver/device_info_service_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/sync_driver/device_info_service.h" 5 #include "components/sync_driver/device_info_service.h"
6 6
7 #include <set>
7 #include <utility> 8 #include <utility>
8 #include <vector> 9 #include <vector>
9 10
10 #include "base/bind.h" 11 #include "base/bind.h"
11 #include "base/location.h" 12 #include "base/location.h"
12 #include "sync/api/entity_change.h" 13 #include "sync/api/entity_change.h"
13 #include "sync/api/metadata_batch.h" 14 #include "sync/api/metadata_batch.h"
14 #include "sync/api/sync_error.h" 15 #include "sync/api/sync_error.h"
15 #include "sync/internal_api/public/data_batch_impl.h" 16 #include "sync/internal_api/public/data_batch_impl.h"
16 #include "sync/internal_api/public/simple_metadata_change_list.h" 17 #include "sync/internal_api/public/simple_metadata_change_list.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 63
63 DeviceInfoService::~DeviceInfoService() {} 64 DeviceInfoService::~DeviceInfoService() {}
64 65
65 scoped_ptr<MetadataChangeList> DeviceInfoService::CreateMetadataChangeList() { 66 scoped_ptr<MetadataChangeList> DeviceInfoService::CreateMetadataChangeList() {
66 return make_scoped_ptr(new SimpleMetadataChangeList()); 67 return make_scoped_ptr(new SimpleMetadataChangeList());
67 } 68 }
68 69
69 SyncError DeviceInfoService::MergeSyncData( 70 SyncError DeviceInfoService::MergeSyncData(
70 scoped_ptr<MetadataChangeList> metadata_change_list, 71 scoped_ptr<MetadataChangeList> metadata_change_list,
71 EntityDataMap entity_data_map) { 72 EntityDataMap entity_data_map) {
72 // TODO(skym): crbug.com/543406: Implementation. 73 if (!has_provider_initialized_ || !has_data_loaded_ || !change_processor()) {
73 return SyncError(); 74 return SyncError(
75 FROM_HERE, SyncError::DATATYPE_ERROR,
76 "Cannot call MergeSyncData without provider, data, and processor.",
77 syncer::DEVICE_INFO);
78 }
79
80 // Local data should typically be near empty, with the only possible value
81 // corresponding to this device. This is because on signout all device info
82 // data is blown away. However, this simplification is being ignored here and
83 // a full difference is going to be calculated to explore what other service
84 // implementations may look like.
85 std::set<std::string> local_only_tags;
86 for (const auto& kv : all_data_) {
87 local_only_tags.insert(kv.first);
88 }
89
90 bool has_changes = false;
91 std::string local_tag =
92 local_device_info_provider_->GetLocalDeviceInfo()->guid();
93 scoped_ptr<WriteBatch> batch = store_->CreateWriteBatch();
94 for (const auto& kv : entity_data_map) {
95 const std::string tag = GetClientTag(kv.second.value());
96 const DeviceInfoSpecifics& specifics =
97 kv.second.value().specifics.device_info();
98
99 // Ignore any remote changes that have our local cache guid.
100 if (tag == local_tag) {
101 continue;
102 }
103
104 // Remote data wins conflicts.
105 local_only_tags.erase(tag);
106 StoreSpecifics(make_scoped_ptr(new DeviceInfoSpecifics(specifics)),
107 batch.get());
108 has_changes = true;
109 }
110
111 for (const std::string& tag : local_only_tags) {
112 change_processor()->Put(tag, CopyIntoNewEntityData(*all_data_[tag]),
113 metadata_change_list.get());
114 }
115
116 // Transfer at the end because processor Put calls may update metadata.
117 static_cast<SimpleMetadataChangeList*>(metadata_change_list.get())
118 ->TransferChanges(store_.get(), batch.get());
119 store_->CommitWriteBatch(
120 std::move(batch),
121 base::Bind(&DeviceInfoService::OnCommit, weak_factory_.GetWeakPtr()));
122 if (has_changes) {
123 NotifyObservers();
124 }
125 return syncer::SyncError();
74 } 126 }
75 127
76 SyncError DeviceInfoService::ApplySyncChanges( 128 SyncError DeviceInfoService::ApplySyncChanges(
77 scoped_ptr<MetadataChangeList> metadata_change_list, 129 scoped_ptr<MetadataChangeList> metadata_change_list,
78 EntityChangeList entity_changes) { 130 EntityChangeList entity_changes) {
79 if (!has_provider_initialized_ || !has_data_loaded_) { 131 if (!has_provider_initialized_ || !has_data_loaded_) {
80 return SyncError( 132 return SyncError(
81 FROM_HERE, SyncError::DATATYPE_ERROR, 133 FROM_HERE, SyncError::DATATYPE_ERROR,
82 "Cannot call ApplySyncChanges before provider and data have loaded.", 134 "Cannot call ApplySyncChanges before provider and data have loaded.",
83 syncer::DEVICE_INFO); 135 syncer::DEVICE_INFO);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 if (!has_data_loaded_) { 173 if (!has_data_loaded_) {
122 callback.Run(SyncError(FROM_HERE, SyncError::DATATYPE_ERROR, 174 callback.Run(SyncError(FROM_HERE, SyncError::DATATYPE_ERROR,
123 "Cannot call GetData before data has loaded.", 175 "Cannot call GetData before data has loaded.",
124 syncer::DEVICE_INFO), 176 syncer::DEVICE_INFO),
125 scoped_ptr<DataBatchImpl>()); 177 scoped_ptr<DataBatchImpl>());
126 return; 178 return;
127 } 179 }
128 180
129 syncer::SyncError error; 181 syncer::SyncError error;
130 scoped_ptr<DataBatchImpl> batch(new DataBatchImpl()); 182 scoped_ptr<DataBatchImpl> batch(new DataBatchImpl());
131 for (auto& tag : client_tags) { 183 for (const auto& tag : client_tags) {
132 auto iter = all_data_.find(tag); 184 const auto iter = all_data_.find(tag);
133 if (iter != all_data_.end()) { 185 if (iter != all_data_.end()) {
134 batch->Put(tag, CopyIntoNewEntityData(*iter->second)); 186 batch->Put(tag, CopyIntoNewEntityData(*iter->second));
135 } 187 }
136 } 188 }
137 callback.Run(error, std::move(batch)); 189 callback.Run(error, std::move(batch));
138 } 190 }
139 191
140 void DeviceInfoService::GetAllData(DataCallback callback) { 192 void DeviceInfoService::GetAllData(DataCallback callback) {
141 if (!has_data_loaded_) { 193 if (!has_data_loaded_) {
142 callback.Run(SyncError(FROM_HERE, SyncError::DATATYPE_ERROR, 194 callback.Run(SyncError(FROM_HERE, SyncError::DATATYPE_ERROR,
143 "Cannot call GetAllData before data has loaded.", 195 "Cannot call GetAllData before data has loaded.",
144 syncer::DEVICE_INFO), 196 syncer::DEVICE_INFO),
145 scoped_ptr<DataBatchImpl>()); 197 scoped_ptr<DataBatchImpl>());
146 return; 198 return;
147 } 199 }
148 200
149 syncer::SyncError error; 201 syncer::SyncError error;
150 scoped_ptr<DataBatchImpl> batch(new DataBatchImpl()); 202 scoped_ptr<DataBatchImpl> batch(new DataBatchImpl());
151 for (auto& kv : all_data_) { 203 for (const auto& kv : all_data_) {
152 batch->Put(kv.first, CopyIntoNewEntityData(*kv.second)); 204 batch->Put(kv.first, CopyIntoNewEntityData(*kv.second));
153 } 205 }
154 callback.Run(error, std::move(batch)); 206 callback.Run(error, std::move(batch));
155 } 207 }
156 208
157 std::string DeviceInfoService::GetClientTag(const EntityData& entity_data) { 209 std::string DeviceInfoService::GetClientTag(const EntityData& entity_data) {
158 DCHECK(entity_data.specifics.has_device_info()); 210 DCHECK(entity_data.specifics.has_device_info());
159 return entity_data.specifics.device_info().cache_guid(); 211 return entity_data.specifics.device_info().cache_guid();
160 } 212 }
161 213
162 void DeviceInfoService::OnChangeProcessorSet() { 214 void DeviceInfoService::OnChangeProcessorSet() {
163 TryLoadAllMetadata(); 215 TryLoadAllMetadata();
164 } 216 }
165 217
166 bool DeviceInfoService::IsSyncing() const { 218 bool DeviceInfoService::IsSyncing() const {
167 return !all_data_.empty(); 219 return !all_data_.empty();
168 } 220 }
169 221
170 scoped_ptr<DeviceInfo> DeviceInfoService::GetDeviceInfo( 222 scoped_ptr<DeviceInfo> DeviceInfoService::GetDeviceInfo(
171 const std::string& client_id) const { 223 const std::string& client_id) const {
172 ClientIdToSpecifics::const_iterator iter = all_data_.find(client_id); 224 const ClientIdToSpecifics::const_iterator iter = all_data_.find(client_id);
173 if (iter == all_data_.end()) { 225 if (iter == all_data_.end()) {
174 return scoped_ptr<DeviceInfo>(); 226 return scoped_ptr<DeviceInfo>();
175 } 227 }
176 228
177 return CreateDeviceInfo(*iter->second); 229 return CreateDeviceInfo(*iter->second);
178 } 230 }
179 231
180 ScopedVector<DeviceInfo> DeviceInfoService::GetAllDeviceInfo() const { 232 ScopedVector<DeviceInfo> DeviceInfoService::GetAllDeviceInfo() const {
181 ScopedVector<DeviceInfo> list; 233 ScopedVector<DeviceInfo> list;
182 234
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 } 416 }
365 417
366 void DeviceInfoService::TryLoadAllMetadata() { 418 void DeviceInfoService::TryLoadAllMetadata() {
367 if (has_data_loaded_ && change_processor()) { 419 if (has_data_loaded_ && change_processor()) {
368 store_->ReadAllMetadata(base::Bind(&DeviceInfoService::OnReadAllMetadata, 420 store_->ReadAllMetadata(base::Bind(&DeviceInfoService::OnReadAllMetadata,
369 weak_factory_.GetWeakPtr())); 421 weak_factory_.GetWeakPtr()));
370 } 422 }
371 } 423 }
372 424
373 } // namespace sync_driver_v2 425 } // namespace sync_driver_v2
OLDNEW
« no previous file with comments | « no previous file | components/sync_driver/device_info_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698