| 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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 | 92 |
| 93 void SyncWorker::RegisterOrigin( | 93 void SyncWorker::RegisterOrigin( |
| 94 const GURL& origin, | 94 const GURL& origin, |
| 95 const SyncStatusCallback& callback) { | 95 const SyncStatusCallback& callback) { |
| 96 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken()) | 96 if (!GetMetadataDatabase() && GetDriveService()->HasRefreshToken()) |
| 97 PostInitializeTask(); | 97 PostInitializeTask(); |
| 98 | 98 |
| 99 scoped_ptr<RegisterAppTask> task( | 99 scoped_ptr<RegisterAppTask> task( |
| 100 new RegisterAppTask(context_.get(), origin.host())); | 100 new RegisterAppTask(context_.get(), origin.host())); |
| 101 if (task->CanFinishImmediately()) { | 101 if (task->CanFinishImmediately()) { |
| 102 context_->GetUiTaskRunner()->PostTask( | 102 callback.Run(SYNC_STATUS_OK); |
| 103 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); | |
| 104 return; | 103 return; |
| 105 } | 104 } |
| 106 | 105 |
| 107 // TODO(peria): Forward |callback| to UI thread. | |
| 108 task_manager_->ScheduleSyncTask( | 106 task_manager_->ScheduleSyncTask( |
| 109 FROM_HERE, | 107 FROM_HERE, |
| 110 task.PassAs<SyncTask>(), | 108 task.PassAs<SyncTask>(), |
| 111 SyncTaskManager::PRIORITY_HIGH, | 109 SyncTaskManager::PRIORITY_HIGH, |
| 112 callback); | 110 callback); |
| 113 } | 111 } |
| 114 | 112 |
| 115 void SyncWorker::EnableOrigin( | 113 void SyncWorker::EnableOrigin( |
| 116 const GURL& origin, | 114 const GURL& origin, |
| 117 const SyncStatusCallback& callback) { | 115 const SyncStatusCallback& callback) { |
| 118 // TODO(peria): Forward |callback| to UI thread. | |
| 119 task_manager_->ScheduleTask( | 116 task_manager_->ScheduleTask( |
| 120 FROM_HERE, | 117 FROM_HERE, |
| 121 base::Bind(&SyncWorker::DoEnableApp, | 118 base::Bind(&SyncWorker::DoEnableApp, |
| 122 weak_ptr_factory_.GetWeakPtr(), | 119 weak_ptr_factory_.GetWeakPtr(), |
| 123 origin.host()), | 120 origin.host()), |
| 124 SyncTaskManager::PRIORITY_HIGH, | 121 SyncTaskManager::PRIORITY_HIGH, |
| 125 callback); | 122 callback); |
| 126 } | 123 } |
| 127 | 124 |
| 128 void SyncWorker::DisableOrigin( | 125 void SyncWorker::DisableOrigin( |
| 129 const GURL& origin, | 126 const GURL& origin, |
| 130 const SyncStatusCallback& callback) { | 127 const SyncStatusCallback& callback) { |
| 131 // TODO(peria): Forward |callback| to UI thread. | |
| 132 task_manager_->ScheduleTask( | 128 task_manager_->ScheduleTask( |
| 133 FROM_HERE, | 129 FROM_HERE, |
| 134 base::Bind(&SyncWorker::DoDisableApp, | 130 base::Bind(&SyncWorker::DoDisableApp, |
| 135 weak_ptr_factory_.GetWeakPtr(), | 131 weak_ptr_factory_.GetWeakPtr(), |
| 136 origin.host()), | 132 origin.host()), |
| 137 SyncTaskManager::PRIORITY_HIGH, | 133 SyncTaskManager::PRIORITY_HIGH, |
| 138 callback); | 134 callback); |
| 139 } | 135 } |
| 140 | 136 |
| 141 void SyncWorker::UninstallOrigin( | 137 void SyncWorker::UninstallOrigin( |
| 142 const GURL& origin, | 138 const GURL& origin, |
| 143 RemoteFileSyncService::UninstallFlag flag, | 139 RemoteFileSyncService::UninstallFlag flag, |
| 144 const SyncStatusCallback& callback) { | 140 const SyncStatusCallback& callback) { |
| 145 // TODO(peria): Forward |callback| to UI thread. | |
| 146 task_manager_->ScheduleSyncTask( | 141 task_manager_->ScheduleSyncTask( |
| 147 FROM_HERE, | 142 FROM_HERE, |
| 148 scoped_ptr<SyncTask>( | 143 scoped_ptr<SyncTask>( |
| 149 new UninstallAppTask(context_.get(), origin.host(), flag)), | 144 new UninstallAppTask(context_.get(), origin.host(), flag)), |
| 150 SyncTaskManager::PRIORITY_HIGH, | 145 SyncTaskManager::PRIORITY_HIGH, |
| 151 callback); | 146 callback); |
| 152 } | 147 } |
| 153 | 148 |
| 154 void SyncWorker::ProcessRemoteChange( | 149 void SyncWorker::ProcessRemoteChange( |
| 155 const SyncFileCallback& callback) { | 150 const SyncFileCallback& callback) { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 | 204 |
| 210 void SyncWorker::SetSyncEnabled(bool enabled) { | 205 void SyncWorker::SetSyncEnabled(bool enabled) { |
| 211 if (sync_enabled_ == enabled) | 206 if (sync_enabled_ == enabled) |
| 212 return; | 207 return; |
| 213 | 208 |
| 214 RemoteServiceState old_state = GetCurrentState(); | 209 RemoteServiceState old_state = GetCurrentState(); |
| 215 sync_enabled_ = enabled; | 210 sync_enabled_ = enabled; |
| 216 if (old_state == GetCurrentState()) | 211 if (old_state == GetCurrentState()) |
| 217 return; | 212 return; |
| 218 | 213 |
| 219 context_->GetUiTaskRunner()->PostTask( | 214 // TODO(peria): PostTask() |
| 220 FROM_HERE, | 215 sync_engine_->UpdateSyncEnabled(enabled); |
| 221 base::Bind(&SyncEngine::UpdateSyncEnabled, sync_engine_, enabled)); | |
| 222 } | 216 } |
| 223 | 217 |
| 224 SyncStatusCode SyncWorker::SetDefaultConflictResolutionPolicy( | 218 SyncStatusCode SyncWorker::SetDefaultConflictResolutionPolicy( |
| 225 ConflictResolutionPolicy policy) { | 219 ConflictResolutionPolicy policy) { |
| 226 default_conflict_resolution_policy_ = policy; | 220 default_conflict_resolution_policy_ = policy; |
| 227 return SYNC_STATUS_OK; | 221 return SYNC_STATUS_OK; |
| 228 } | 222 } |
| 229 | 223 |
| 230 SyncStatusCode SyncWorker::SetConflictResolutionPolicy( | 224 SyncStatusCode SyncWorker::SetConflictResolutionPolicy( |
| 231 const GURL& origin, | 225 const GURL& origin, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 | 267 |
| 274 MaybeStartFetchChanges(); | 268 MaybeStartFetchChanges(); |
| 275 } | 269 } |
| 276 | 270 |
| 277 void SyncWorker::NotifyLastOperationStatus( | 271 void SyncWorker::NotifyLastOperationStatus( |
| 278 SyncStatusCode status, | 272 SyncStatusCode status, |
| 279 bool used_network) { | 273 bool used_network) { |
| 280 UpdateServiceStateFromSyncStatusCode(status, used_network); | 274 UpdateServiceStateFromSyncStatusCode(status, used_network); |
| 281 | 275 |
| 282 if (GetMetadataDatabase()) { | 276 if (GetMetadataDatabase()) { |
| 283 context_->GetUiTaskRunner()->PostTask( | 277 // TODO(peria): Post task |
| 284 FROM_HERE, | 278 sync_engine_->NotifyLastOperationStatus(); |
| 285 base::Bind(&SyncEngine::NotifyLastOperationStatus, sync_engine_)); | |
| 286 } | 279 } |
| 287 } | 280 } |
| 288 | 281 |
| 289 void SyncWorker::OnNotificationReceived() { | 282 void SyncWorker::OnNotificationReceived() { |
| 290 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE) | 283 if (service_state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE) |
| 291 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive."); | 284 UpdateServiceState(REMOTE_SERVICE_OK, "Got push notification for Drive."); |
| 292 | 285 |
| 293 should_check_remote_change_ = true; | 286 should_check_remote_change_ = true; |
| 294 MaybeScheduleNextTask(); | 287 MaybeScheduleNextTask(); |
| 295 } | 288 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 sync_enabled_(false), | 353 sync_enabled_(false), |
| 361 default_conflict_resolution_policy_( | 354 default_conflict_resolution_policy_( |
| 362 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), | 355 CONFLICT_RESOLUTION_POLICY_LAST_WRITE_WIN), |
| 363 network_available_(false), | 356 network_available_(false), |
| 364 context_(sync_engine_context.Pass()), | 357 context_(sync_engine_context.Pass()), |
| 365 sync_engine_(sync_engine), | 358 sync_engine_(sync_engine), |
| 366 weak_ptr_factory_(this) {} | 359 weak_ptr_factory_(this) {} |
| 367 | 360 |
| 368 void SyncWorker::DoDisableApp(const std::string& app_id, | 361 void SyncWorker::DoDisableApp(const std::string& app_id, |
| 369 const SyncStatusCallback& callback) { | 362 const SyncStatusCallback& callback) { |
| 370 if (GetMetadataDatabase()) { | 363 if (GetMetadataDatabase()) |
| 371 GetMetadataDatabase()->DisableApp(app_id, callback); | 364 GetMetadataDatabase()->DisableApp(app_id, callback); |
| 372 } else { | 365 else |
| 373 context_->GetUiTaskRunner()->PostTask( | 366 callback.Run(SYNC_STATUS_OK); |
| 374 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); | |
| 375 } | |
| 376 } | 367 } |
| 377 | 368 |
| 378 void SyncWorker::DoEnableApp(const std::string& app_id, | 369 void SyncWorker::DoEnableApp(const std::string& app_id, |
| 379 const SyncStatusCallback& callback) { | 370 const SyncStatusCallback& callback) { |
| 380 if (GetMetadataDatabase()) { | 371 if (GetMetadataDatabase()) |
| 381 GetMetadataDatabase()->EnableApp(app_id, callback); | 372 GetMetadataDatabase()->EnableApp(app_id, callback); |
| 382 } else { | 373 else |
| 383 context_->GetUiTaskRunner()->PostTask( | 374 callback.Run(SYNC_STATUS_OK); |
| 384 FROM_HERE, base::Bind(callback, SYNC_STATUS_OK)); | |
| 385 } | |
| 386 } | 375 } |
| 387 | 376 |
| 388 void SyncWorker::PostInitializeTask() { | 377 void SyncWorker::PostInitializeTask() { |
| 389 DCHECK(!GetMetadataDatabase()); | 378 DCHECK(!GetMetadataDatabase()); |
| 390 | 379 |
| 391 // This initializer task may not run if MetadataDatabase in context_ is | 380 // This initializer task may not run if MetadataDatabase in context_ is |
| 392 // already initialized when it runs. | 381 // already initialized when it runs. |
| 393 SyncEngineInitializer* initializer = | 382 SyncEngineInitializer* initializer = |
| 394 new SyncEngineInitializer(context_.get(), | 383 new SyncEngineInitializer(context_.get(), |
| 395 context_->GetFileTaskRunner(), | 384 context_->GetBlockingTaskRunner(), |
| 396 base_dir_.Append(kDatabaseName), | 385 base_dir_.Append(kDatabaseName), |
| 397 env_override_); | 386 env_override_); |
| 398 task_manager_->ScheduleSyncTask( | 387 task_manager_->ScheduleSyncTask( |
| 399 FROM_HERE, | 388 FROM_HERE, |
| 400 scoped_ptr<SyncTask>(initializer), | 389 scoped_ptr<SyncTask>(initializer), |
| 401 SyncTaskManager::PRIORITY_HIGH, | 390 SyncTaskManager::PRIORITY_HIGH, |
| 402 base::Bind(&SyncWorker::DidInitialize, | 391 base::Bind(&SyncWorker::DidInitialize, weak_ptr_factory_.GetWeakPtr(), |
| 403 weak_ptr_factory_.GetWeakPtr(), | |
| 404 initializer)); | 392 initializer)); |
| 405 } | 393 } |
| 406 | 394 |
| 407 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, | 395 void SyncWorker::DidInitialize(SyncEngineInitializer* initializer, |
| 408 SyncStatusCode status) { | 396 SyncStatusCode status) { |
| 409 if (status != SYNC_STATUS_OK) { | 397 if (status != SYNC_STATUS_OK) { |
| 410 if (GetDriveService()->HasRefreshToken()) { | 398 if (GetDriveService()->HasRefreshToken()) { |
| 411 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, | 399 UpdateServiceState(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, |
| 412 "Could not initialize remote service"); | 400 "Could not initialize remote service"); |
| 413 } else { | 401 } else { |
| 414 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, | 402 UpdateServiceState(REMOTE_SERVICE_AUTHENTICATION_REQUIRED, |
| 415 "Authentication required."); | 403 "Authentication required."); |
| 416 } | 404 } |
| 417 return; | 405 return; |
| 418 } | 406 } |
| 419 | 407 |
| 420 scoped_ptr<MetadataDatabase> metadata_database = | 408 scoped_ptr<MetadataDatabase> metadata_database = |
| 421 initializer->PassMetadataDatabase(); | 409 initializer->PassMetadataDatabase(); |
| 422 if (metadata_database) | 410 if (metadata_database) |
| 423 context_->SetMetadataDatabase(metadata_database.Pass()); | 411 context_->SetMetadataDatabase(metadata_database.Pass()); |
| 424 | 412 |
| 425 context_->GetUiTaskRunner()->PostTask( | 413 // TODO(peria): Post task |
| 426 FROM_HERE, | 414 sync_engine_->UpdateRegisteredApps(); |
| 427 base::Bind(&SyncEngine::UpdateRegisteredApps, sync_engine_)); | |
| 428 } | 415 } |
| 429 | 416 |
| 430 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, | 417 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, |
| 431 const SyncFileCallback& callback, | 418 const SyncFileCallback& callback, |
| 432 SyncStatusCode status) { | 419 SyncStatusCode status) { |
| 433 if (syncer->is_sync_root_deletion()) { | 420 if (syncer->is_sync_root_deletion()) { |
| 434 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); | 421 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); |
| 435 PostInitializeTask(); | 422 PostInitializeTask(); |
| 436 context_->GetUiTaskRunner()->PostTask( | 423 callback.Run(status, syncer->url()); |
| 437 FROM_HERE, base::Bind(callback, status, syncer->url())); | |
| 438 return; | 424 return; |
| 439 } | 425 } |
| 440 | 426 |
| 441 if (status == SYNC_STATUS_OK) { | 427 if (status == SYNC_STATUS_OK) { |
| 442 context_->GetUiTaskRunner()->PostTask( | 428 // TODO(peria): Post task |
| 443 FROM_HERE, | 429 sync_engine_->DidProcessRemoteChange(syncer); |
| 444 base::Bind(&SyncEngine::DidProcessRemoteChange, sync_engine_, syncer)); | |
| 445 | 430 |
| 446 if (syncer->sync_action() == SYNC_ACTION_DELETED && | 431 if (syncer->sync_action() == SYNC_ACTION_DELETED && |
| 447 syncer->url().is_valid() && | 432 syncer->url().is_valid() && |
| 448 fileapi::VirtualPath::IsRootPath(syncer->url().path())) { | 433 fileapi::VirtualPath::IsRootPath(syncer->url().path())) { |
| 449 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback)); | 434 RegisterOrigin(syncer->url().origin(), base::Bind(&EmptyStatusCallback)); |
| 450 } | 435 } |
| 451 should_check_conflict_ = true; | 436 should_check_conflict_ = true; |
| 452 } | 437 } |
| 453 | 438 callback.Run(status, syncer->url()); |
| 454 context_->GetUiTaskRunner()->PostTask( | |
| 455 FROM_HERE, | |
| 456 base::Bind(callback, status, syncer->url())); | |
| 457 } | 439 } |
| 458 | 440 |
| 459 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer, | 441 void SyncWorker::DidApplyLocalChange(LocalToRemoteSyncer* syncer, |
| 460 const SyncStatusCallback& callback, | 442 const SyncStatusCallback& callback, |
| 461 SyncStatusCode status) { | 443 SyncStatusCode status) { |
| 462 // TODO(peria): PostTask (Simple replace fails DriveBackendSync* tests) | 444 // TODO(peria): Post task |
| 463 sync_engine_->DidApplyLocalChange(syncer, status); | 445 sync_engine_->DidApplyLocalChange(syncer, status); |
| 464 | 446 |
| 465 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) { | 447 if (status == SYNC_STATUS_UNKNOWN_ORIGIN && syncer->url().is_valid()) { |
| 466 RegisterOrigin(syncer->url().origin(), | 448 RegisterOrigin(syncer->url().origin(), |
| 467 base::Bind(&EmptyStatusCallback)); | 449 base::Bind(&EmptyStatusCallback)); |
| 468 } | 450 } |
| 469 | 451 |
| 470 if (syncer->needs_remote_change_listing() && | 452 if (syncer->needs_remote_change_listing() && |
| 471 !listing_remote_changes_) { | 453 !listing_remote_changes_) { |
| 472 task_manager_->ScheduleSyncTask( | 454 task_manager_->ScheduleSyncTask( |
| 473 FROM_HERE, | 455 FROM_HERE, |
| 474 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), | 456 scoped_ptr<SyncTask>(new ListChangesTask(context_.get())), |
| 475 SyncTaskManager::PRIORITY_HIGH, | 457 SyncTaskManager::PRIORITY_HIGH, |
| 476 base::Bind(&SyncWorker::DidFetchChanges, | 458 base::Bind(&SyncWorker::DidFetchChanges, |
| 477 weak_ptr_factory_.GetWeakPtr())); | 459 weak_ptr_factory_.GetWeakPtr())); |
| 478 should_check_remote_change_ = false; | 460 should_check_remote_change_ = false; |
| 479 listing_remote_changes_ = true; | 461 listing_remote_changes_ = true; |
| 480 time_to_check_changes_ = | 462 time_to_check_changes_ = |
| 481 base::TimeTicks::Now() + | 463 base::TimeTicks::Now() + |
| 482 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); | 464 base::TimeDelta::FromSeconds(kListChangesRetryDelaySeconds); |
| 483 } | 465 } |
| 484 | 466 |
| 467 if (status != SYNC_STATUS_OK && |
| 468 status != SYNC_STATUS_NO_CHANGE_TO_SYNC) { |
| 469 callback.Run(status); |
| 470 return; |
| 471 } |
| 472 |
| 485 if (status == SYNC_STATUS_OK) | 473 if (status == SYNC_STATUS_OK) |
| 486 should_check_conflict_ = true; | 474 should_check_conflict_ = true; |
| 487 | 475 |
| 488 context_->GetUiTaskRunner()->PostTask( | 476 callback.Run(status); |
| 489 FROM_HERE, base::Bind(callback, status)); | |
| 490 } | 477 } |
| 491 | 478 |
| 492 void SyncWorker::MaybeStartFetchChanges() { | 479 void SyncWorker::MaybeStartFetchChanges() { |
| 493 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) | 480 if (GetCurrentState() == REMOTE_SERVICE_DISABLED) |
| 494 return; | 481 return; |
| 495 | 482 |
| 496 if (!GetMetadataDatabase()) | 483 if (!GetMetadataDatabase()) |
| 497 return; | 484 return; |
| 498 | 485 |
| 499 if (listing_remote_changes_) | 486 if (listing_remote_changes_) |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 589 const std::string& description) { | 576 const std::string& description) { |
| 590 RemoteServiceState old_state = GetCurrentState(); | 577 RemoteServiceState old_state = GetCurrentState(); |
| 591 service_state_ = state; | 578 service_state_ = state; |
| 592 | 579 |
| 593 if (old_state == GetCurrentState()) | 580 if (old_state == GetCurrentState()) |
| 594 return; | 581 return; |
| 595 | 582 |
| 596 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 583 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 597 "Service state changed: %d->%d: %s", | 584 "Service state changed: %d->%d: %s", |
| 598 old_state, GetCurrentState(), description.c_str()); | 585 old_state, GetCurrentState(), description.c_str()); |
| 599 | 586 // TODO(peria): Post task |
| 600 context_->GetUiTaskRunner()->PostTask( | 587 sync_engine_->UpdateServiceState(description); |
| 601 FROM_HERE, | |
| 602 base::Bind(&SyncEngine::UpdateServiceState, sync_engine_, description)); | |
| 603 } | 588 } |
| 604 | 589 |
| 605 } // namespace drive_backend | 590 } // namespace drive_backend |
| 606 } // namespace sync_file_system | 591 } // namespace sync_file_system |
| OLD | NEW |