OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/shared_change_processor.h" | 5 #include "components/sync/driver/shared_change_processor.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/threading/thread_task_runner_handle.h" | 9 #include "base/threading/thread_task_runner_handle.h" |
10 #include "components/sync/api/sync_change.h" | 10 #include "components/sync/api/sync_change.h" |
11 #include "components/sync/api/syncable_service.h" | 11 #include "components/sync/api/syncable_service.h" |
12 #include "components/sync/core/data_type_error_handler.h" | 12 #include "components/sync/core/data_type_error_handler.h" |
13 #include "components/sync_driver/generic_change_processor.h" | 13 #include "components/sync/driver/generic_change_processor.h" |
14 #include "components/sync_driver/generic_change_processor_factory.h" | 14 #include "components/sync/driver/generic_change_processor_factory.h" |
15 #include "components/sync_driver/sync_client.h" | 15 #include "components/sync/driver/sync_client.h" |
16 | 16 |
17 using base::AutoLock; | 17 using base::AutoLock; |
18 | 18 |
19 namespace syncer { | 19 namespace syncer { |
20 class AttachmentService; | 20 class AttachmentService; |
21 } | 21 } |
22 | 22 |
23 namespace sync_driver { | 23 namespace sync_driver { |
24 | 24 |
25 SharedChangeProcessor::SharedChangeProcessor() | 25 SharedChangeProcessor::SharedChangeProcessor() |
26 : disconnected_(false), | 26 : disconnected_(false), |
27 type_(syncer::UNSPECIFIED), | 27 type_(syncer::UNSPECIFIED), |
28 frontend_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 28 frontend_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
29 generic_change_processor_(NULL), | 29 generic_change_processor_(NULL), |
30 error_handler_(NULL) { | 30 error_handler_(NULL) {} |
31 } | |
32 | 31 |
33 SharedChangeProcessor::~SharedChangeProcessor() { | 32 SharedChangeProcessor::~SharedChangeProcessor() { |
34 // We can either be deleted when the DTC is destroyed (on UI | 33 // We can either be deleted when the DTC is destroyed (on UI |
35 // thread), or when the syncer::SyncableService stops syncing (datatype | 34 // thread), or when the syncer::SyncableService stops syncing (datatype |
36 // thread). |generic_change_processor_|, if non-NULL, must be | 35 // thread). |generic_change_processor_|, if non-NULL, must be |
37 // deleted on |backend_loop_|. | 36 // deleted on |backend_loop_|. |
38 if (backend_task_runner_.get()) { | 37 if (backend_task_runner_.get()) { |
39 if (backend_task_runner_->BelongsToCurrentThread()) { | 38 if (backend_task_runner_->BelongsToCurrentThread()) { |
40 delete generic_change_processor_; | 39 delete generic_change_processor_; |
41 } else { | 40 } else { |
(...skipping 25 matching lines...) Expand all Loading... |
67 type_ = type; | 66 type_ = type; |
68 error_handler_ = error_handler; | 67 error_handler_ = error_handler; |
69 base::WeakPtr<syncer::SyncableService> local_service = | 68 base::WeakPtr<syncer::SyncableService> local_service = |
70 sync_client->GetSyncableServiceForType(type); | 69 sync_client->GetSyncableServiceForType(type); |
71 if (!local_service.get()) { | 70 if (!local_service.get()) { |
72 LOG(WARNING) << "SyncableService destroyed before DTC was stopped."; | 71 LOG(WARNING) << "SyncableService destroyed before DTC was stopped."; |
73 disconnected_ = true; | 72 disconnected_ = true; |
74 return base::WeakPtr<syncer::SyncableService>(); | 73 return base::WeakPtr<syncer::SyncableService>(); |
75 } | 74 } |
76 | 75 |
77 generic_change_processor_ = | 76 generic_change_processor_ = processor_factory |
78 processor_factory->CreateGenericChangeProcessor(type, | 77 ->CreateGenericChangeProcessor( |
79 user_share, | 78 type, user_share, error_handler, |
80 error_handler, | 79 local_service, merge_result, sync_client) |
81 local_service, | 80 .release(); |
82 merge_result, | |
83 sync_client).release(); | |
84 // If available, propagate attachment service to the syncable service. | 81 // If available, propagate attachment service to the syncable service. |
85 std::unique_ptr<syncer::AttachmentService> attachment_service = | 82 std::unique_ptr<syncer::AttachmentService> attachment_service = |
86 generic_change_processor_->GetAttachmentService(); | 83 generic_change_processor_->GetAttachmentService(); |
87 if (attachment_service) { | 84 if (attachment_service) { |
88 local_service->SetAttachmentService(std::move(attachment_service)); | 85 local_service->SetAttachmentService(std::move(attachment_service)); |
89 } | 86 } |
90 return local_service; | 87 return local_service; |
91 } | 88 } |
92 | 89 |
93 bool SharedChangeProcessor::Disconnect() { | 90 bool SharedChangeProcessor::Disconnect() { |
(...skipping 23 matching lines...) Expand all Loading... |
117 | 114 |
118 syncer::SyncError SharedChangeProcessor::ProcessSyncChanges( | 115 syncer::SyncError SharedChangeProcessor::ProcessSyncChanges( |
119 const tracked_objects::Location& from_here, | 116 const tracked_objects::Location& from_here, |
120 const syncer::SyncChangeList& list_of_changes) { | 117 const syncer::SyncChangeList& list_of_changes) { |
121 DCHECK(backend_task_runner_.get()); | 118 DCHECK(backend_task_runner_.get()); |
122 DCHECK(backend_task_runner_->BelongsToCurrentThread()); | 119 DCHECK(backend_task_runner_->BelongsToCurrentThread()); |
123 AutoLock lock(monitor_lock_); | 120 AutoLock lock(monitor_lock_); |
124 if (disconnected_) { | 121 if (disconnected_) { |
125 // The DTC that disconnects us must ensure it posts a StopSyncing task. | 122 // The DTC that disconnects us must ensure it posts a StopSyncing task. |
126 // If we reach this, it means it just hasn't executed yet. | 123 // If we reach this, it means it just hasn't executed yet. |
127 syncer::SyncError error(FROM_HERE, | 124 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, |
128 syncer::SyncError::DATATYPE_ERROR, | 125 "Change processor disconnected.", type_); |
129 "Change processor disconnected.", | |
130 type_); | |
131 return error; | 126 return error; |
132 } | 127 } |
133 return generic_change_processor_->ProcessSyncChanges( | 128 return generic_change_processor_->ProcessSyncChanges(from_here, |
134 from_here, list_of_changes); | 129 list_of_changes); |
135 } | 130 } |
136 | 131 |
137 syncer::SyncDataList SharedChangeProcessor::GetAllSyncData( | 132 syncer::SyncDataList SharedChangeProcessor::GetAllSyncData( |
138 syncer::ModelType type) const { | 133 syncer::ModelType type) const { |
139 syncer::SyncDataList data; | 134 syncer::SyncDataList data; |
140 GetAllSyncDataReturnError(type, &data); // Handles the disconnect case. | 135 GetAllSyncDataReturnError(type, &data); // Handles the disconnect case. |
141 return data; | 136 return data; |
142 } | 137 } |
143 | 138 |
144 syncer::SyncError SharedChangeProcessor::GetAllSyncDataReturnError( | 139 syncer::SyncError SharedChangeProcessor::GetAllSyncDataReturnError( |
145 syncer::ModelType type, | 140 syncer::ModelType type, |
146 syncer::SyncDataList* data) const { | 141 syncer::SyncDataList* data) const { |
147 DCHECK(backend_task_runner_.get()); | 142 DCHECK(backend_task_runner_.get()); |
148 DCHECK(backend_task_runner_->BelongsToCurrentThread()); | 143 DCHECK(backend_task_runner_->BelongsToCurrentThread()); |
149 AutoLock lock(monitor_lock_); | 144 AutoLock lock(monitor_lock_); |
150 if (disconnected_) { | 145 if (disconnected_) { |
151 syncer::SyncError error(FROM_HERE, | 146 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, |
152 syncer::SyncError::DATATYPE_ERROR, | 147 "Change processor disconnected.", type_); |
153 "Change processor disconnected.", | |
154 type_); | |
155 return error; | 148 return error; |
156 } | 149 } |
157 return generic_change_processor_->GetAllSyncDataReturnError(data); | 150 return generic_change_processor_->GetAllSyncDataReturnError(data); |
158 } | 151 } |
159 | 152 |
160 syncer::SyncError SharedChangeProcessor::UpdateDataTypeContext( | 153 syncer::SyncError SharedChangeProcessor::UpdateDataTypeContext( |
161 syncer::ModelType type, | 154 syncer::ModelType type, |
162 syncer::SyncChangeProcessor::ContextRefreshStatus refresh_status, | 155 syncer::SyncChangeProcessor::ContextRefreshStatus refresh_status, |
163 const std::string& context) { | 156 const std::string& context) { |
164 DCHECK(backend_task_runner_.get()); | 157 DCHECK(backend_task_runner_.get()); |
165 DCHECK(backend_task_runner_->BelongsToCurrentThread()); | 158 DCHECK(backend_task_runner_->BelongsToCurrentThread()); |
166 AutoLock lock(monitor_lock_); | 159 AutoLock lock(monitor_lock_); |
167 if (disconnected_) { | 160 if (disconnected_) { |
168 syncer::SyncError error(FROM_HERE, | 161 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, |
169 syncer::SyncError::DATATYPE_ERROR, | 162 "Change processor disconnected.", type_); |
170 "Change processor disconnected.", | |
171 type_); | |
172 return error; | 163 return error; |
173 } | 164 } |
174 return generic_change_processor_->UpdateDataTypeContext( | 165 return generic_change_processor_->UpdateDataTypeContext(type, refresh_status, |
175 type, refresh_status, context); | 166 context); |
176 } | 167 } |
177 | 168 |
178 bool SharedChangeProcessor::SyncModelHasUserCreatedNodes(bool* has_nodes) { | 169 bool SharedChangeProcessor::SyncModelHasUserCreatedNodes(bool* has_nodes) { |
179 DCHECK(backend_task_runner_.get()); | 170 DCHECK(backend_task_runner_.get()); |
180 DCHECK(backend_task_runner_->BelongsToCurrentThread()); | 171 DCHECK(backend_task_runner_->BelongsToCurrentThread()); |
181 AutoLock lock(monitor_lock_); | 172 AutoLock lock(monitor_lock_); |
182 if (disconnected_) { | 173 if (disconnected_) { |
183 LOG(ERROR) << "Change processor disconnected."; | 174 LOG(ERROR) << "Change processor disconnected."; |
184 return false; | 175 return false; |
185 } | 176 } |
(...skipping 22 matching lines...) Expand all Loading... |
208 return generic_change_processor_->GetDataTypeContext(context); | 199 return generic_change_processor_->GetDataTypeContext(context); |
209 } | 200 } |
210 | 201 |
211 syncer::SyncError SharedChangeProcessor::CreateAndUploadError( | 202 syncer::SyncError SharedChangeProcessor::CreateAndUploadError( |
212 const tracked_objects::Location& location, | 203 const tracked_objects::Location& location, |
213 const std::string& message) { | 204 const std::string& message) { |
214 AutoLock lock(monitor_lock_); | 205 AutoLock lock(monitor_lock_); |
215 if (!disconnected_) { | 206 if (!disconnected_) { |
216 return error_handler_->CreateAndUploadError(location, message, type_); | 207 return error_handler_->CreateAndUploadError(location, message, type_); |
217 } else { | 208 } else { |
218 return syncer::SyncError(location, | 209 return syncer::SyncError(location, syncer::SyncError::DATATYPE_ERROR, |
219 syncer::SyncError::DATATYPE_ERROR, | 210 message, type_); |
220 message, | |
221 type_); | |
222 } | 211 } |
223 } | 212 } |
224 | 213 |
225 } // namespace sync_driver | 214 } // namespace sync_driver |
OLD | NEW |