Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: chrome/browser/sync/glue/sync_backend_host.cc

Issue 7190001: [Sync] Split DirectoryChangeListener for thread-safety (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix copyright Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "build/build_config.h" 5 #include "build/build_config.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 SyncBackendHost::SyncBackendHost(Profile* profile) 61 SyncBackendHost::SyncBackendHost(Profile* profile)
62 : core_(new Core(profile->GetDebugName(), 62 : core_(new Core(profile->GetDebugName(),
63 ALLOW_THIS_IN_INITIALIZER_LIST(this))), 63 ALLOW_THIS_IN_INITIALIZER_LIST(this))),
64 sync_thread_("Chrome_SyncThread"), 64 sync_thread_("Chrome_SyncThread"),
65 frontend_loop_(MessageLoop::current()), 65 frontend_loop_(MessageLoop::current()),
66 profile_(profile), 66 profile_(profile),
67 frontend_(NULL), 67 frontend_(NULL),
68 sync_data_folder_path_( 68 sync_data_folder_path_(
69 profile_->GetPath().Append(kSyncDataFolderName)), 69 profile_->GetPath().Append(kSyncDataFolderName)),
70 last_auth_error_(AuthError::None()), 70 last_auth_error_(AuthError::None()),
71 syncapi_initialized_(false) { 71 sync_manager_initialized_(false) {
72 } 72 }
73 73
74 SyncBackendHost::SyncBackendHost() 74 SyncBackendHost::SyncBackendHost()
75 : sync_thread_("Chrome_SyncThread"), 75 : sync_thread_("Chrome_SyncThread"),
76 frontend_loop_(MessageLoop::current()), 76 frontend_loop_(MessageLoop::current()),
77 profile_(NULL), 77 profile_(NULL),
78 frontend_(NULL), 78 frontend_(NULL),
79 last_auth_error_(AuthError::None()), 79 last_auth_error_(AuthError::None()),
80 syncapi_initialized_(false) { 80 sync_manager_initialized_(false) {
81 } 81 }
82 82
83 SyncBackendHost::~SyncBackendHost() { 83 SyncBackendHost::~SyncBackendHost() {
84 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor."; 84 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor.";
85 DCHECK(registrar_.workers.empty()); 85 DCHECK(registrar_.workers.empty());
86 } 86 }
87 87
88 void SyncBackendHost::Initialize( 88 void SyncBackendHost::Initialize(
89 SyncFrontend* frontend, 89 SyncFrontend* frontend,
90 const GURL& sync_service_url, 90 const GURL& sync_service_url,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 return token; 159 return token;
160 } 160 }
161 161
162 bool SyncBackendHost::IsNigoriEnabled() const { 162 bool SyncBackendHost::IsNigoriEnabled() const {
163 base::AutoLock lock(registrar_lock_); 163 base::AutoLock lock(registrar_lock_);
164 return registrar_.routing_info.find(syncable::NIGORI) != 164 return registrar_.routing_info.find(syncable::NIGORI) !=
165 registrar_.routing_info.end(); 165 registrar_.routing_info.end();
166 } 166 }
167 167
168 bool SyncBackendHost::IsUsingExplicitPassphrase() { 168 bool SyncBackendHost::IsUsingExplicitPassphrase() {
169 return IsNigoriEnabled() && syncapi_initialized_ && 169 return IsNigoriEnabled() && sync_manager_initialized_ &&
170 core_->syncapi()->InitialSyncEndedForAllEnabledTypes() && 170 core_->sync_manager()->InitialSyncEndedForAllEnabledTypes() &&
171 core_->syncapi()->IsUsingExplicitPassphrase(); 171 core_->sync_manager()->IsUsingExplicitPassphrase();
172 } 172 }
173 173
174 bool SyncBackendHost::IsCryptographerReady( 174 bool SyncBackendHost::IsCryptographerReady(
175 const sync_api::BaseTransaction* trans) const { 175 const sync_api::BaseTransaction* trans) const {
176 return syncapi_initialized_ && trans->GetCryptographer()->is_ready(); 176 return sync_manager_initialized_ && trans->GetCryptographer()->is_ready();
177 } 177 }
178 178
179 JsBackend* SyncBackendHost::GetJsBackend() { 179 JsBackend* SyncBackendHost::GetJsBackend() {
180 if (syncapi_initialized_) { 180 if (sync_manager_initialized_) {
181 return core_.get(); 181 return core_.get();
182 } else { 182 } else {
183 NOTREACHED(); 183 NOTREACHED();
184 return NULL; 184 return NULL;
185 } 185 }
186 } 186 }
187 187
188 sync_api::HttpPostProviderFactory* SyncBackendHost::MakeHttpBridgeFactory( 188 sync_api::HttpPostProviderFactory* SyncBackendHost::MakeHttpBridgeFactory(
189 net::URLRequestContextGetter* getter) { 189 net::URLRequestContextGetter* getter) {
190 return new HttpBridgeFactory(getter); 190 return new HttpBridgeFactory(getter);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoSetPassphrase, 230 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoSetPassphrase,
231 passphrase, is_explicit)); 231 passphrase, is_explicit));
232 } 232 }
233 233
234 void SyncBackendHost::Shutdown(bool sync_disabled) { 234 void SyncBackendHost::Shutdown(bool sync_disabled) {
235 // Thread shutdown should occur in the following order: 235 // Thread shutdown should occur in the following order:
236 // - Sync Thread 236 // - Sync Thread
237 // - UI Thread (stops some time after we return from this call). 237 // - UI Thread (stops some time after we return from this call).
238 if (sync_thread_.IsRunning()) { // Not running in tests. 238 if (sync_thread_.IsRunning()) { // Not running in tests.
239 // TODO(akalin): Remove the need for this. 239 // TODO(akalin): Remove the need for this.
240 core_->syncapi()->RequestEarlyExit(); 240 if (sync_manager_initialized_) {
241 core_->sync_manager()->RequestEarlyExit();
242 }
241 sync_thread_.message_loop()->PostTask(FROM_HERE, 243 sync_thread_.message_loop()->PostTask(FROM_HERE,
242 NewRunnableMethod(core_.get(), 244 NewRunnableMethod(core_.get(),
243 &SyncBackendHost::Core::DoShutdown, 245 &SyncBackendHost::Core::DoShutdown,
244 sync_disabled)); 246 sync_disabled));
245 } 247 }
246 248
247 // Before joining the sync_thread_, we wait for the UIModelWorker to 249 // Before joining the sync_thread_, we wait for the UIModelWorker to
248 // give us the green light that it is not depending on the frontend_loop_ to 250 // give us the green light that it is not depending on the frontend_loop_ to
249 // process any more tasks. Stop() blocks until this termination condition 251 // process any more tasks. Stop() blocks until this termination condition
250 // is true. 252 // is true.
(...skipping 26 matching lines...) Expand all
277 registrar_.workers.erase(GROUP_HISTORY); 279 registrar_.workers.erase(GROUP_HISTORY);
278 registrar_.workers.erase(GROUP_UI); 280 registrar_.workers.erase(GROUP_UI);
279 registrar_.workers.erase(GROUP_PASSIVE); 281 registrar_.workers.erase(GROUP_PASSIVE);
280 registrar_.workers.erase(GROUP_PASSWORD); 282 registrar_.workers.erase(GROUP_PASSWORD);
281 frontend_ = NULL; 283 frontend_ = NULL;
282 core_ = NULL; // Releases reference to core_. 284 core_ = NULL; // Releases reference to core_.
283 } 285 }
284 286
285 syncable::AutofillMigrationState 287 syncable::AutofillMigrationState
286 SyncBackendHost::GetAutofillMigrationState() { 288 SyncBackendHost::GetAutofillMigrationState() {
287 return core_->syncapi()->GetAutofillMigrationState(); 289 DCHECK(sync_manager_initialized_);
290 return core_->sync_manager()->GetAutofillMigrationState();
288 } 291 }
289 292
290 void SyncBackendHost::SetAutofillMigrationState( 293 void SyncBackendHost::SetAutofillMigrationState(
291 syncable::AutofillMigrationState state) { 294 syncable::AutofillMigrationState state) {
292 return core_->syncapi()->SetAutofillMigrationState(state); 295 DCHECK(sync_manager_initialized_);
296 return core_->sync_manager()->SetAutofillMigrationState(state);
293 } 297 }
294 298
295 syncable::AutofillMigrationDebugInfo 299 syncable::AutofillMigrationDebugInfo
296 SyncBackendHost::GetAutofillMigrationDebugInfo() { 300 SyncBackendHost::GetAutofillMigrationDebugInfo() {
297 return core_->syncapi()->GetAutofillMigrationDebugInfo(); 301 DCHECK(sync_manager_initialized_);
302 return core_->sync_manager()->GetAutofillMigrationDebugInfo();
298 } 303 }
299 304
300 void SyncBackendHost::SetAutofillMigrationDebugInfo( 305 void SyncBackendHost::SetAutofillMigrationDebugInfo(
301 syncable::AutofillMigrationDebugInfo::PropertyToSet property_to_set, 306 syncable::AutofillMigrationDebugInfo::PropertyToSet property_to_set,
302 const syncable::AutofillMigrationDebugInfo& info) { 307 const syncable::AutofillMigrationDebugInfo& info) {
303 return core_->syncapi()->SetAutofillMigrationDebugInfo(property_to_set, info); 308 DCHECK(sync_manager_initialized_);
309 return core_->sync_manager()->SetAutofillMigrationDebugInfo(
310 property_to_set, info);
304 } 311 }
305 312
306 void SyncBackendHost::ConfigureAutofillMigration() { 313 void SyncBackendHost::ConfigureAutofillMigration() {
307 if (GetAutofillMigrationState() == syncable::NOT_DETERMINED) { 314 if (GetAutofillMigrationState() == syncable::NOT_DETERMINED) {
308 sync_api::ReadTransaction trans(GetUserShare()); 315 sync_api::ReadTransaction trans(GetUserShare());
309 sync_api::ReadNode autofil_root_node(&trans); 316 sync_api::ReadNode autofil_root_node(&trans);
310 317
311 // Check for the presence of autofill node. 318 // Check for the presence of autofill node.
312 if (!autofil_root_node.InitByTagLookup(browser_sync::kAutofillTag)) { 319 if (!autofil_root_node.InitByTagLookup(browser_sync::kAutofillTag)) {
313 SetAutofillMigrationState(syncable::INSUFFICIENT_INFO_TO_DETERMINE); 320 SetAutofillMigrationState(syncable::INSUFFICIENT_INFO_TO_DETERMINE);
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 401
395 void SyncBackendHost::ConfigureDataTypes( 402 void SyncBackendHost::ConfigureDataTypes(
396 const DataTypeController::TypeMap& data_type_controllers, 403 const DataTypeController::TypeMap& data_type_controllers,
397 const syncable::ModelTypeSet& types, 404 const syncable::ModelTypeSet& types,
398 sync_api::ConfigureReason reason, 405 sync_api::ConfigureReason reason,
399 CancelableTask* ready_task, 406 CancelableTask* ready_task,
400 bool enable_nigori) { 407 bool enable_nigori) {
401 // Only one configure is allowed at a time. 408 // Only one configure is allowed at a time.
402 DCHECK(!pending_config_mode_state_.get()); 409 DCHECK(!pending_config_mode_state_.get());
403 DCHECK(!pending_download_state_.get()); 410 DCHECK(!pending_download_state_.get());
404 DCHECK(syncapi_initialized_); 411 DCHECK(sync_manager_initialized_);
405 412
406 if (types.count(syncable::AUTOFILL_PROFILE) != 0) { 413 if (types.count(syncable::AUTOFILL_PROFILE) != 0) {
407 ConfigureAutofillMigration(); 414 ConfigureAutofillMigration();
408 } 415 }
409 416
410 syncable::ModelTypeSet types_copy = types; 417 syncable::ModelTypeSet types_copy = types;
411 if (enable_nigori) { 418 if (enable_nigori) {
412 types_copy.insert(syncable::NIGORI); 419 types_copy.insert(syncable::NIGORI);
413 } 420 }
414 bool nigori_currently_enabled = IsNigoriEnabled(); 421 bool nigori_currently_enabled = IsNigoriEnabled();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 454
448 VLOG(1) << "Syncer in config mode. SBH executing" 455 VLOG(1) << "Syncer in config mode. SBH executing"
449 << "FinishConfigureDataTypesOnFrontendLoop"; 456 << "FinishConfigureDataTypesOnFrontendLoop";
450 if (pending_config_mode_state_->deleted_type) { 457 if (pending_config_mode_state_->deleted_type) {
451 sync_thread_.message_loop()->PostTask(FROM_HERE, 458 sync_thread_.message_loop()->PostTask(FROM_HERE,
452 NewRunnableMethod(core_.get(), 459 NewRunnableMethod(core_.get(),
453 &SyncBackendHost::Core::DeferNudgeForCleanup)); 460 &SyncBackendHost::Core::DeferNudgeForCleanup));
454 } 461 }
455 462
456 if (pending_config_mode_state_->added_types.none() && 463 if (pending_config_mode_state_->added_types.none() &&
457 !core_->syncapi()->InitialSyncEndedForAllEnabledTypes()) { 464 !core_->sync_manager()->InitialSyncEndedForAllEnabledTypes()) {
458 LOG(WARNING) << "No new types, but initial sync not finished." 465 LOG(WARNING) << "No new types, but initial sync not finished."
459 << "Possible sync db corruption / removal."; 466 << "Possible sync db corruption / removal.";
460 // TODO(tim): Log / UMA / count this somehow? 467 // TODO(tim): Log / UMA / count this somehow?
461 // TODO(tim): If no added types, we could (should?) config only for 468 // TODO(tim): If no added types, we could (should?) config only for
462 // types that are needed... but this is a rare corruption edge case or 469 // types that are needed... but this is a rare corruption edge case or
463 // implies the user mucked around with their syncdb, so for now do all. 470 // implies the user mucked around with their syncdb, so for now do all.
464 pending_config_mode_state_->added_types = 471 pending_config_mode_state_->added_types =
465 syncable::ModelTypeBitSetFromSet( 472 syncable::ModelTypeBitSetFromSet(
466 pending_config_mode_state_->initial_types); 473 pending_config_mode_state_->initial_types);
467 } 474 }
(...skipping 30 matching lines...) Expand all
498 505
499 void SyncBackendHost::EncryptDataTypes( 506 void SyncBackendHost::EncryptDataTypes(
500 const syncable::ModelTypeSet& encrypted_types) { 507 const syncable::ModelTypeSet& encrypted_types) {
501 sync_thread_.message_loop()->PostTask(FROM_HERE, 508 sync_thread_.message_loop()->PostTask(FROM_HERE,
502 NewRunnableMethod(core_.get(), 509 NewRunnableMethod(core_.get(),
503 &SyncBackendHost::Core::DoEncryptDataTypes, 510 &SyncBackendHost::Core::DoEncryptDataTypes,
504 encrypted_types)); 511 encrypted_types));
505 } 512 }
506 513
507 syncable::ModelTypeSet SyncBackendHost::GetEncryptedDataTypes() const { 514 syncable::ModelTypeSet SyncBackendHost::GetEncryptedDataTypes() const {
508 DCHECK(syncapi_initialized_); 515 DCHECK(sync_manager_initialized_);
509 return core_->syncapi()->GetEncryptedDataTypes(); 516 return core_->sync_manager()->GetEncryptedDataTypes();
510 } 517 }
511 518
512 void SyncBackendHost::RequestNudge(const tracked_objects::Location& location) { 519 void SyncBackendHost::RequestNudge(const tracked_objects::Location& location) {
513 sync_thread_.message_loop()->PostTask(FROM_HERE, 520 sync_thread_.message_loop()->PostTask(FROM_HERE,
514 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoRequestNudge, 521 NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoRequestNudge,
515 location)); 522 location));
516 } 523 }
517 524
518 void SyncBackendHost::ActivateDataType( 525 void SyncBackendHost::ActivateDataType(
519 DataTypeController* data_type_controller, 526 DataTypeController* data_type_controller,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 } 559 }
553 560
554 bool SyncBackendHost::RequestClearServerData() { 561 bool SyncBackendHost::RequestClearServerData() {
555 sync_thread_.message_loop()->PostTask(FROM_HERE, 562 sync_thread_.message_loop()->PostTask(FROM_HERE,
556 NewRunnableMethod(core_.get(), 563 NewRunnableMethod(core_.get(),
557 &SyncBackendHost::Core::DoRequestClearServerData)); 564 &SyncBackendHost::Core::DoRequestClearServerData));
558 return true; 565 return true;
559 } 566 }
560 567
561 SyncBackendHost::Core::~Core() { 568 SyncBackendHost::Core::~Core() {
569 DCHECK(!sync_manager_.get());
562 } 570 }
563 571
564 void SyncBackendHost::Core::NotifyPassphraseRequired( 572 void SyncBackendHost::Core::NotifyPassphraseRequired(
565 sync_api::PassphraseRequiredReason reason) { 573 sync_api::PassphraseRequiredReason reason) {
566 if (!host_ || !host_->frontend_) 574 if (!host_ || !host_->frontend_)
567 return; 575 return;
568 576
569 DCHECK_EQ(MessageLoop::current(), host_->frontend_loop_); 577 DCHECK_EQ(MessageLoop::current(), host_->frontend_loop_);
570 578
571 // When setting a passphrase fails, unset our waiting flag. 579 // When setting a passphrase fails, unset our waiting flag.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 http_bridge_factory(http_bridge_factory), 650 http_bridge_factory(http_bridge_factory),
643 credentials(credentials), 651 credentials(credentials),
644 delete_sync_data_folder(delete_sync_data_folder), 652 delete_sync_data_folder(delete_sync_data_folder),
645 restored_key_for_bootstrapping(restored_key_for_bootstrapping), 653 restored_key_for_bootstrapping(restored_key_for_bootstrapping),
646 setup_for_test_mode(setup_for_test_mode) { 654 setup_for_test_mode(setup_for_test_mode) {
647 } 655 }
648 656
649 SyncBackendHost::Core::DoInitializeOptions::~DoInitializeOptions() {} 657 SyncBackendHost::Core::DoInitializeOptions::~DoInitializeOptions() {}
650 658
651 sync_api::UserShare* SyncBackendHost::GetUserShare() const { 659 sync_api::UserShare* SyncBackendHost::GetUserShare() const {
652 DCHECK(syncapi_initialized_); 660 DCHECK(sync_manager_initialized_);
653 return core_->syncapi()->GetUserShare(); 661 return core_->sync_manager()->GetUserShare();
654 } 662 }
655 663
656 SyncBackendHost::Status SyncBackendHost::GetDetailedStatus() { 664 SyncBackendHost::Status SyncBackendHost::GetDetailedStatus() {
657 DCHECK(syncapi_initialized_); 665 DCHECK(sync_manager_initialized_);
658 return core_->syncapi()->GetDetailedStatus(); 666 return core_->sync_manager()->GetDetailedStatus();
659 } 667 }
660 668
661 SyncBackendHost::StatusSummary SyncBackendHost::GetStatusSummary() { 669 SyncBackendHost::StatusSummary SyncBackendHost::GetStatusSummary() {
662 DCHECK(syncapi_initialized_); 670 DCHECK(sync_manager_initialized_);
663 return core_->syncapi()->GetStatusSummary(); 671 return core_->sync_manager()->GetStatusSummary();
664 } 672 }
665 673
666 string16 SyncBackendHost::GetAuthenticatedUsername() const { 674 string16 SyncBackendHost::GetAuthenticatedUsername() const {
667 DCHECK(syncapi_initialized_); 675 DCHECK(sync_manager_initialized_);
668 return UTF8ToUTF16(core_->syncapi()->GetAuthenticatedUsername()); 676 return UTF8ToUTF16(core_->sync_manager()->GetAuthenticatedUsername());
669 } 677 }
670 678
671 const GoogleServiceAuthError& SyncBackendHost::GetAuthError() const { 679 const GoogleServiceAuthError& SyncBackendHost::GetAuthError() const {
672 return last_auth_error_; 680 return last_auth_error_;
673 } 681 }
674 682
675 const SyncSessionSnapshot* SyncBackendHost::GetLastSessionSnapshot() const { 683 const SyncSessionSnapshot* SyncBackendHost::GetLastSessionSnapshot() const {
676 return last_snapshot_.get(); 684 return last_snapshot_.get();
677 } 685 }
678 686
679 void SyncBackendHost::GetWorkers(std::vector<ModelSafeWorker*>* out) { 687 void SyncBackendHost::GetWorkers(std::vector<ModelSafeWorker*>* out) {
680 base::AutoLock lock(registrar_lock_); 688 base::AutoLock lock(registrar_lock_);
681 out->clear(); 689 out->clear();
682 for (WorkerMap::const_iterator it = registrar_.workers.begin(); 690 for (WorkerMap::const_iterator it = registrar_.workers.begin();
683 it != registrar_.workers.end(); ++it) { 691 it != registrar_.workers.end(); ++it) {
684 out->push_back((*it).second); 692 out->push_back((*it).second);
685 } 693 }
686 } 694 }
687 695
688 void SyncBackendHost::GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) { 696 void SyncBackendHost::GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) {
689 base::AutoLock lock(registrar_lock_); 697 base::AutoLock lock(registrar_lock_);
690 ModelSafeRoutingInfo copy(registrar_.routing_info); 698 ModelSafeRoutingInfo copy(registrar_.routing_info);
691 out->swap(copy); 699 out->swap(copy);
692 } 700 }
693 701
694 bool SyncBackendHost::HasUnsyncedItems() const { 702 bool SyncBackendHost::HasUnsyncedItems() const {
695 DCHECK(syncapi_initialized_); 703 DCHECK(sync_manager_initialized_);
696 return core_->syncapi()->HasUnsyncedItems(); 704 return core_->sync_manager()->HasUnsyncedItems();
697 } 705 }
698 706
699 void SyncBackendHost::LogUnsyncedItems(int level) const { 707 void SyncBackendHost::LogUnsyncedItems(int level) const {
700 DCHECK(syncapi_initialized_); 708 DCHECK(sync_manager_initialized_);
701 return core_->syncapi()->LogUnsyncedItems(level); 709 return core_->sync_manager()->LogUnsyncedItems(level);
702 } 710 }
703 711
704 SyncBackendHost::Core::Core(const std::string& name, SyncBackendHost* backend) 712 SyncBackendHost::Core::Core(const std::string& name, SyncBackendHost* backend)
705 : host_(backend), 713 : name_(name),
706 syncapi_(new sync_api::SyncManager(name)), 714 host_(backend),
707 sync_manager_observer_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 715 sync_manager_observer_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
708 parent_router_(NULL), 716 parent_router_(NULL),
709 processing_passphrase_(false), 717 processing_passphrase_(false),
710 deferred_nudge_for_cleanup_requested_(false) { 718 deferred_nudge_for_cleanup_requested_(false) {
711 } 719 }
712 720
713 // Helper to construct a user agent string (ASCII) suitable for use by 721 // Helper to construct a user agent string (ASCII) suitable for use by
714 // the syncapi for any HTTP communication. This string is used by the sync 722 // the syncapi for any HTTP communication. This string is used by the sync
715 // backend for classifying client types when calculating statistics. 723 // backend for classifying client types when calculating statistics.
716 std::string MakeUserAgentForSyncapi() { 724 std::string MakeUserAgentForSyncApi() {
717 std::string user_agent; 725 std::string user_agent;
718 user_agent = "Chrome "; 726 user_agent = "Chrome ";
719 #if defined(OS_WIN) 727 #if defined(OS_WIN)
720 user_agent += "WIN "; 728 user_agent += "WIN ";
721 #elif defined(OS_LINUX) 729 #elif defined(OS_LINUX)
722 user_agent += "LINUX "; 730 user_agent += "LINUX ";
723 #elif defined(OS_FREEBSD) 731 #elif defined(OS_FREEBSD)
724 user_agent += "FREEBSD "; 732 user_agent += "FREEBSD ";
725 #elif defined(OS_OPENBSD) 733 #elif defined(OS_OPENBSD)
726 user_agent += "OPENBSD "; 734 user_agent += "OPENBSD ";
(...skipping 21 matching lines...) Expand all
748 // initialization, if necessary. 756 // initialization, if necessary.
749 if (options.delete_sync_data_folder) { 757 if (options.delete_sync_data_folder) {
750 DeleteSyncDataFolder(); 758 DeleteSyncDataFolder();
751 } 759 }
752 760
753 // Make sure that the directory exists before initializing the backend. 761 // Make sure that the directory exists before initializing the backend.
754 // If it already exists, this will do no harm. 762 // If it already exists, this will do no harm.
755 bool success = file_util::CreateDirectory(host_->sync_data_folder_path()); 763 bool success = file_util::CreateDirectory(host_->sync_data_folder_path());
756 DCHECK(success); 764 DCHECK(success);
757 765
758 syncapi_->AddObserver(this); 766 sync_manager_.reset(new sync_api::SyncManager(name_)),
767 sync_manager_->AddObserver(this);
759 const FilePath& path_str = host_->sync_data_folder_path(); 768 const FilePath& path_str = host_->sync_data_folder_path();
760 success = syncapi_->Init( 769 success = sync_manager_->Init(
761 path_str, 770 path_str,
762 (options.service_url.host() + options.service_url.path()).c_str(), 771 (options.service_url.host() + options.service_url.path()).c_str(),
763 options.service_url.EffectiveIntPort(), 772 options.service_url.EffectiveIntPort(),
764 options.service_url.SchemeIsSecure(), 773 options.service_url.SchemeIsSecure(),
765 options.http_bridge_factory, 774 options.http_bridge_factory,
766 host_, // ModelSafeWorkerRegistrar. 775 host_, // ModelSafeWorkerRegistrar.
767 MakeUserAgentForSyncapi().c_str(), 776 MakeUserAgentForSyncApi().c_str(),
768 options.credentials, 777 options.credentials,
769 sync_notifier_.get(), 778 sync_notifier_.get(),
770 options.restored_key_for_bootstrapping, 779 options.restored_key_for_bootstrapping,
771 options.setup_for_test_mode); 780 options.setup_for_test_mode);
772 DCHECK(success) << "Syncapi initialization failed!"; 781 DCHECK(success) << "Syncapi initialization failed!";
773 } 782 }
774 783
775 void SyncBackendHost::Core::DoUpdateCredentials( 784 void SyncBackendHost::Core::DoUpdateCredentials(
776 const SyncCredentials& credentials) { 785 const SyncCredentials& credentials) {
777 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop()); 786 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop());
778 syncapi_->UpdateCredentials(credentials); 787 sync_manager_->UpdateCredentials(credentials);
779 } 788 }
780 789
781 void SyncBackendHost::Core::DoUpdateEnabledTypes() { 790 void SyncBackendHost::Core::DoUpdateEnabledTypes() {
782 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop()); 791 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop());
783 syncapi_->UpdateEnabledTypes(); 792 sync_manager_->UpdateEnabledTypes();
784 } 793 }
785 794
786 void SyncBackendHost::Core::DoStartSyncing() { 795 void SyncBackendHost::Core::DoStartSyncing() {
787 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop()); 796 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop());
788 syncapi_->StartSyncingNormally(); 797 sync_manager_->StartSyncingNormally();
789 if (deferred_nudge_for_cleanup_requested_) 798 if (deferred_nudge_for_cleanup_requested_)
790 syncapi_->RequestNudge(FROM_HERE); 799 sync_manager_->RequestNudge(FROM_HERE);
791 deferred_nudge_for_cleanup_requested_ = false; 800 deferred_nudge_for_cleanup_requested_ = false;
792 } 801 }
793 802
794 void SyncBackendHost::Core::DoSetPassphrase(const std::string& passphrase, 803 void SyncBackendHost::Core::DoSetPassphrase(const std::string& passphrase,
795 bool is_explicit) { 804 bool is_explicit) {
796 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop()); 805 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop());
797 syncapi_->SetPassphrase(passphrase, is_explicit); 806 sync_manager_->SetPassphrase(passphrase, is_explicit);
798 } 807 }
799 808
800 bool SyncBackendHost::Core::processing_passphrase() const { 809 bool SyncBackendHost::Core::processing_passphrase() const {
801 DCHECK(MessageLoop::current() == host_->frontend_loop_); 810 DCHECK(MessageLoop::current() == host_->frontend_loop_);
802 return processing_passphrase_; 811 return processing_passphrase_;
803 } 812 }
804 813
805 void SyncBackendHost::Core::set_processing_passphrase() { 814 void SyncBackendHost::Core::set_processing_passphrase() {
806 DCHECK(MessageLoop::current() == host_->frontend_loop_); 815 DCHECK(MessageLoop::current() == host_->frontend_loop_);
807 processing_passphrase_ = true; 816 processing_passphrase_ = true;
808 } 817 }
809 818
810 void SyncBackendHost::Core::DoEncryptDataTypes( 819 void SyncBackendHost::Core::DoEncryptDataTypes(
811 const syncable::ModelTypeSet& encrypted_types) { 820 const syncable::ModelTypeSet& encrypted_types) {
812 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop()); 821 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop());
813 syncapi_->EncryptDataTypes(encrypted_types); 822 sync_manager_->EncryptDataTypes(encrypted_types);
814 } 823 }
815 824
816 void SyncBackendHost::Core::DoRequestConfig( 825 void SyncBackendHost::Core::DoRequestConfig(
817 const syncable::ModelTypeBitSet& added_types, 826 const syncable::ModelTypeBitSet& added_types,
818 sync_api::ConfigureReason reason) { 827 sync_api::ConfigureReason reason) {
819 syncapi_->RequestConfig(added_types, reason); 828 sync_manager_->RequestConfig(added_types, reason);
820 } 829 }
821 830
822 void SyncBackendHost::Core::DoStartConfiguration(Callback0::Type* callback) { 831 void SyncBackendHost::Core::DoStartConfiguration(Callback0::Type* callback) {
823 syncapi_->StartConfigurationMode(callback); 832 sync_manager_->StartConfigurationMode(callback);
824 } 833 }
825 834
826 UIModelWorker* SyncBackendHost::ui_worker() { 835 UIModelWorker* SyncBackendHost::ui_worker() {
827 ModelSafeWorker* w = registrar_.workers[GROUP_UI]; 836 ModelSafeWorker* w = registrar_.workers[GROUP_UI];
828 if (w == NULL) 837 if (w == NULL)
829 return NULL; 838 return NULL;
830 if (w->GetModelSafeGroup() != GROUP_UI) 839 if (w->GetModelSafeGroup() != GROUP_UI)
831 NOTREACHED(); 840 NOTREACHED();
832 return static_cast<UIModelWorker*>(w); 841 return static_cast<UIModelWorker*>(w);
833 } 842 }
834 843
835 void SyncBackendHost::Core::DoShutdown(bool sync_disabled) { 844 void SyncBackendHost::Core::DoShutdown(bool sync_disabled) {
836 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop()); 845 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop());
837 846
838 save_changes_timer_.Stop(); 847 save_changes_timer_.Stop();
839 syncapi_->Shutdown(); // Stops the SyncerThread. 848 sync_manager_->Shutdown(); // Stops the SyncerThread.
840 syncapi_->RemoveObserver(this); 849 sync_manager_->RemoveObserver(this);
841 DisconnectChildJsEventRouter(); 850 DisconnectChildJsEventRouter();
851 sync_manager_.reset();
842 host_->ui_worker()->OnSyncerShutdownComplete(); 852 host_->ui_worker()->OnSyncerShutdownComplete();
843 853
844 if (sync_disabled) 854 if (sync_disabled)
845 DeleteSyncDataFolder(); 855 DeleteSyncDataFolder();
846 856
847 host_ = NULL; 857 host_ = NULL;
848 } 858 }
849 859
850 ChangeProcessor* SyncBackendHost::Core::GetProcessor( 860 ChangeProcessor* SyncBackendHost::Core::GetProcessor(
851 syncable::ModelType model_type) { 861 syncable::ModelType model_type) {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
955 965
956 void SyncBackendHost::Core::OnInitializationComplete() { 966 void SyncBackendHost::Core::OnInitializationComplete() {
957 if (!host_ || !host_->frontend_) 967 if (!host_ || !host_->frontend_)
958 return; // We may have been told to Shutdown before initialization 968 return; // We may have been told to Shutdown before initialization
959 // completed. 969 // completed.
960 970
961 // We could be on some random sync backend thread, so MessageLoop::current() 971 // We could be on some random sync backend thread, so MessageLoop::current()
962 // can definitely be null in here. 972 // can definitely be null in here.
963 host_->frontend_loop_->PostTask(FROM_HERE, 973 host_->frontend_loop_->PostTask(FROM_HERE,
964 NewRunnableMethod(this, 974 NewRunnableMethod(this,
965 &Core::HandleInitalizationCompletedOnFrontendLoop)); 975 &Core::HandleInitializationCompletedOnFrontendLoop));
966 976
967 // Initialization is complete, so we can schedule recurring SaveChanges. 977 // Initialization is complete, so we can schedule recurring SaveChanges.
968 host_->sync_thread_.message_loop()->PostTask(FROM_HERE, 978 host_->sync_thread_.message_loop()->PostTask(FROM_HERE,
969 NewRunnableMethod(this, &Core::StartSavingChanges)); 979 NewRunnableMethod(this, &Core::StartSavingChanges));
970 } 980 }
971 981
972 void SyncBackendHost::Core::HandleInitalizationCompletedOnFrontendLoop() { 982 void SyncBackendHost::Core::HandleInitializationCompletedOnFrontendLoop() {
973 if (!host_) 983 if (!host_)
974 return; 984 return;
975 host_->HandleInitializationCompletedOnFrontendLoop(); 985 host_->HandleInitializationCompletedOnFrontendLoop();
976 } 986 }
977 987
978 void SyncBackendHost::HandleInitializationCompletedOnFrontendLoop() { 988 void SyncBackendHost::HandleInitializationCompletedOnFrontendLoop() {
979 if (!frontend_) 989 if (!frontend_)
980 return; 990 return;
981 syncapi_initialized_ = true; 991 sync_manager_initialized_ = true;
982 // Now that the syncapi is initialized, we can update the cryptographer (and 992 // Now that the syncapi is initialized, we can update the cryptographer (and
983 // can handle any ON_PASSPHRASE_REQUIRED notifications that may arise). 993 // can handle any ON_PASSPHRASE_REQUIRED notifications that may arise).
984 core_->syncapi()->RefreshEncryption(); 994 core_->sync_manager()->RefreshEncryption();
985 frontend_->OnBackendInitialized(); 995 frontend_->OnBackendInitialized();
986 } 996 }
987 997
988 bool SyncBackendHost::Core::IsCurrentThreadSafeForModel( 998 bool SyncBackendHost::Core::IsCurrentThreadSafeForModel(
989 syncable::ModelType model_type) { 999 syncable::ModelType model_type) {
990 base::AutoLock lock(host_->registrar_lock_); 1000 base::AutoLock lock(host_->registrar_lock_);
991 1001
992 browser_sync::ModelSafeRoutingInfo::const_iterator routing_it = 1002 browser_sync::ModelSafeRoutingInfo::const_iterator routing_it =
993 host_->registrar_.routing_info.find(model_type); 1003 host_->registrar_.routing_info.find(model_type);
994 if (routing_it == host_->registrar_.routing_info.end()) 1004 if (routing_it == host_->registrar_.routing_info.end())
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1116 } 1126 }
1117 1127
1118 void SyncBackendHost::Core::StartSavingChanges() { 1128 void SyncBackendHost::Core::StartSavingChanges() {
1119 save_changes_timer_.Start( 1129 save_changes_timer_.Start(
1120 base::TimeDelta::FromSeconds(kSaveChangesIntervalSeconds), 1130 base::TimeDelta::FromSeconds(kSaveChangesIntervalSeconds),
1121 this, &Core::SaveChanges); 1131 this, &Core::SaveChanges);
1122 } 1132 }
1123 1133
1124 void SyncBackendHost::Core::DoRequestNudge( 1134 void SyncBackendHost::Core::DoRequestNudge(
1125 const tracked_objects::Location& nudge_location) { 1135 const tracked_objects::Location& nudge_location) {
1126 syncapi_->RequestNudge(nudge_location); 1136 sync_manager_->RequestNudge(nudge_location);
1127 } 1137 }
1128 1138
1129 void SyncBackendHost::Core::DoRequestClearServerData() { 1139 void SyncBackendHost::Core::DoRequestClearServerData() {
1130 syncapi_->RequestClearServerData(); 1140 sync_manager_->RequestClearServerData();
1131 } 1141 }
1132 1142
1133 void SyncBackendHost::Core::SaveChanges() { 1143 void SyncBackendHost::Core::SaveChanges() {
1134 syncapi_->SaveChanges(); 1144 sync_manager_->SaveChanges();
1135 } 1145 }
1136 1146
1137 void SyncBackendHost::Core::DeleteSyncDataFolder() { 1147 void SyncBackendHost::Core::DeleteSyncDataFolder() {
1138 if (file_util::DirectoryExists(host_->sync_data_folder_path())) { 1148 if (file_util::DirectoryExists(host_->sync_data_folder_path())) {
1139 if (!file_util::Delete(host_->sync_data_folder_path(), true)) 1149 if (!file_util::Delete(host_->sync_data_folder_path(), true))
1140 LOG(DFATAL) << "Could not delete the Sync Data folder."; 1150 LOG(DFATAL) << "Could not delete the Sync Data folder.";
1141 } 1151 }
1142 } 1152 }
1143 1153
1144 void SyncBackendHost::Core::SetParentJsEventRouter(JsEventRouter* router) { 1154 void SyncBackendHost::Core::SetParentJsEventRouter(JsEventRouter* router) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1179 FROM_HERE, 1189 FROM_HERE,
1180 NewRunnableMethod(this, 1190 NewRunnableMethod(this,
1181 &SyncBackendHost::Core::DoProcessMessage, 1191 &SyncBackendHost::Core::DoProcessMessage,
1182 name, args, sender)); 1192 name, args, sender));
1183 } 1193 }
1184 1194
1185 void SyncBackendHost::Core::ConnectChildJsEventRouter() { 1195 void SyncBackendHost::Core::ConnectChildJsEventRouter() {
1186 DCHECK_EQ(MessageLoop::current(), host_->sync_thread_.message_loop()); 1196 DCHECK_EQ(MessageLoop::current(), host_->sync_thread_.message_loop());
1187 // We need this check since AddObserver() can be called at most once 1197 // We need this check since AddObserver() can be called at most once
1188 // for a given observer. 1198 // for a given observer.
1189 if (!syncapi_->GetJsBackend()->GetParentJsEventRouter()) { 1199 if (!sync_manager_->GetJsBackend()->GetParentJsEventRouter()) {
1190 syncapi_->GetJsBackend()->SetParentJsEventRouter(this); 1200 sync_manager_->GetJsBackend()->SetParentJsEventRouter(this);
1191 syncapi_->AddObserver(&sync_manager_observer_); 1201 sync_manager_->AddObserver(&sync_manager_observer_);
1192 } 1202 }
1193 } 1203 }
1194 1204
1195 void SyncBackendHost::Core::DisconnectChildJsEventRouter() { 1205 void SyncBackendHost::Core::DisconnectChildJsEventRouter() {
1196 DCHECK_EQ(MessageLoop::current(), host_->sync_thread_.message_loop()); 1206 DCHECK_EQ(MessageLoop::current(), host_->sync_thread_.message_loop());
1197 syncapi_->GetJsBackend()->RemoveParentJsEventRouter(); 1207 sync_manager_->GetJsBackend()->RemoveParentJsEventRouter();
1198 syncapi_->RemoveObserver(&sync_manager_observer_); 1208 sync_manager_->RemoveObserver(&sync_manager_observer_);
1199 } 1209 }
1200 1210
1201 void SyncBackendHost::Core::DoProcessMessage( 1211 void SyncBackendHost::Core::DoProcessMessage(
1202 const std::string& name, const JsArgList& args, 1212 const std::string& name, const JsArgList& args,
1203 const JsEventHandler* sender) { 1213 const JsEventHandler* sender) {
1204 DCHECK_EQ(MessageLoop::current(), host_->sync_thread_.message_loop()); 1214 DCHECK_EQ(MessageLoop::current(), host_->sync_thread_.message_loop());
1205 syncapi_->GetJsBackend()->ProcessMessage(name, args, sender); 1215 sync_manager_->GetJsBackend()->ProcessMessage(name, args, sender);
1206 } 1216 }
1207 1217
1208 void SyncBackendHost::Core::DeferNudgeForCleanup() { 1218 void SyncBackendHost::Core::DeferNudgeForCleanup() {
1209 DCHECK_EQ(MessageLoop::current(), host_->sync_thread_.message_loop()); 1219 DCHECK_EQ(MessageLoop::current(), host_->sync_thread_.message_loop());
1210 deferred_nudge_for_cleanup_requested_ = true; 1220 deferred_nudge_for_cleanup_requested_ = true;
1211 } 1221 }
1212 1222
1213 } // namespace browser_sync 1223 } // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/sync/glue/sync_backend_host.h ('k') | chrome/browser/sync/js_directory_change_listener.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698