OLD | NEW |
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/device_info/device_info_service.h" | 5 #include "components/sync/device_info/device_info_service.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/location.h" | 11 #include "base/location.h" |
12 #include "base/memory/ptr_util.h" | 12 #include "base/memory/ptr_util.h" |
13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
14 #include "components/sync/api/entity_change.h" | 14 #include "components/sync/api/entity_change.h" |
15 #include "components/sync/api/metadata_batch.h" | 15 #include "components/sync/api/metadata_batch.h" |
16 #include "components/sync/api/sync_error.h" | 16 #include "components/sync/api/sync_error.h" |
17 #include "components/sync/base/time.h" | 17 #include "components/sync/base/time.h" |
18 #include "components/sync/core/data_batch_impl.h" | 18 #include "components/sync/core/data_batch_impl.h" |
19 #include "components/sync/device_info/device_info_util.h" | 19 #include "components/sync/device_info/device_info_util.h" |
20 #include "components/sync/protocol/data_type_state.pb.h" | 20 #include "components/sync/protocol/data_type_state.pb.h" |
21 #include "components/sync/protocol/sync.pb.h" | 21 #include "components/sync/protocol/sync.pb.h" |
22 | 22 |
23 namespace sync_driver_v2 { | 23 namespace syncer { |
24 | 24 |
25 using base::Time; | 25 using base::Time; |
26 using base::TimeDelta; | 26 using base::TimeDelta; |
27 using syncer::SyncError; | |
28 using syncer_v2::DataBatchImpl; | |
29 using syncer_v2::EntityChange; | |
30 using syncer_v2::EntityChangeList; | |
31 using syncer_v2::EntityData; | |
32 using syncer_v2::EntityDataMap; | |
33 using syncer_v2::MetadataBatch; | |
34 using syncer_v2::MetadataChangeList; | |
35 using syncer_v2::ModelTypeStore; | |
36 using syncer_v2::SimpleMetadataChangeList; | |
37 using sync_driver::DeviceInfo; | |
38 using sync_driver::DeviceInfoUtil; | |
39 using sync_pb::DataTypeState; | 27 using sync_pb::DataTypeState; |
40 using sync_pb::DeviceInfoSpecifics; | 28 using sync_pb::DeviceInfoSpecifics; |
41 using sync_pb::EntitySpecifics; | 29 using sync_pb::EntitySpecifics; |
42 | 30 |
43 using Record = ModelTypeStore::Record; | 31 using Record = ModelTypeStore::Record; |
44 using RecordList = ModelTypeStore::RecordList; | 32 using RecordList = ModelTypeStore::RecordList; |
45 using Result = ModelTypeStore::Result; | 33 using Result = ModelTypeStore::Result; |
46 using WriteBatch = ModelTypeStore::WriteBatch; | 34 using WriteBatch = ModelTypeStore::WriteBatch; |
47 | 35 |
48 DeviceInfoService::DeviceInfoService( | 36 DeviceInfoService::DeviceInfoService( |
49 sync_driver::LocalDeviceInfoProvider* local_device_info_provider, | 37 LocalDeviceInfoProvider* local_device_info_provider, |
50 const StoreFactoryFunction& callback, | 38 const StoreFactoryFunction& callback, |
51 const ChangeProcessorFactory& change_processor_factory) | 39 const ChangeProcessorFactory& change_processor_factory) |
52 : ModelTypeService(change_processor_factory, syncer::DEVICE_INFO), | 40 : ModelTypeService(change_processor_factory, DEVICE_INFO), |
53 local_device_info_provider_(local_device_info_provider) { | 41 local_device_info_provider_(local_device_info_provider) { |
54 DCHECK(local_device_info_provider); | 42 DCHECK(local_device_info_provider); |
55 | 43 |
56 // This is not threadsafe, but presuably the provider initializes on the same | 44 // This is not threadsafe, but presuably the provider initializes on the same |
57 // thread as us so we're okay. | 45 // thread as us so we're okay. |
58 if (local_device_info_provider->GetLocalDeviceInfo()) { | 46 if (local_device_info_provider->GetLocalDeviceInfo()) { |
59 OnProviderInitialized(); | 47 OnProviderInitialized(); |
60 } else { | 48 } else { |
61 subscription_ = | 49 subscription_ = |
62 local_device_info_provider->RegisterOnInitializedCallback(base::Bind( | 50 local_device_info_provider->RegisterOnInitializedCallback(base::Bind( |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 kv.second.value().specifics.device_info(); | 89 kv.second.value().specifics.device_info(); |
102 DCHECK_EQ(kv.first, specifics.cache_guid()); | 90 DCHECK_EQ(kv.first, specifics.cache_guid()); |
103 if (specifics.cache_guid() == local_guid) { | 91 if (specifics.cache_guid() == local_guid) { |
104 // Don't Put local data if it's the same as the remote copy. | 92 // Don't Put local data if it's the same as the remote copy. |
105 if (local_info->Equals(*CopyToModel(specifics))) { | 93 if (local_info->Equals(*CopyToModel(specifics))) { |
106 local_guids_to_put.erase(local_guid); | 94 local_guids_to_put.erase(local_guid); |
107 } else { | 95 } else { |
108 // This device is valid right now and this entry is about to be | 96 // This device is valid right now and this entry is about to be |
109 // committed, use this as an opportunity to refresh the timestamp. | 97 // committed, use this as an opportunity to refresh the timestamp. |
110 all_data_[local_guid]->set_last_updated_timestamp( | 98 all_data_[local_guid]->set_last_updated_timestamp( |
111 syncer::TimeToProtoTime(Time::Now())); | 99 TimeToProtoTime(Time::Now())); |
112 } | 100 } |
113 } else { | 101 } else { |
114 // Remote data wins conflicts. | 102 // Remote data wins conflicts. |
115 local_guids_to_put.erase(specifics.cache_guid()); | 103 local_guids_to_put.erase(specifics.cache_guid()); |
116 has_changes = true; | 104 has_changes = true; |
117 StoreSpecifics(base::MakeUnique<DeviceInfoSpecifics>(specifics), | 105 StoreSpecifics(base::MakeUnique<DeviceInfoSpecifics>(specifics), |
118 batch.get()); | 106 batch.get()); |
119 } | 107 } |
120 } | 108 } |
121 | 109 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 } | 175 } |
188 | 176 |
189 callback.Run(SyncError(), std::move(batch)); | 177 callback.Run(SyncError(), std::move(batch)); |
190 } | 178 } |
191 | 179 |
192 std::string DeviceInfoService::GetClientTag(const EntityData& entity_data) { | 180 std::string DeviceInfoService::GetClientTag(const EntityData& entity_data) { |
193 DCHECK(entity_data.specifics.has_device_info()); | 181 DCHECK(entity_data.specifics.has_device_info()); |
194 return DeviceInfoUtil::SpecificsToTag(entity_data.specifics.device_info()); | 182 return DeviceInfoUtil::SpecificsToTag(entity_data.specifics.device_info()); |
195 } | 183 } |
196 | 184 |
197 std::string DeviceInfoService::GetStorageKey( | 185 std::string DeviceInfoService::GetStorageKey(const EntityData& entity_data) { |
198 const syncer_v2::EntityData& entity_data) { | |
199 DCHECK(entity_data.specifics.has_device_info()); | 186 DCHECK(entity_data.specifics.has_device_info()); |
200 return entity_data.specifics.device_info().cache_guid(); | 187 return entity_data.specifics.device_info().cache_guid(); |
201 } | 188 } |
202 | 189 |
203 void DeviceInfoService::OnChangeProcessorSet() { | 190 void DeviceInfoService::OnChangeProcessorSet() { |
204 // We've recieved a new processor that needs metadata. If we're still in the | 191 // We've recieved a new processor that needs metadata. If we're still in the |
205 // process of loading data and/or metadata, then |has_metadata_loaded_| is | 192 // process of loading data and/or metadata, then |has_metadata_loaded_| is |
206 // false and we'll wait for those async reads to happen. If we've already | 193 // false and we'll wait for those async reads to happen. If we've already |
207 // loaded metadata and then subsequently we get a new processor, we must not | 194 // loaded metadata and then subsequently we get a new processor, we must not |
208 // have created the processor ourselves because we had no metadata. So there | 195 // have created the processor ourselves because we had no metadata. So there |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
466 void DeviceInfoService::SendLocalData() { | 453 void DeviceInfoService::SendLocalData() { |
467 DCHECK(has_provider_initialized_); | 454 DCHECK(has_provider_initialized_); |
468 // TODO(skym): Handle disconnecting and reconnecting, this will currently halt | 455 // TODO(skym): Handle disconnecting and reconnecting, this will currently halt |
469 // the pulse timer and never restart it. | 456 // the pulse timer and never restart it. |
470 if (!change_processor()) { | 457 if (!change_processor()) { |
471 return; | 458 return; |
472 } | 459 } |
473 | 460 |
474 std::unique_ptr<DeviceInfoSpecifics> specifics = | 461 std::unique_ptr<DeviceInfoSpecifics> specifics = |
475 CopyToSpecifics(*local_device_info_provider_->GetLocalDeviceInfo()); | 462 CopyToSpecifics(*local_device_info_provider_->GetLocalDeviceInfo()); |
476 specifics->set_last_updated_timestamp(syncer::TimeToProtoTime(Time::Now())); | 463 specifics->set_last_updated_timestamp(TimeToProtoTime(Time::Now())); |
477 | 464 |
478 std::unique_ptr<MetadataChangeList> metadata_change_list = | 465 std::unique_ptr<MetadataChangeList> metadata_change_list = |
479 CreateMetadataChangeList(); | 466 CreateMetadataChangeList(); |
480 change_processor()->Put(specifics->cache_guid(), CopyToEntityData(*specifics), | 467 change_processor()->Put(specifics->cache_guid(), CopyToEntityData(*specifics), |
481 metadata_change_list.get()); | 468 metadata_change_list.get()); |
482 | 469 |
483 std::unique_ptr<WriteBatch> batch = store_->CreateWriteBatch(); | 470 std::unique_ptr<WriteBatch> batch = store_->CreateWriteBatch(); |
484 StoreSpecifics(std::move(specifics), batch.get()); | 471 StoreSpecifics(std::move(specifics), batch.get()); |
485 | 472 |
486 CommitAndNotify(std::move(batch), std::move(metadata_change_list), true); | 473 CommitAndNotify(std::move(batch), std::move(metadata_change_list), true); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 CreateChangeProcessor(); | 507 CreateChangeProcessor(); |
521 } | 508 } |
522 change_processor()->OnMetadataLoaded( | 509 change_processor()->OnMetadataLoaded( |
523 change_processor()->CreateAndUploadError(FROM_HERE, msg), nullptr); | 510 change_processor()->CreateAndUploadError(FROM_HERE, msg), nullptr); |
524 } | 511 } |
525 | 512 |
526 // static | 513 // static |
527 Time DeviceInfoService::GetLastUpdateTime( | 514 Time DeviceInfoService::GetLastUpdateTime( |
528 const DeviceInfoSpecifics& specifics) { | 515 const DeviceInfoSpecifics& specifics) { |
529 if (specifics.has_last_updated_timestamp()) { | 516 if (specifics.has_last_updated_timestamp()) { |
530 return syncer::ProtoTimeToTime(specifics.last_updated_timestamp()); | 517 return ProtoTimeToTime(specifics.last_updated_timestamp()); |
531 } else { | 518 } else { |
532 return Time(); | 519 return Time(); |
533 } | 520 } |
534 } | 521 } |
535 | 522 |
536 } // namespace sync_driver_v2 | 523 } // namespace syncer |
OLD | NEW |