| 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 |