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 "chrome/browser/sync_file_system/drive_backend/sync_worker.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/sync_worker.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 weak_ptr_factory_(this) { | 60 weak_ptr_factory_(this) { |
61 sequence_checker_.DetachFromSequence(); | 61 sequence_checker_.DetachFromSequence(); |
62 DCHECK(base_dir_.IsAbsolute()); | 62 DCHECK(base_dir_.IsAbsolute()); |
63 } | 63 } |
64 | 64 |
65 SyncWorker::~SyncWorker() { | 65 SyncWorker::~SyncWorker() { |
66 observers_.Clear(); | 66 observers_.Clear(); |
67 } | 67 } |
68 | 68 |
69 void SyncWorker::Initialize(std::unique_ptr<SyncEngineContext> context) { | 69 void SyncWorker::Initialize(std::unique_ptr<SyncEngineContext> context) { |
70 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 70 DCHECK(sequence_checker_.CalledOnValidSequence()); |
71 DCHECK(!task_manager_); | 71 DCHECK(!task_manager_); |
72 | 72 |
73 context_ = std::move(context); | 73 context_ = std::move(context); |
74 | 74 |
75 task_manager_.reset(new SyncTaskManager( | 75 task_manager_.reset(new SyncTaskManager( |
76 weak_ptr_factory_.GetWeakPtr(), 0 /* maximum_background_task */, | 76 weak_ptr_factory_.GetWeakPtr(), 0 /* maximum_background_task */, |
77 context_->GetWorkerTaskRunner(), | 77 context_->GetWorkerTaskRunner(), |
78 context_->GetWorkerPool())); | 78 context_->GetWorkerPool())); |
79 task_manager_->Initialize(SYNC_STATUS_OK); | 79 task_manager_->Initialize(SYNC_STATUS_OK); |
80 | 80 |
81 PostInitializeTask(); | 81 PostInitializeTask(); |
82 } | 82 } |
83 | 83 |
84 void SyncWorker::RegisterOrigin( | 84 void SyncWorker::RegisterOrigin( |
85 const GURL& origin, | 85 const GURL& origin, |
86 const SyncStatusCallback& callback) { | 86 const SyncStatusCallback& callback) { |
87 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 87 DCHECK(sequence_checker_.CalledOnValidSequence()); |
88 | 88 |
89 if (!GetMetadataDatabase()) | 89 if (!GetMetadataDatabase()) |
90 PostInitializeTask(); | 90 PostInitializeTask(); |
91 | 91 |
92 std::unique_ptr<RegisterAppTask> task( | 92 std::unique_ptr<RegisterAppTask> task( |
93 new RegisterAppTask(context_.get(), origin.host())); | 93 new RegisterAppTask(context_.get(), origin.host())); |
94 if (task->CanFinishImmediately()) { | 94 if (task->CanFinishImmediately()) { |
95 callback.Run(SYNC_STATUS_OK); | 95 callback.Run(SYNC_STATUS_OK); |
96 return; | 96 return; |
97 } | 97 } |
98 | 98 |
99 task_manager_->ScheduleSyncTask(FROM_HERE, std::move(task), | 99 task_manager_->ScheduleSyncTask(FROM_HERE, std::move(task), |
100 SyncTaskManager::PRIORITY_HIGH, callback); | 100 SyncTaskManager::PRIORITY_HIGH, callback); |
101 } | 101 } |
102 | 102 |
103 void SyncWorker::EnableOrigin( | 103 void SyncWorker::EnableOrigin( |
104 const GURL& origin, | 104 const GURL& origin, |
105 const SyncStatusCallback& callback) { | 105 const SyncStatusCallback& callback) { |
106 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 106 DCHECK(sequence_checker_.CalledOnValidSequence()); |
107 | 107 |
108 task_manager_->ScheduleTask( | 108 task_manager_->ScheduleTask( |
109 FROM_HERE, | 109 FROM_HERE, |
110 base::Bind(&SyncWorker::DoEnableApp, | 110 base::Bind(&SyncWorker::DoEnableApp, |
111 weak_ptr_factory_.GetWeakPtr(), | 111 weak_ptr_factory_.GetWeakPtr(), |
112 origin.host()), | 112 origin.host()), |
113 SyncTaskManager::PRIORITY_HIGH, | 113 SyncTaskManager::PRIORITY_HIGH, |
114 callback); | 114 callback); |
115 } | 115 } |
116 | 116 |
117 void SyncWorker::DisableOrigin( | 117 void SyncWorker::DisableOrigin( |
118 const GURL& origin, | 118 const GURL& origin, |
119 const SyncStatusCallback& callback) { | 119 const SyncStatusCallback& callback) { |
120 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 120 DCHECK(sequence_checker_.CalledOnValidSequence()); |
121 | 121 |
122 task_manager_->ScheduleTask( | 122 task_manager_->ScheduleTask( |
123 FROM_HERE, | 123 FROM_HERE, |
124 base::Bind(&SyncWorker::DoDisableApp, | 124 base::Bind(&SyncWorker::DoDisableApp, |
125 weak_ptr_factory_.GetWeakPtr(), | 125 weak_ptr_factory_.GetWeakPtr(), |
126 origin.host()), | 126 origin.host()), |
127 SyncTaskManager::PRIORITY_HIGH, | 127 SyncTaskManager::PRIORITY_HIGH, |
128 callback); | 128 callback); |
129 } | 129 } |
130 | 130 |
131 void SyncWorker::UninstallOrigin( | 131 void SyncWorker::UninstallOrigin( |
132 const GURL& origin, | 132 const GURL& origin, |
133 RemoteFileSyncService::UninstallFlag flag, | 133 RemoteFileSyncService::UninstallFlag flag, |
134 const SyncStatusCallback& callback) { | 134 const SyncStatusCallback& callback) { |
135 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 135 DCHECK(sequence_checker_.CalledOnValidSequence()); |
136 | 136 |
137 task_manager_->ScheduleSyncTask( | 137 task_manager_->ScheduleSyncTask( |
138 FROM_HERE, std::unique_ptr<SyncTask>( | 138 FROM_HERE, std::unique_ptr<SyncTask>( |
139 new UninstallAppTask(context_.get(), origin.host(), flag)), | 139 new UninstallAppTask(context_.get(), origin.host(), flag)), |
140 SyncTaskManager::PRIORITY_HIGH, callback); | 140 SyncTaskManager::PRIORITY_HIGH, callback); |
141 } | 141 } |
142 | 142 |
143 void SyncWorker::ProcessRemoteChange(const SyncFileCallback& callback) { | 143 void SyncWorker::ProcessRemoteChange(const SyncFileCallback& callback) { |
144 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 144 DCHECK(sequence_checker_.CalledOnValidSequence()); |
145 | 145 |
146 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(context_.get()); | 146 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(context_.get()); |
147 task_manager_->ScheduleSyncTask( | 147 task_manager_->ScheduleSyncTask( |
148 FROM_HERE, std::unique_ptr<SyncTask>(syncer), | 148 FROM_HERE, std::unique_ptr<SyncTask>(syncer), |
149 SyncTaskManager::PRIORITY_MED, | 149 SyncTaskManager::PRIORITY_MED, |
150 base::Bind(&SyncWorker::DidProcessRemoteChange, | 150 base::Bind(&SyncWorker::DidProcessRemoteChange, |
151 weak_ptr_factory_.GetWeakPtr(), syncer, callback)); | 151 weak_ptr_factory_.GetWeakPtr(), syncer, callback)); |
152 } | 152 } |
153 | 153 |
154 void SyncWorker::SetRemoteChangeProcessor( | 154 void SyncWorker::SetRemoteChangeProcessor( |
155 RemoteChangeProcessorOnWorker* remote_change_processor_on_worker) { | 155 RemoteChangeProcessorOnWorker* remote_change_processor_on_worker) { |
156 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 156 DCHECK(sequence_checker_.CalledOnValidSequence()); |
157 | 157 |
158 context_->SetRemoteChangeProcessor(remote_change_processor_on_worker); | 158 context_->SetRemoteChangeProcessor(remote_change_processor_on_worker); |
159 } | 159 } |
160 | 160 |
161 RemoteServiceState SyncWorker::GetCurrentState() const { | 161 RemoteServiceState SyncWorker::GetCurrentState() const { |
162 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 162 DCHECK(sequence_checker_.CalledOnValidSequence()); |
163 | 163 |
164 if (!sync_enabled_) | 164 if (!sync_enabled_) |
165 return REMOTE_SERVICE_DISABLED; | 165 return REMOTE_SERVICE_DISABLED; |
166 return service_state_; | 166 return service_state_; |
167 } | 167 } |
168 | 168 |
169 void SyncWorker::GetOriginStatusMap( | 169 void SyncWorker::GetOriginStatusMap( |
170 const RemoteFileSyncService::StatusMapCallback& callback) { | 170 const RemoteFileSyncService::StatusMapCallback& callback) { |
171 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 171 DCHECK(sequence_checker_.CalledOnValidSequence()); |
172 | 172 |
173 if (!GetMetadataDatabase()) | 173 if (!GetMetadataDatabase()) |
174 return; | 174 return; |
175 | 175 |
176 std::vector<std::string> app_ids; | 176 std::vector<std::string> app_ids; |
177 GetMetadataDatabase()->GetRegisteredAppIDs(&app_ids); | 177 GetMetadataDatabase()->GetRegisteredAppIDs(&app_ids); |
178 | 178 |
179 std::unique_ptr<RemoteFileSyncService::OriginStatusMap> status_map( | 179 std::unique_ptr<RemoteFileSyncService::OriginStatusMap> status_map( |
180 new RemoteFileSyncService::OriginStatusMap); | 180 new RemoteFileSyncService::OriginStatusMap); |
181 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); | 181 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); |
182 itr != app_ids.end(); ++itr) { | 182 itr != app_ids.end(); ++itr) { |
183 const std::string& app_id = *itr; | 183 const std::string& app_id = *itr; |
184 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); | 184 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); |
185 (*status_map)[origin] = | 185 (*status_map)[origin] = |
186 GetMetadataDatabase()->IsAppEnabled(app_id) ? "Enabled" : "Disabled"; | 186 GetMetadataDatabase()->IsAppEnabled(app_id) ? "Enabled" : "Disabled"; |
187 } | 187 } |
188 | 188 |
189 callback.Run(std::move(status_map)); | 189 callback.Run(std::move(status_map)); |
190 } | 190 } |
191 | 191 |
192 std::unique_ptr<base::ListValue> SyncWorker::DumpFiles(const GURL& origin) { | 192 std::unique_ptr<base::ListValue> SyncWorker::DumpFiles(const GURL& origin) { |
193 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 193 DCHECK(sequence_checker_.CalledOnValidSequence()); |
194 | 194 |
195 if (!GetMetadataDatabase()) | 195 if (!GetMetadataDatabase()) |
196 return std::unique_ptr<base::ListValue>(); | 196 return std::unique_ptr<base::ListValue>(); |
197 return GetMetadataDatabase()->DumpFiles(origin.host()); | 197 return GetMetadataDatabase()->DumpFiles(origin.host()); |
198 } | 198 } |
199 | 199 |
200 std::unique_ptr<base::ListValue> SyncWorker::DumpDatabase() { | 200 std::unique_ptr<base::ListValue> SyncWorker::DumpDatabase() { |
201 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 201 DCHECK(sequence_checker_.CalledOnValidSequence()); |
202 | 202 |
203 if (!GetMetadataDatabase()) | 203 if (!GetMetadataDatabase()) |
204 return std::unique_ptr<base::ListValue>(); | 204 return std::unique_ptr<base::ListValue>(); |
205 return GetMetadataDatabase()->DumpDatabase(); | 205 return GetMetadataDatabase()->DumpDatabase(); |
206 } | 206 } |
207 | 207 |
208 void SyncWorker::SetSyncEnabled(bool enabled) { | 208 void SyncWorker::SetSyncEnabled(bool enabled) { |
209 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 209 DCHECK(sequence_checker_.CalledOnValidSequence()); |
210 | 210 |
211 if (sync_enabled_ == enabled) | 211 if (sync_enabled_ == enabled) |
212 return; | 212 return; |
213 | 213 |
214 RemoteServiceState old_state = GetCurrentState(); | 214 RemoteServiceState old_state = GetCurrentState(); |
215 sync_enabled_ = enabled; | 215 sync_enabled_ = enabled; |
216 if (old_state == GetCurrentState()) | 216 if (old_state == GetCurrentState()) |
217 return; | 217 return; |
218 | 218 |
219 FOR_EACH_OBSERVER( | 219 FOR_EACH_OBSERVER( |
220 Observer, | 220 Observer, |
221 observers_, | 221 observers_, |
222 UpdateServiceState( | 222 UpdateServiceState( |
223 GetCurrentState(), | 223 GetCurrentState(), |
224 enabled ? "Sync is enabled" : "Sync is disabled")); | 224 enabled ? "Sync is enabled" : "Sync is disabled")); |
225 } | 225 } |
226 | 226 |
227 void SyncWorker::PromoteDemotedChanges(const base::Closure& callback) { | 227 void SyncWorker::PromoteDemotedChanges(const base::Closure& callback) { |
228 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 228 DCHECK(sequence_checker_.CalledOnValidSequence()); |
229 | 229 |
230 MetadataDatabase* metadata_db = GetMetadataDatabase(); | 230 MetadataDatabase* metadata_db = GetMetadataDatabase(); |
231 if (metadata_db && metadata_db->HasDemotedDirtyTracker()) { | 231 if (metadata_db && metadata_db->HasDemotedDirtyTracker()) { |
232 metadata_db->PromoteDemotedTrackers(); | 232 metadata_db->PromoteDemotedTrackers(); |
233 FOR_EACH_OBSERVER( | 233 FOR_EACH_OBSERVER( |
234 Observer, | 234 Observer, |
235 observers_, | 235 observers_, |
236 OnPendingFileListUpdated(metadata_db->CountDirtyTracker())); | 236 OnPendingFileListUpdated(metadata_db->CountDirtyTracker())); |
237 } | 237 } |
238 callback.Run(); | 238 callback.Run(); |
239 } | 239 } |
240 | 240 |
241 void SyncWorker::ApplyLocalChange(const FileChange& local_change, | 241 void SyncWorker::ApplyLocalChange(const FileChange& local_change, |
242 const base::FilePath& local_path, | 242 const base::FilePath& local_path, |
243 const SyncFileMetadata& local_metadata, | 243 const SyncFileMetadata& local_metadata, |
244 const storage::FileSystemURL& url, | 244 const storage::FileSystemURL& url, |
245 const SyncStatusCallback& callback) { | 245 const SyncStatusCallback& callback) { |
246 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 246 DCHECK(sequence_checker_.CalledOnValidSequence()); |
247 | 247 |
248 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer( | 248 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer( |
249 context_.get(), local_metadata, local_change, local_path, url); | 249 context_.get(), local_metadata, local_change, local_path, url); |
250 task_manager_->ScheduleSyncTask( | 250 task_manager_->ScheduleSyncTask( |
251 FROM_HERE, std::unique_ptr<SyncTask>(syncer), | 251 FROM_HERE, std::unique_ptr<SyncTask>(syncer), |
252 SyncTaskManager::PRIORITY_MED, | 252 SyncTaskManager::PRIORITY_MED, |
253 base::Bind(&SyncWorker::DidApplyLocalChange, | 253 base::Bind(&SyncWorker::DidApplyLocalChange, |
254 weak_ptr_factory_.GetWeakPtr(), syncer, callback)); | 254 weak_ptr_factory_.GetWeakPtr(), syncer, callback)); |
255 } | 255 } |
256 | 256 |
257 void SyncWorker::MaybeScheduleNextTask() { | 257 void SyncWorker::MaybeScheduleNextTask() { |
258 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 258 DCHECK(sequence_checker_.CalledOnValidSequence()); |
259 | 259 |
260 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) | 260 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) |
261 return; | 261 return; |
262 | 262 |
263 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated. | 263 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated. |
264 // TODO(tzik): Add an interface to get the number of dirty trackers to | 264 // TODO(tzik): Add an interface to get the number of dirty trackers to |
265 // MetadataDatabase. | 265 // MetadataDatabase. |
266 | 266 |
267 if (MaybeStartFetchChanges()) | 267 if (MaybeStartFetchChanges()) |
268 return; | 268 return; |
269 | 269 |
270 if (!call_on_idle_callback_.is_null()) { | 270 if (!call_on_idle_callback_.is_null()) { |
271 base::Closure callback = call_on_idle_callback_; | 271 base::Closure callback = call_on_idle_callback_; |
272 call_on_idle_callback_.Reset(); | 272 call_on_idle_callback_.Reset(); |
273 callback.Run(); | 273 callback.Run(); |
274 } | 274 } |
275 } | 275 } |
276 | 276 |
277 void SyncWorker::NotifyLastOperationStatus( | 277 void SyncWorker::NotifyLastOperationStatus( |
278 SyncStatusCode status, | 278 SyncStatusCode status, |
279 bool used_network) { | 279 bool used_network) { |
280 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 280 DCHECK(sequence_checker_.CalledOnValidSequence()); |
281 | 281 |
282 UpdateServiceStateFromSyncStatusCode(status, used_network); | 282 UpdateServiceStateFromSyncStatusCode(status, used_network); |
283 | 283 |
284 if (GetMetadataDatabase()) { | 284 if (GetMetadataDatabase()) { |
285 FOR_EACH_OBSERVER( | 285 FOR_EACH_OBSERVER( |
286 Observer, observers_, | 286 Observer, observers_, |
287 OnPendingFileListUpdated(GetMetadataDatabase()->CountDirtyTracker())); | 287 OnPendingFileListUpdated(GetMetadataDatabase()->CountDirtyTracker())); |
288 } | 288 } |
289 } | 289 } |
290 | 290 |
291 void SyncWorker::RecordTaskLog(std::unique_ptr<TaskLogger::TaskLog> task_log) { | 291 void SyncWorker::RecordTaskLog(std::unique_ptr<TaskLogger::TaskLog> task_log) { |
292 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 292 DCHECK(sequence_checker_.CalledOnValidSequence()); |
293 | 293 |
294 context_->GetUITaskRunner()->PostTask( | 294 context_->GetUITaskRunner()->PostTask( |
295 FROM_HERE, | 295 FROM_HERE, |
296 base::Bind(&TaskLogger::RecordLog, | 296 base::Bind(&TaskLogger::RecordLog, |
297 context_->GetTaskLogger(), | 297 context_->GetTaskLogger(), |
298 base::Passed(&task_log))); | 298 base::Passed(&task_log))); |
299 } | 299 } |
300 | 300 |
301 void SyncWorker::ActivateService(RemoteServiceState service_state, | 301 void SyncWorker::ActivateService(RemoteServiceState service_state, |
302 const std::string& description) { | 302 const std::string& description) { |
303 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 303 DCHECK(sequence_checker_.CalledOnValidSequence()); |
304 UpdateServiceState(service_state, description); | 304 UpdateServiceState(service_state, description); |
305 if (!GetMetadataDatabase()) { | 305 if (!GetMetadataDatabase()) { |
306 PostInitializeTask(); | 306 PostInitializeTask(); |
307 return; | 307 return; |
308 } | 308 } |
309 | 309 |
310 should_check_remote_change_ = true; | 310 should_check_remote_change_ = true; |
311 MaybeScheduleNextTask(); | 311 MaybeScheduleNextTask(); |
312 } | 312 } |
313 | 313 |
314 void SyncWorker::DeactivateService(const std::string& description) { | 314 void SyncWorker::DeactivateService(const std::string& description) { |
315 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 315 DCHECK(sequence_checker_.CalledOnValidSequence()); |
316 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, description); | 316 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, description); |
317 } | 317 } |
318 | 318 |
319 void SyncWorker::DetachFromSequence() { | 319 void SyncWorker::DetachFromSequence() { |
320 task_manager_->DetachFromSequence(); | 320 task_manager_->DetachFromSequence(); |
321 context_->DetachFromSequence(); | 321 context_->DetachFromSequence(); |
322 sequence_checker_.DetachFromSequence(); | 322 sequence_checker_.DetachFromSequence(); |
323 } | 323 } |
324 | 324 |
325 void SyncWorker::AddObserver(Observer* observer) { | 325 void SyncWorker::AddObserver(Observer* observer) { |
326 observers_.AddObserver(observer); | 326 observers_.AddObserver(observer); |
327 } | 327 } |
328 | 328 |
329 void SyncWorker::DoDisableApp(const std::string& app_id, | 329 void SyncWorker::DoDisableApp(const std::string& app_id, |
330 const SyncStatusCallback& callback) { | 330 const SyncStatusCallback& callback) { |
331 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 331 DCHECK(sequence_checker_.CalledOnValidSequence()); |
332 | 332 |
333 if (!GetMetadataDatabase()) { | 333 if (!GetMetadataDatabase()) { |
334 callback.Run(SYNC_STATUS_OK); | 334 callback.Run(SYNC_STATUS_OK); |
335 return; | 335 return; |
336 } | 336 } |
337 | 337 |
338 SyncStatusCode status = GetMetadataDatabase()->DisableApp(app_id); | 338 SyncStatusCode status = GetMetadataDatabase()->DisableApp(app_id); |
339 callback.Run(status); | 339 callback.Run(status); |
340 } | 340 } |
341 | 341 |
342 void SyncWorker::DoEnableApp(const std::string& app_id, | 342 void SyncWorker::DoEnableApp(const std::string& app_id, |
343 const SyncStatusCallback& callback) { | 343 const SyncStatusCallback& callback) { |
344 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 344 DCHECK(sequence_checker_.CalledOnValidSequence()); |
345 | 345 |
346 if (!GetMetadataDatabase()) { | 346 if (!GetMetadataDatabase()) { |
347 callback.Run(SYNC_STATUS_OK); | 347 callback.Run(SYNC_STATUS_OK); |
348 return; | 348 return; |
349 } | 349 } |
350 | 350 |
351 SyncStatusCode status = GetMetadataDatabase()->EnableApp(app_id); | 351 SyncStatusCode status = GetMetadataDatabase()->EnableApp(app_id); |
352 callback.Run(status); | 352 callback.Run(status); |
353 } | 353 } |
354 | 354 |
355 void SyncWorker::PostInitializeTask() { | 355 void SyncWorker::PostInitializeTask() { |
356 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 356 DCHECK(sequence_checker_.CalledOnValidSequence()); |
357 DCHECK(!GetMetadataDatabase()); | 357 DCHECK(!GetMetadataDatabase()); |
358 | 358 |
359 // This initializer task may not run if MetadataDatabase in context_ is | 359 // This initializer task may not run if MetadataDatabase in context_ is |
360 // already initialized when it runs. | 360 // already initialized when it runs. |
361 SyncEngineInitializer* initializer = | 361 SyncEngineInitializer* initializer = |
362 new SyncEngineInitializer(context_.get(), | 362 new SyncEngineInitializer(context_.get(), |
363 base_dir_.Append(kDatabaseName), | 363 base_dir_.Append(kDatabaseName), |
364 env_override_); | 364 env_override_); |
365 task_manager_->ScheduleSyncTask( | 365 task_manager_->ScheduleSyncTask( |
366 FROM_HERE, std::unique_ptr<SyncTask>(initializer), | 366 FROM_HERE, std::unique_ptr<SyncTask>(initializer), |
367 SyncTaskManager::PRIORITY_HIGH, | 367 SyncTaskManager::PRIORITY_HIGH, |
368 base::Bind(&SyncWorker::DidInitialize, weak_ptr_factory_.GetWeakPtr(), | 368 base::Bind(&SyncWorker::DidInitialize, weak_ptr_factory_.GetWeakPtr(), |
369 initializer)); | 369 initializer)); |
370 } | 370 } |
371 | 371 |
372 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, | 372 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, |
373 SyncStatusCode status) { | 373 SyncStatusCode status) { |
374 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 374 DCHECK(sequence_checker_.CalledOnValidSequence()); |
375 | 375 |
376 if (status == SYNC_STATUS_ACCESS_FORBIDDEN) { | 376 if (status == SYNC_STATUS_ACCESS_FORBIDDEN) { |
377 UpdateServiceState(REMOTE_SERVICE_ACCESS_FORBIDDEN, "Access forbidden"); | 377 UpdateServiceState(REMOTE_SERVICE_ACCESS_FORBIDDEN, "Access forbidden"); |
378 return; | 378 return; |
379 } | 379 } |
380 if (status != SYNC_STATUS_OK) { | 380 if (status != SYNC_STATUS_OK) { |
381 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, | 381 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, |
382 "Could not initialize remote service"); | 382 "Could not initialize remote service"); |
383 return; | 383 return; |
384 } | 384 } |
385 | 385 |
386 std::unique_ptr<MetadataDatabase> metadata_database = | 386 std::unique_ptr<MetadataDatabase> metadata_database = |
387 initializer->PassMetadataDatabase(); | 387 initializer->PassMetadataDatabase(); |
388 if (metadata_database) { | 388 if (metadata_database) { |
389 context_->SetMetadataDatabase(std::move(metadata_database)); | 389 context_->SetMetadataDatabase(std::move(metadata_database)); |
390 return; | 390 return; |
391 } | 391 } |
392 | 392 |
393 UpdateServiceState(REMOTE_SERVICE_OK, std::string()); | 393 UpdateServiceState(REMOTE_SERVICE_OK, std::string()); |
394 UpdateRegisteredApps(); | 394 UpdateRegisteredApps(); |
395 } | 395 } |
396 | 396 |
397 void SyncWorker::UpdateRegisteredApps() { | 397 void SyncWorker::UpdateRegisteredApps() { |
398 MetadataDatabase* metadata_db = GetMetadataDatabase(); | 398 MetadataDatabase* metadata_db = GetMetadataDatabase(); |
399 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 399 DCHECK(sequence_checker_.CalledOnValidSequence()); |
400 DCHECK(metadata_db); | 400 DCHECK(metadata_db); |
401 | 401 |
402 std::unique_ptr<std::vector<std::string>> app_ids( | 402 std::unique_ptr<std::vector<std::string>> app_ids( |
403 new std::vector<std::string>); | 403 new std::vector<std::string>); |
404 metadata_db->GetRegisteredAppIDs(app_ids.get()); | 404 metadata_db->GetRegisteredAppIDs(app_ids.get()); |
405 | 405 |
406 AppStatusMap* app_status = new AppStatusMap; | 406 AppStatusMap* app_status = new AppStatusMap; |
407 base::Closure callback = | 407 base::Closure callback = |
408 base::Bind(&SyncWorker::DidQueryAppStatus, | 408 base::Bind(&SyncWorker::DidQueryAppStatus, |
409 weak_ptr_factory_.GetWeakPtr(), | 409 weak_ptr_factory_.GetWeakPtr(), |
(...skipping 29 matching lines...) Expand all Loading... |
439 else if (!extension_service->IsExtensionEnabled(app_id)) | 439 else if (!extension_service->IsExtensionEnabled(app_id)) |
440 (*status)[app_id] = APP_STATUS_DISABLED; | 440 (*status)[app_id] = APP_STATUS_DISABLED; |
441 else | 441 else |
442 (*status)[app_id] = APP_STATUS_ENABLED; | 442 (*status)[app_id] = APP_STATUS_ENABLED; |
443 } | 443 } |
444 | 444 |
445 callback.Run(); | 445 callback.Run(); |
446 } | 446 } |
447 | 447 |
448 void SyncWorker::DidQueryAppStatus(const AppStatusMap* app_status) { | 448 void SyncWorker::DidQueryAppStatus(const AppStatusMap* app_status) { |
449 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 449 DCHECK(sequence_checker_.CalledOnValidSequence()); |
450 | 450 |
451 MetadataDatabase* metadata_db = GetMetadataDatabase(); | 451 MetadataDatabase* metadata_db = GetMetadataDatabase(); |
452 DCHECK(metadata_db); | 452 DCHECK(metadata_db); |
453 | 453 |
454 // Update the status of every origin using status from ExtensionService. | 454 // Update the status of every origin using status from ExtensionService. |
455 for (AppStatusMap::const_iterator itr = app_status->begin(); | 455 for (AppStatusMap::const_iterator itr = app_status->begin(); |
456 itr != app_status->end(); ++itr) { | 456 itr != app_status->end(); ++itr) { |
457 const std::string& app_id = itr->first; | 457 const std::string& app_id = itr->first; |
458 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); | 458 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); |
459 | 459 |
(...skipping 21 matching lines...) Expand all Loading... |
481 if (is_app_enabled && !is_app_root_tracker_enabled) | 481 if (is_app_enabled && !is_app_root_tracker_enabled) |
482 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 482 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
483 else if (!is_app_enabled && is_app_root_tracker_enabled) | 483 else if (!is_app_enabled && is_app_root_tracker_enabled) |
484 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | 484 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); |
485 } | 485 } |
486 } | 486 } |
487 | 487 |
488 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, | 488 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, |
489 const SyncFileCallback& callback, | 489 const SyncFileCallback& callback, |
490 SyncStatusCode status) { | 490 SyncStatusCode status) { |
491 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 491 DCHECK(sequence_checker_.CalledOnValidSequence()); |
492 | 492 |
493 if (syncer->is_sync_root_deletion()) { | 493 if (syncer->is_sync_root_deletion()) { |
494 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); | 494 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); |
495 PostInitializeTask(); | 495 PostInitializeTask(); |
496 callback.Run(status, syncer->url()); | 496 callback.Run(status, syncer->url()); |
497 return; | 497 return; |
498 } | 498 } |
499 | 499 |
500 if (status == SYNC_STATUS_OK) { | 500 if (status == SYNC_STATUS_OK) { |
501 if (syncer->sync_action() != SYNC_ACTION_NONE && | 501 if (syncer->sync_action() != SYNC_ACTION_NONE && |
(...skipping 14 matching lines...) Expand all Loading... |
516 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback)); | 516 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback)); |
517 } | 517 } |
518 should_check_conflict_ = true; | 518 should_check_conflict_ = true; |
519 } | 519 } |
520 callback.Run(status, syncer->url()); | 520 callback.Run(status, syncer->url()); |
521 } | 521 } |
522 | 522 |
523 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer, | 523 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer, |
524 const SyncStatusCallback& callback, | 524 const SyncStatusCallback& callback, |
525 SyncStatusCode status) { | 525 SyncStatusCode status) { |
526 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 526 DCHECK(sequence_checker_.CalledOnValidSequence()); |
527 | 527 |
528 if ((status == SYNC_STATUS_OK || status == SYNC_STATUS_RETRY) && | 528 if ((status == SYNC_STATUS_OK || status == SYNC_STATUS_RETRY) && |
529 syncer->url().is_valid() && | 529 syncer->url().is_valid() && |
530 syncer->sync_action() != SYNC_ACTION_NONE) { | 530 syncer->sync_action() != SYNC_ACTION_NONE) { |
531 storage::FileSystemURL updated_url = syncer->url(); | 531 storage::FileSystemURL updated_url = syncer->url(); |
532 if (!syncer->target_path().empty()) { | 532 if (!syncer->target_path().empty()) { |
533 updated_url = CreateSyncableFileSystemURL(syncer->url().origin(), | 533 updated_url = CreateSyncableFileSystemURL(syncer->url().origin(), |
534 syncer->target_path()); | 534 syncer->target_path()); |
535 } | 535 } |
536 FOR_EACH_OBSERVER(Observer, observers_, | 536 FOR_EACH_OBSERVER(Observer, observers_, |
(...skipping 24 matching lines...) Expand all Loading... |
561 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 561 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
562 } | 562 } |
563 | 563 |
564 if (status == SYNC_STATUS_OK) | 564 if (status == SYNC_STATUS_OK) |
565 should_check_conflict_ = true; | 565 should_check_conflict_ = true; |
566 | 566 |
567 callback.Run(status); | 567 callback.Run(status); |
568 } | 568 } |
569 | 569 |
570 bool SyncWorker::MaybeStartFetchChanges() { | 570 bool SyncWorker::MaybeStartFetchChanges() { |
571 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 571 DCHECK(sequence_checker_.CalledOnValidSequence()); |
572 | 572 |
573 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) | 573 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) |
574 return false; | 574 return false; |
575 | 575 |
576 if (!GetMetadataDatabase()) | 576 if (!GetMetadataDatabase()) |
577 return false; | 577 return false; |
578 | 578 |
579 if (listing_remote_changes_) | 579 if (listing_remote_changes_) |
580 return false; | 580 return false; |
581 | 581 |
(...skipping 19 matching lines...) Expand all Loading... |
601 should_check_remote_change_ = false; | 601 should_check_remote_change_ = false; |
602 listing_remote_changes_ = true; | 602 listing_remote_changes_ = true; |
603 time_to_check_changes_ = | 603 time_to_check_changes_ = |
604 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 604 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
605 return true; | 605 return true; |
606 } | 606 } |
607 return false; | 607 return false; |
608 } | 608 } |
609 | 609 |
610 void SyncWorker::DidResolveConflict(SyncStatusCode status) { | 610 void SyncWorker::DidResolveConflict(SyncStatusCode status) { |
611 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 611 DCHECK(sequence_checker_.CalledOnValidSequence()); |
612 | 612 |
613 if (status == SYNC_STATUS_OK || status == SYNC_STATUS_RETRY) | 613 if (status == SYNC_STATUS_OK || status == SYNC_STATUS_RETRY) |
614 should_check_conflict_ = true; | 614 should_check_conflict_ = true; |
615 } | 615 } |
616 | 616 |
617 void SyncWorker::DidFetchChanges(SyncStatusCode status) { | 617 void SyncWorker::DidFetchChanges(SyncStatusCode status) { |
618 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 618 DCHECK(sequence_checker_.CalledOnValidSequence()); |
619 | 619 |
620 if (status == SYNC_STATUS_OK) | 620 if (status == SYNC_STATUS_OK) |
621 should_check_conflict_ = true; | 621 should_check_conflict_ = true; |
622 listing_remote_changes_ = false; | 622 listing_remote_changes_ = false; |
623 } | 623 } |
624 | 624 |
625 void SyncWorker::UpdateServiceStateFromSyncStatusCode( | 625 void SyncWorker::UpdateServiceStateFromSyncStatusCode( |
626 SyncStatusCode status, | 626 SyncStatusCode status, |
627 bool used_network) { | 627 bool used_network) { |
628 switch (status) { | 628 switch (status) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 break; | 661 break; |
662 | 662 |
663 default: | 663 default: |
664 // Other errors don't affect service state | 664 // Other errors don't affect service state |
665 break; | 665 break; |
666 } | 666 } |
667 } | 667 } |
668 | 668 |
669 void SyncWorker::UpdateServiceState(RemoteServiceState state, | 669 void SyncWorker::UpdateServiceState(RemoteServiceState state, |
670 const std::string& description) { | 670 const std::string& description) { |
671 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 671 DCHECK(sequence_checker_.CalledOnValidSequence()); |
672 | 672 |
673 RemoteServiceState old_state = GetCurrentState(); | 673 RemoteServiceState old_state = GetCurrentState(); |
674 service_state_ = state; | 674 service_state_ = state; |
675 | 675 |
676 if (old_state == GetCurrentState()) | 676 if (old_state == GetCurrentState()) |
677 return; | 677 return; |
678 | 678 |
679 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 679 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
680 "Service state changed: %d->%d: %s", | 680 "Service state changed: %d->%d: %s", |
681 old_state, GetCurrentState(), description.c_str()); | 681 old_state, GetCurrentState(), description.c_str()); |
682 | 682 |
683 FOR_EACH_OBSERVER( | 683 FOR_EACH_OBSERVER( |
684 Observer, observers_, | 684 Observer, observers_, |
685 UpdateServiceState(GetCurrentState(), description)); | 685 UpdateServiceState(GetCurrentState(), description)); |
686 } | 686 } |
687 | 687 |
688 void SyncWorker::CallOnIdleForTesting(const base::Closure& callback) { | 688 void SyncWorker::CallOnIdleForTesting(const base::Closure& callback) { |
689 if (task_manager_->ScheduleTaskIfIdle( | 689 if (task_manager_->ScheduleTaskIfIdle( |
690 FROM_HERE, | 690 FROM_HERE, |
691 base::Bind(&InvokeIdleCallback, callback), | 691 base::Bind(&InvokeIdleCallback, callback), |
692 base::Bind(&EmptyStatusCallback))) | 692 base::Bind(&EmptyStatusCallback))) |
693 return; | 693 return; |
694 call_on_idle_callback_ = base::Bind( | 694 call_on_idle_callback_ = base::Bind( |
695 &SyncWorker::CallOnIdleForTesting, | 695 &SyncWorker::CallOnIdleForTesting, |
696 weak_ptr_factory_.GetWeakPtr(), | 696 weak_ptr_factory_.GetWeakPtr(), |
697 callback); | 697 callback); |
698 } | 698 } |
699 | 699 |
700 drive::DriveServiceInterface* SyncWorker::GetDriveService() { | 700 drive::DriveServiceInterface* SyncWorker::GetDriveService() { |
701 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 701 DCHECK(sequence_checker_.CalledOnValidSequence()); |
702 return context_->GetDriveService(); | 702 return context_->GetDriveService(); |
703 } | 703 } |
704 | 704 |
705 drive::DriveUploaderInterface* SyncWorker::GetDriveUploader() { | 705 drive::DriveUploaderInterface* SyncWorker::GetDriveUploader() { |
706 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 706 DCHECK(sequence_checker_.CalledOnValidSequence()); |
707 return context_->GetDriveUploader(); | 707 return context_->GetDriveUploader(); |
708 } | 708 } |
709 | 709 |
710 MetadataDatabase* SyncWorker::GetMetadataDatabase() { | 710 MetadataDatabase* SyncWorker::GetMetadataDatabase() { |
711 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 711 DCHECK(sequence_checker_.CalledOnValidSequence()); |
712 return context_->GetMetadataDatabase(); | 712 return context_->GetMetadataDatabase(); |
713 } | 713 } |
714 | 714 |
715 } // namespace drive_backend | 715 } // namespace drive_backend |
716 } // namespace sync_file_system | 716 } // namespace sync_file_system |
OLD | NEW |