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" |
11 #include "base/threading/sequenced_worker_pool.h" | 11 #include "base/threading/sequenced_worker_pool.h" |
12 #include "base/values.h" | 12 #include "base/values.h" |
13 #include "chrome/browser/drive/drive_api_service.h" | 13 #include "chrome/browser/drive/drive_api_service.h" |
14 #include "chrome/browser/drive/drive_notification_manager.h" | 14 #include "chrome/browser/drive/drive_notification_manager.h" |
15 #include "chrome/browser/drive/drive_notification_manager_factory.h" | 15 #include "chrome/browser/drive/drive_notification_manager_factory.h" |
16 #include "chrome/browser/drive/drive_service_interface.h" | 16 #include "chrome/browser/drive/drive_service_interface.h" |
17 #include "chrome/browser/drive/drive_uploader.h" | 17 #include "chrome/browser/drive/drive_uploader.h" |
18 #include "chrome/browser/extensions/extension_service.h" | 18 #include "chrome/browser/extensions/extension_service.h" |
19 #include "chrome/browser/profiles/profile.h" | 19 #include "chrome/browser/profiles/profile.h" |
20 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 20 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
21 #include "chrome/browser/signin/signin_manager_factory.h" | 21 #include "chrome/browser/signin/signin_manager_factory.h" |
22 #include "chrome/browser/sync_file_system/drive_backend/callback_helper.h" | |
22 #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h" | 23 #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h" |
23 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants. h" | 24 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants. h" |
24 #include "chrome/browser/sync_file_system/drive_backend/list_changes_task.h" | 25 #include "chrome/browser/sync_file_system/drive_backend/list_changes_task.h" |
25 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h " | 26 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h " |
26 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 27 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
27 #include "chrome/browser/sync_file_system/drive_backend/register_app_task.h" | 28 #include "chrome/browser/sync_file_system/drive_backend/register_app_task.h" |
28 #include "chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.h " | 29 #include "chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.h " |
29 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" | 30 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" |
30 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer. h" | 31 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer. h" |
31 #include "chrome/browser/sync_file_system/drive_backend/sync_task.h" | 32 #include "chrome/browser/sync_file_system/drive_backend/sync_task.h" |
(...skipping 21 matching lines...) Expand all Loading... | |
53 | 54 |
54 namespace { | 55 namespace { |
55 | 56 |
56 void EmptyStatusCallback(SyncStatusCode status) {} | 57 void EmptyStatusCallback(SyncStatusCode status) {} |
57 | 58 |
58 } // namespace | 59 } // namespace |
59 | 60 |
60 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker( | 61 scoped_ptr<SyncWorker> SyncWorker::CreateOnWorker( |
61 const base::FilePath& base_dir, | 62 const base::FilePath& base_dir, |
62 Observer* observer, | 63 Observer* observer, |
63 ExtensionServiceInterface* extension_service, | 64 const base::WeakPtr<ExtensionServiceInterface>& extension_service, |
64 scoped_ptr<SyncEngineContext> sync_engine_context, | 65 scoped_ptr<SyncEngineContext> sync_engine_context, |
65 leveldb::Env* env_override) { | 66 leveldb::Env* env_override) { |
66 scoped_ptr<SyncWorker> sync_worker( | 67 scoped_ptr<SyncWorker> sync_worker( |
67 new SyncWorker(base_dir, | 68 new SyncWorker(base_dir, |
68 extension_service, | 69 extension_service, |
69 sync_engine_context.Pass(), | 70 sync_engine_context.Pass(), |
70 env_override)); | 71 env_override)); |
71 sync_worker->AddObserver(observer); | 72 sync_worker->AddObserver(observer); |
72 sync_worker->Initialize(); | 73 sync_worker->Initialize(); |
73 | 74 |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
348 SyncTaskManager* SyncWorker::GetSyncTaskManager() { | 349 SyncTaskManager* SyncWorker::GetSyncTaskManager() { |
349 return task_manager_.get(); | 350 return task_manager_.get(); |
350 } | 351 } |
351 | 352 |
352 void SyncWorker::AddObserver(Observer* observer) { | 353 void SyncWorker::AddObserver(Observer* observer) { |
353 observers_.AddObserver(observer); | 354 observers_.AddObserver(observer); |
354 } | 355 } |
355 | 356 |
356 SyncWorker::SyncWorker( | 357 SyncWorker::SyncWorker( |
357 const base::FilePath& base_dir, | 358 const base::FilePath& base_dir, |
358 ExtensionServiceInterface* extension_service, | 359 const base::WeakPtr<ExtensionServiceInterface>& extension_service, |
359 scoped_ptr<SyncEngineContext> sync_engine_context, | 360 scoped_ptr<SyncEngineContext> sync_engine_context, |
360 leveldb::Env* env_override) | 361 leveldb::Env* env_override) |
361 : base_dir_(base_dir), | 362 : base_dir_(base_dir), |
362 env_override_(env_override), | 363 env_override_(env_override), |
363 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), | 364 service_state_(REMOTE_SERVICE_TEMPORARY_UNAVAILABLE), |
364 should_check_conflict_(true), | 365 should_check_conflict_(true), |
365 should_check_remote_change_(true), | 366 should_check_remote_change_(true), |
366 listing_remote_changes_(false), | 367 listing_remote_changes_(false), |
367 sync_enabled_(false), | 368 sync_enabled_(false), |
368 default_conflict_resolution_policy_( | 369 default_conflict_resolution_policy_( |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
426 | 427 |
427 scoped_ptr<MetadataDatabase> metadata_database = | 428 scoped_ptr<MetadataDatabase> metadata_database = |
428 initializer->PassMetadataDatabase(); | 429 initializer->PassMetadataDatabase(); |
429 if (metadata_database) | 430 if (metadata_database) |
430 context_->SetMetadataDatabase(metadata_database.Pass()); | 431 context_->SetMetadataDatabase(metadata_database.Pass()); |
431 | 432 |
432 UpdateRegisteredApp(); | 433 UpdateRegisteredApp(); |
433 } | 434 } |
434 | 435 |
435 void SyncWorker::UpdateRegisteredApp() { | 436 void SyncWorker::UpdateRegisteredApp() { |
436 if (extension_service_) | 437 MetadataDatabase* metadata_db = GetMetadataDatabase(); |
438 DCHECK(metadata_db); | |
439 | |
peria
2014/04/24 02:38:21
Could you add checking |extension_service_|'s avai
tzik
2014/04/24 06:56:55
To do that, we need to hop to UI thread, which cos
| |
440 scoped_ptr<std::vector<std::string> > app_ids(new std::vector<std::string>); | |
441 metadata_db->GetRegisteredAppIDs(app_ids.get()); | |
442 | |
443 AppStatusMap* app_status = new AppStatusMap; | |
444 base::Closure callback = | |
445 base::Bind(&SyncWorker::DidQueryAppStatus, | |
446 weak_ptr_factory_.GetWeakPtr(), | |
447 base::Owned(app_status)); | |
448 | |
449 context_->GetUiTaskRunner()->PostTask( | |
450 FROM_HERE, | |
451 base::Bind(&SyncWorker::QueryAppStatusOnUIThread, | |
452 extension_service_, | |
453 base::Owned(app_ids.release()), | |
454 app_status, | |
455 CreateRelayedCallback(callback))); | |
456 | |
nhiroki
2014/04/24 01:39:52
nit: an extra blank line.
tzik
2014/04/24 06:56:55
Done.
| |
457 } | |
458 | |
459 // static | |
460 void SyncWorker::QueryAppStatusOnUIThread( | |
nhiroki
2014/04/24 01:39:52
(optional) How about moving this into anon namespa
tzik
2014/04/24 06:56:55
Done.
nhiroki
2014/04/24 07:09:07
Hmm... sorry, I missed QueryAppStatusOnUIThread()
| |
461 const base::WeakPtr<ExtensionServiceInterface>& extension_service_ptr, | |
462 const std::vector<std::string>* apps, | |
peria
2014/04/24 02:38:21
(optional) keep its name |app_ids| for consistency
tzik
2014/04/24 06:56:55
Done.
| |
463 AppStatusMap* status, | |
464 const base::Closure& callback) { | |
465 ExtensionServiceInterface* extension_service = extension_service_ptr.get(); | |
466 if (!extension_service) | |
nhiroki
2014/04/24 01:39:52
In this case you don't need to run a callback, rig
tzik
2014/04/24 06:56:55
Ah, I completely forgot about calling the callback
| |
437 return; | 467 return; |
438 | 468 |
439 MetadataDatabase* metadata_db = GetMetadataDatabase(); | 469 for (std::vector<std::string>::const_iterator itr = apps->begin(); |
440 DCHECK(metadata_db); | 470 itr != apps->end(); ++itr) { |
441 std::vector<std::string> app_ids; | |
442 metadata_db->GetRegisteredAppIDs(&app_ids); | |
443 | |
444 // Update the status of every origin using status from ExtensionService. | |
445 for (std::vector<std::string>::const_iterator itr = app_ids.begin(); | |
446 itr != app_ids.end(); ++itr) { | |
447 const std::string& app_id = *itr; | 471 const std::string& app_id = *itr; |
448 GURL origin = | 472 if (!extension_service->GetInstalledExtension(app_id)) |
449 extensions::Extension::GetBaseURLFromExtensionId(app_id); | 473 (*status)[app_id] = APP_STATUS_UNINSTALLED; |
450 | 474 else if (!extension_service->IsExtensionEnabled(app_id)) |
451 // TODO(tzik): Switch |extension_service_| to a wrapper and make this | 475 (*status)[app_id] = APP_STATUS_DISABLED; |
452 // call async. | 476 else |
453 if (!extension_service_->GetInstalledExtension(app_id)) { | 477 (*status)[app_id] = APP_STATUS_ENABLED; |
454 // Extension has been uninstalled. | |
455 // (At this stage we can't know if it was unpacked extension or not, | |
456 // so just purge the remote folder.) | |
457 UninstallOrigin(origin, | |
458 RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, | |
459 base::Bind(&EmptyStatusCallback)); | |
460 continue; | |
461 } | |
462 FileTracker tracker; | |
463 if (!metadata_db->FindAppRootTracker(app_id, &tracker)) { | |
464 // App will register itself on first run. | |
465 continue; | |
466 } | |
467 | |
468 // TODO(tzik): Switch |extension_service_| to a wrapper and make this | |
469 // call async. | |
470 bool is_app_enabled = extension_service_->IsExtensionEnabled(app_id); | |
471 bool is_app_root_tracker_enabled = | |
472 tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; | |
473 if (is_app_enabled && !is_app_root_tracker_enabled) | |
474 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | |
475 else if (!is_app_enabled && is_app_root_tracker_enabled) | |
476 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | |
477 } | 478 } |
nhiroki
2014/04/24 01:39:52
You need to run |callback| here.
tzik
2014/04/24 06:56:55
Done.
| |
478 } | 479 } |
479 | 480 |
481 void SyncWorker::DidQueryAppStatus(const AppStatusMap* app_status) { | |
482 MetadataDatabase* metadata_db = GetMetadataDatabase(); | |
483 DCHECK(metadata_db); | |
484 | |
485 // Update the status of every origin using status from ExtensionService. | |
486 for (AppStatusMap::const_iterator itr = app_status->begin(); | |
487 itr != app_status->end(); ++itr) { | |
488 const std::string& app_id = itr->first; | |
489 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id); | |
490 | |
491 if (itr->second == APP_STATUS_UNINSTALLED) { | |
492 // Extension has been uninstalled. | |
493 // (At this stage we can't know if it was unpacked extension or not, | |
494 // so just purge the remote folder.) | |
495 UninstallOrigin(origin, | |
496 RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, | |
497 base::Bind(&EmptyStatusCallback)); | |
498 continue; | |
499 } | |
500 | |
501 FileTracker tracker; | |
502 if (!metadata_db->FindAppRootTracker(app_id, &tracker)) { | |
503 // App will register itself on first run. | |
504 continue; | |
505 } | |
506 | |
507 DCHECK(itr->second == APP_STATUS_ENABLED || | |
508 itr->second == APP_STATUS_DISABLED); | |
509 bool is_app_enabled = itr->second == APP_STATUS_ENABLED; | |
peria
2014/04/24 02:38:21
nit: a = (b == c);
tzik
2014/04/24 06:56:55
Done.
| |
510 bool is_app_root_tracker_enabled = | |
511 tracker.tracker_kind() == TRACKER_KIND_APP_ROOT; | |
peria
2014/04/24 02:38:21
diito
tzik
2014/04/24 06:56:55
Done.
| |
512 if (is_app_enabled && !is_app_root_tracker_enabled) | |
513 EnableOrigin(origin, base::Bind(&EmptyStatusCallback)); | |
514 else if (!is_app_enabled && is_app_root_tracker_enabled) | |
515 DisableOrigin(origin, base::Bind(&EmptyStatusCallback)); | |
516 } | |
517 } | |
518 | |
480 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, | 519 void SyncWorker::DidProcessRemoteChange(RemoteToLocalSyncer* syncer, |
481 const SyncFileCallback& callback, | 520 const SyncFileCallback& callback, |
482 SyncStatusCode status) { | 521 SyncStatusCode status) { |
483 if (syncer->is_sync_root_deletion()) { | 522 if (syncer->is_sync_root_deletion()) { |
484 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); | 523 MetadataDatabase::ClearDatabase(context_->PassMetadataDatabase()); |
485 PostInitializeTask(); | 524 PostInitializeTask(); |
486 callback.Run(status, syncer->url()); | 525 callback.Run(status, syncer->url()); |
487 return; | 526 return; |
488 } | 527 } |
489 | 528 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
658 "Service state changed: %d->%d: %s", | 697 "Service state changed: %d->%d: %s", |
659 old_state, GetCurrentState(), description.c_str()); | 698 old_state, GetCurrentState(), description.c_str()); |
660 | 699 |
661 FOR_EACH_OBSERVER( | 700 FOR_EACH_OBSERVER( |
662 Observer, observers_, | 701 Observer, observers_, |
663 UpdateServiceState(GetCurrentState(), description)); | 702 UpdateServiceState(GetCurrentState(), description)); |
664 } | 703 } |
665 | 704 |
666 } // namespace drive_backend | 705 } // namespace drive_backend |
667 } // namespace sync_file_system | 706 } // namespace sync_file_system |
OLD | NEW |