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 <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 (*status)[app_id] = SyncWorker::APP_STATUS_DISABLED; | 78 (*status)[app_id] = SyncWorker::APP_STATUS_DISABLED; |
79 else | 79 else |
80 (*status)[app_id] = SyncWorker::APP_STATUS_ENABLED; | 80 (*status)[app_id] = SyncWorker::APP_STATUS_ENABLED; |
81 } | 81 } |
82 | 82 |
83 callback.Run(); | 83 callback.Run(); |
84 } | 84 } |
85 | 85 |
86 } // namespace | 86 } // namespace |
87 | 87 |
| 88 // static |
88 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker( | 89 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker( |
89 const base::FilePath& base_dir, | 90 const base::FilePath& base_dir, |
90 Observer* observer, | 91 Observer* observer, |
91 const base::WeakPtr<ExtensionServiceInterface>& extension_service, | 92 const base::WeakPtr<ExtensionServiceInterface>& extension_service, |
92 scoped_ptr<SyncEngineContext> sync_engine_context, | 93 scoped_ptr<SyncEngineContext> sync_engine_context, |
93 leveldb::Env* env_override) { | 94 leveldb::Env* env_override) { |
94 scoped_ptr<SyncWorker> sync_worker( | 95 scoped_ptr<SyncWorker> sync_worker( |
95 new SyncWorker(base_dir, | 96 new SyncWorker(base_dir, |
96 extension_service, | 97 extension_service, |
97 sync_engine_context.Pass(), | 98 sync_engine_context.Pass(), |
98 env_override)); | 99 env_override)); |
99 sync_worker->AddObserver(observer); | 100 sync_worker->AddObserver(observer); |
100 sync_worker->Initialize(); | |
101 | 101 |
102 return sync_worker.Pass(); | 102 return sync_worker.Pass(); |
103 } | 103 } |
104 | 104 |
105 SyncWorker::~SyncWorker() {} | 105 SyncWorker::~SyncWorker() {} |
106 | 106 |
107 void SyncWorker::Initialize() { | 107 void SyncWorker::Initialize() { |
108 DCHECK(!task_manager_); | 108 DCHECK(!task_manager_); |
109 | 109 |
110 task_manager_.reset(new SyncTaskManager( | 110 task_manager_.reset(new SyncTaskManager( |
111 weak_ptr_factory_.GetWeakPtr(), 0 /* maximum_background_task */)); | 111 AsWeakPtr(), |
| 112 0 /* maximum_background_task */)); |
112 task_manager_->Initialize(SYNC_STATUS_OK); | 113 task_manager_->Initialize(SYNC_STATUS_OK); |
113 | 114 |
114 PostInitializeTask(); | 115 PostInitializeTask(); |
115 | 116 |
116 net::NetworkChangeNotifier::ConnectionType type = | 117 net::NetworkChangeNotifier::ConnectionType type = |
117 net::NetworkChangeNotifier::GetConnectionType(); | 118 net::NetworkChangeNotifier::GetConnectionType(); |
118 network_available_ = | 119 network_available_ = |
119 type != net::NetworkChangeNotifier::CONNECTION_NONE; | 120 type != net::NetworkChangeNotifier::CONNECTION_NONE; |
120 } | 121 } |
121 | 122 |
122 void SyncWorker::RegisterOrigin( | 123 void SyncWorker::RegisterOrigin( |
123 const GURL& origin, | 124 const GURL& origin, |
124 const SyncStatusCallback& callback) { | 125 const SyncStatusCallback& callback) { |
125 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken()) | 126 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken()) |
126 PostInitializeTask(); | 127 PostInitializeTask(); |
127 | 128 |
128 scoped_ptr<RegisterAppTask> task( | 129 scoped_ptr<RegisterAppTask> task( |
129 new RegisterAppTask(context_.get(), origin.host())); | 130 new RegisterAppTask(context_.get(), origin.host())); |
130 if (task->CanFinishImmediately()) { | 131 if (task->CanFinishImmediately()) { |
131 context_->GetUITaskRunner()->PostTask( | 132 context_->GetUITaskRunner()->PostTask( |
132 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); | 133 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); |
133 return; | 134 return; |
134 } | 135 } |
135 | 136 |
136 // TODO(peria): Forward |callback| to UI thread. | |
137 task_manager_->ScheduleSyncTask( | 137 task_manager_->ScheduleSyncTask( |
138 FROM_HERE, | 138 FROM_HERE, |
139 task.PassAs<SyncTask>(), | 139 task.PassAs<SyncTask>(), |
140 SyncTaskManager::PRIORITY_HIGH, | 140 SyncTaskManager::PRIORITY_HIGH, |
141 callback); | 141 callback); |
142 } | 142 } |
143 | 143 |
144 void SyncWorker::EnableOrigin( | 144 void SyncWorker::EnableOrigin( |
145 const GURL& origin, | 145 const GURL& origin, |
146 const SyncStatusCallback& callback) { | 146 const SyncStatusCallback& callback) { |
147 // TODO(peria): Forward |callback| to UI thread. | |
148 task_manager_->ScheduleTask( | 147 task_manager_->ScheduleTask( |
149 FROM_HERE, | 148 FROM_HERE, |
150 base::Bind(&SyncWorker::DoEnableApp, | 149 base::Bind(&SyncWorker::DoEnableApp, |
151 weak_ptr_factory_.GetWeakPtr(), | 150 AsWeakPtr(), |
152 origin.host()), | 151 origin.host()), |
153 SyncTaskManager::PRIORITY_HIGH, | 152 SyncTaskManager::PRIORITY_HIGH, |
154 callback); | 153 callback); |
155 } | 154 } |
156 | 155 |
157 void SyncWorker::DisableOrigin( | 156 void SyncWorker::DisableOrigin( |
158 const GURL& origin, | 157 const GURL& origin, |
159 const SyncStatusCallback& callback) { | 158 const SyncStatusCallback& callback) { |
160 // TODO(peria): Forward |callback| to UI thread. | |
161 task_manager_->ScheduleTask( | 159 task_manager_->ScheduleTask( |
162 FROM_HERE, | 160 FROM_HERE, |
163 base::Bind(&SyncWorker::DoDisableApp, | 161 base::Bind(&SyncWorker::DoDisableApp, |
164 weak_ptr_factory_.GetWeakPtr(), | 162 AsWeakPtr(), |
165 origin.host()), | 163 origin.host()), |
166 SyncTaskManager::PRIORITY_HIGH, | 164 SyncTaskManager::PRIORITY_HIGH, |
167 callback); | 165 callback); |
168 } | 166 } |
169 | 167 |
170 void SyncWorker::UninstallOrigin( | 168 void SyncWorker::UninstallOrigin( |
171 const GURL& origin, | 169 const GURL& origin, |
172 RemoteFileSyncService::UninstallFlag flag, | 170 RemoteFileSyncService::UninstallFlag flag, |
173 const SyncStatusCallback& callback) { | 171 const SyncStatusCallback& callback) { |
174 // TODO(peria): Forward |callback| to UI thread. | |
175 task_manager_->ScheduleSyncTask( | 172 task_manager_->ScheduleSyncTask( |
176 FROM_HERE, | 173 FROM_HERE, |
177 scoped_ptr<SyncTask>( | 174 scoped_ptr<SyncTask>( |
178 new UninstallAppTask(context_.get(), origin.host(), flag)), | 175 new UninstallAppTask(context_.get(), origin.host(), flag)), |
179 SyncTaskManager::PRIORITY_HIGH, | 176 SyncTaskManager::PRIORITY_HIGH, |
180 callback); | 177 callback); |
181 } | 178 } |
182 | 179 |
183 void SyncWorker::ProcessRemoteChange( | 180 void SyncWorker::ProcessRemoteChange( |
184 const SyncFileCallback& callback) { | 181 const SyncFileCallback& callback) { |
185 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(context_.get()); | 182 RemoteToLocalSyncer* syncer = new RemoteToLocalSyncer(context_.get()); |
186 task_manager_->ScheduleSyncTask( | 183 task_manager_->ScheduleSyncTask( |
187 FROM_HERE, | 184 FROM_HERE, |
188 scoped_ptr<SyncTask>(syncer), | 185 scoped_ptr<SyncTask>(syncer), |
189 SyncTaskManager::PRIORITY_MED, | 186 SyncTaskManager::PRIORITY_MED, |
190 base::Bind(&SyncWorker::DidProcessRemoteChange, | 187 base::Bind(&SyncWorker::DidProcessRemoteChange, |
191 weak_ptr_factory_.GetWeakPtr(), | 188 AsWeakPtr(), |
192 syncer, callback)); | 189 syncer, callback)); |
193 } | 190 } |
194 | 191 |
195 void SyncWorker::SetRemoteChangeProcessor( | 192 void SyncWorker::SetRemoteChangeProcessor( |
196 RemoteChangeProcessorOnWorker* remote_change_processor_on_worker) { | 193 RemoteChangeProcessorOnWorker* remote_change_processor_on_worker) { |
197 context_->SetRemoteChangeProcessor(remote_change_processor_on_worker); | 194 context_->SetRemoteChangeProcessor(remote_change_processor_on_worker); |
198 } | 195 } |
199 | 196 |
200 RemoteServiceState SyncWorker::GetCurrentState() const { | 197 RemoteServiceState SyncWorker::GetCurrentState() const { |
201 if (!sync_enabled_) | 198 if (!sync_enabled_) |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 const SyncFileMetadata& local_metadata, | 280 const SyncFileMetadata& local_metadata, |
284 const fileapi::FileSystemURL& url, | 281 const fileapi::FileSystemURL& url, |
285 const SyncStatusCallback& callback) { | 282 const SyncStatusCallback& callback) { |
286 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer( | 283 LocalToRemoteSyncer* syncer = new LocalToRemoteSyncer( |
287 context_.get(), local_metadata, local_change, local_path, url); | 284 context_.get(), local_metadata, local_change, local_path, url); |
288 task_manager_->ScheduleSyncTask( | 285 task_manager_->ScheduleSyncTask( |
289 FROM_HERE, | 286 FROM_HERE, |
290 scoped_ptr<SyncTask>(syncer), | 287 scoped_ptr<SyncTask>(syncer), |
291 SyncTaskManager::PRIORITY_MED, | 288 SyncTaskManager::PRIORITY_MED, |
292 base::Bind(&SyncWorker::DidApplyLocalChange, | 289 base::Bind(&SyncWorker::DidApplyLocalChange, |
293 weak_ptr_factory_.GetWeakPtr(), | 290 AsWeakPtr(), |
294 syncer, callback)); | 291 syncer, callback)); |
295 } | 292 } |
296 | 293 |
297 void SyncWorker::MaybeScheduleNextTask() { | 294 void SyncWorker::MaybeScheduleNextTask() { |
298 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) | 295 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) |
299 return; | 296 return; |
300 | 297 |
301 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated. | 298 // TODO(tzik): Notify observer of OnRemoteChangeQueueUpdated. |
302 // TODO(tzik): Add an interface to get the number of dirty trackers to | 299 // TODO(tzik): Add an interface to get the number of dirty trackers to |
303 // MetadataDatabase. | 300 // MetadataDatabase. |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 env_override_(env_override), | 387 env_override_(env_override), |
391 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), | 388 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), |
392 should_check_conflict_(true), | 389 should_check_conflict_(true), |
393 should_check_remote_change_(true), | 390 should_check_remote_change_(true), |
394 listing_remote_changes_(false), | 391 listing_remote_changes_(false), |
395 sync_enabled_(false), | 392 sync_enabled_(false), |
396 default_conflict_resolution_policy_( | 393 default_conflict_resolution_policy_( |
397 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), | 394 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), |
398 network_available_(false), | 395 network_available_(false), |
399 extension_service_(extension_service), | 396 extension_service_(extension_service), |
400 context_(sync_engine_context.Pass()), | 397 context_(sync_engine_context.Pass()) {} |
401 weak_ptr_factory_(this) {} | |
402 | 398 |
403 void SyncWorker::DoDisableApp(const std::string& app_id, | 399 void SyncWorker::DoDisableApp(const std::string& app_id, |
404 const SyncStatusCallback& callback) { | 400 const SyncStatusCallback& callback) { |
405 if (GetMetadataDatabase()) { | 401 if (GetMetadataDatabase()) { |
406 GetMetadataDatabase()->DisableApp(app_id, callback); | 402 GetMetadataDatabase()->DisableApp(app_id, callback); |
407 } else { | 403 } else { |
408 context_->GetUITaskRunner()->PostTask( | 404 context_->GetUITaskRunner()->PostTask( |
409 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); | 405 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); |
410 } | 406 } |
411 } | 407 } |
(...skipping 15 matching lines...) Expand all Loading... |
427 // already initialized when it runs. | 423 // already initialized when it runs. |
428 SyncEngineInitializer* initializer = | 424 SyncEngineInitializer* initializer = |
429 new SyncEngineInitializer(context_.get(), | 425 new SyncEngineInitializer(context_.get(), |
430 base_dir_.Append(kDatabaseName), | 426 base_dir_.Append(kDatabaseName), |
431 env_override_); | 427 env_override_); |
432 task_manager_->ScheduleSyncTask( | 428 task_manager_->ScheduleSyncTask( |
433 FROM_HERE, | 429 FROM_HERE, |
434 scoped_ptr<SyncTask>(initializer), | 430 scoped_ptr<SyncTask>(initializer), |
435 SyncTaskManager::PRIORITY_HIGH, | 431 SyncTaskManager::PRIORITY_HIGH, |
436 base::Bind(&SyncWorker::DidInitialize, | 432 base::Bind(&SyncWorker::DidInitialize, |
437 weak_ptr_factory_.GetWeakPtr(), | 433 AsWeakPtr(), |
438 initializer)); | 434 initializer)); |
439 } | 435 } |
440 | 436 |
441 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, | 437 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, |
442 SyncStatusCode status) { | 438 SyncStatusCode status) { |
443 if (status != SYNC_STATUS_OK) { | 439 if (status != SYNC_STATUS_OK) { |
444 if (GetDriveService()->HasRefreshToken()) { | 440 if (GetDriveService()->HasRefreshToken()) { |
445 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, | 441 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, |
446 "Could not initialize remote service"); | 442 "Could not initialize remote service"); |
447 } else { | 443 } else { |
(...skipping 14 matching lines...) Expand all Loading... |
462 void SyncWorker::UpdateRegisteredApp() { | 458 void SyncWorker::UpdateRegisteredApp() { |
463 MetadataDatabase* metadata_db = GetMetadataDatabase(); | 459 MetadataDatabase* metadata_db = GetMetadataDatabase(); |
464 DCHECK(metadata_db); | 460 DCHECK(metadata_db); |
465 | 461 |
466 scoped_ptr<std::vector<std::string> > app_ids(new std::vector<std::string>); | 462 scoped_ptr<std::vector<std::string> > app_ids(new std::vector<std::string>); |
467 metadata_db->GetRegisteredAppIDs(app_ids.get()); | 463 metadata_db->GetRegisteredAppIDs(app_ids.get()); |
468 | 464 |
469 AppStatusMap* app_status = new AppStatusMap; | 465 AppStatusMap* app_status = new AppStatusMap; |
470 base::Closure callback = | 466 base::Closure callback = |
471 base::Bind(&SyncWorker::DidQueryAppStatus, | 467 base::Bind(&SyncWorker::DidQueryAppStatus, |
472 weak_ptr_factory_.GetWeakPtr(), | 468 AsWeakPtr(), |
473 base::Owned(app_status)); | 469 base::Owned(app_status)); |
474 | 470 |
475 context_->GetUITaskRunner()->PostTask( | 471 context_->GetUITaskRunner()->PostTask( |
476 FROM_HERE, | 472 FROM_HERE, |
477 base::Bind(&QueryAppStatusOnUIThread, | 473 base::Bind(&QueryAppStatusOnUIThread, |
478 extension_service_, | 474 extension_service_, |
479 base::Owned(app_ids.release()), | 475 base::Owned(app_ids.release()), |
480 app_status, | 476 app_status, |
481 RelayCallbackToTaskRunner( | 477 RelayCallbackToTaskRunner( |
482 context_->GetWorkerTaskRunner(), | 478 context_->GetWorkerTaskRunner(), |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 base::Bind(&EmptyStatusCallback)); | 572 base::Bind(&EmptyStatusCallback)); |
577 } | 573 } |
578 | 574 |
579 if (syncer->needs_remote_change_listing() && | 575 if (syncer->needs_remote_change_listing() && |
580 !listing_remote_changes_) { | 576 !listing_remote_changes_) { |
581 task_manager_->ScheduleSyncTask( | 577 task_manager_->ScheduleSyncTask( |
582 FROM_HERE, | 578 FROM_HERE, |
583 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), | 579 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), |
584 SyncTaskManager::PRIORITY_HIGH, | 580 SyncTaskManager::PRIORITY_HIGH, |
585 base::Bind(&SyncWorker::DidFetchChanges, | 581 base::Bind(&SyncWorker::DidFetchChanges, |
586 weak_ptr_factory_.GetWeakPtr())); | 582 AsWeakPtr())); |
587 should_check_remote_change_ = false; | 583 should_check_remote_change_ = false; |
588 listing_remote_changes_ = true; | 584 listing_remote_changes_ = true; |
589 time_to_check_changes_ = | 585 time_to_check_changes_ = |
590 base::TimeTicks::Now() + | 586 base::TimeTicks::Now() + |
591 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 587 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
592 } | 588 } |
593 | 589 |
594 if (status == SYNC_STATUS_OK) | 590 if (status == SYNC_STATUS_OK) |
595 should_check_conflict_ = true; | 591 should_check_conflict_ = true; |
596 | 592 |
(...skipping 12 matching lines...) Expand all Loading... |
609 | 605 |
610 base::TimeTicks now = base::TimeTicks::Now(); | 606 base::TimeTicks now = base::TimeTicks::Now(); |
611 if (!should_check_remote_change_ && now < time_to_check_changes_) { | 607 if (!should_check_remote_change_ && now < time_to_check_changes_) { |
612 if (!GetMetadataDatabase()->HasDirtyTracker() && | 608 if (!GetMetadataDatabase()->HasDirtyTracker() && |
613 should_check_conflict_) { | 609 should_check_conflict_) { |
614 should_check_conflict_ = false; | 610 should_check_conflict_ = false; |
615 task_manager_->ScheduleSyncTaskIfIdle( | 611 task_manager_->ScheduleSyncTaskIfIdle( |
616 FROM_HERE, | 612 FROM_HERE, |
617 scoped_ptr<SyncTask>(new ConflictResolver(context_.get())), | 613 scoped_ptr<SyncTask>(new ConflictResolver(context_.get())), |
618 base::Bind(&SyncWorker::DidResolveConflict, | 614 base::Bind(&SyncWorker::DidResolveConflict, |
619 weak_ptr_factory_.GetWeakPtr())); | 615 AsWeakPtr())); |
620 } | 616 } |
621 return; | 617 return; |
622 } | 618 } |
623 | 619 |
624 if (task_manager_->ScheduleSyncTaskIfIdle( | 620 if (task_manager_->ScheduleSyncTaskIfIdle( |
625 FROM_HERE, | 621 FROM_HERE, |
626 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), | 622 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), |
627 base::Bind(&SyncWorker::DidFetchChanges, | 623 base::Bind(&SyncWorker::DidFetchChanges, |
628 weak_ptr_factory_.GetWeakPtr()))) { | 624 AsWeakPtr()))) { |
629 should_check_remote_change_ = false; | 625 should_check_remote_change_ = false; |
630 listing_remote_changes_ = true; | 626 listing_remote_changes_ = true; |
631 time_to_check_changes_ = | 627 time_to_check_changes_ = |
632 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 628 now + base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
633 } | 629 } |
634 } | 630 } |
635 | 631 |
636 void SyncWorker::DidResolveConflict(SyncStatusCode status) { | 632 void SyncWorker::DidResolveConflict(SyncStatusCode status) { |
637 if (status == SYNC_STATUS_OK) | 633 if (status == SYNC_STATUS_OK) |
638 should_check_conflict_ = true; | 634 should_check_conflict_ = true; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 "Service state changed: %d->%d: %s", | 701 "Service state changed: %d->%d: %s", |
706 old_state, GetCurrentState(), description.c_str()); | 702 old_state, GetCurrentState(), description.c_str()); |
707 | 703 |
708 FOR_EACH_OBSERVER( | 704 FOR_EACH_OBSERVER( |
709 Observer, observers_, | 705 Observer, observers_, |
710 UpdateServiceState(GetCurrentState(), description)); | 706 UpdateServiceState(GetCurrentState(), description)); |
711 } | 707 } |
712 | 708 |
713 } // namespace drive_backend | 709 } // namespace drive_backend |
714 } // namespace sync_file_system | 710 } // namespace sync_file_system |
OLD | NEW |