OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/sync/glue/sync_backend_host.h" | 7 #include "chrome/browser/sync/glue/sync_backend_host.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <map> | 10 #include <map> |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 // operations. | 117 // operations. |
118 // | 118 // |
119 // Called to perform initialization of the syncapi on behalf of | 119 // Called to perform initialization of the syncapi on behalf of |
120 // SyncBackendHost::Initialize. | 120 // SyncBackendHost::Initialize. |
121 void DoInitialize(const DoInitializeOptions& options); | 121 void DoInitialize(const DoInitializeOptions& options); |
122 | 122 |
123 // Called to perform credential update on behalf of | 123 // Called to perform credential update on behalf of |
124 // SyncBackendHost::UpdateCredentials | 124 // SyncBackendHost::UpdateCredentials |
125 void DoUpdateCredentials(const syncer::SyncCredentials& credentials); | 125 void DoUpdateCredentials(const syncer::SyncCredentials& credentials); |
126 | 126 |
127 // Called when the user disables or enables a sync type. | |
128 void DoUpdateEnabledTypes(const syncer::ModelTypeSet& enabled_types); | |
129 | |
130 // Called to tell the syncapi to start syncing (generally after | 127 // Called to tell the syncapi to start syncing (generally after |
131 // initialization and authentication). | 128 // initialization and authentication). |
132 void DoStartSyncing(const syncer::ModelSafeRoutingInfo& routing_info); | 129 void DoStartSyncing(const syncer::ModelSafeRoutingInfo& routing_info); |
133 | 130 |
134 // Called to set the passphrase for encryption. | 131 // Called to set the passphrase for encryption. |
135 void DoSetEncryptionPassphrase(const std::string& passphrase, | 132 void DoSetEncryptionPassphrase(const std::string& passphrase, |
136 bool is_explicit); | 133 bool is_explicit); |
137 | 134 |
138 // Called to decrypt the pending keys. | 135 // Called to decrypt the pending keys. |
139 void DoSetDecryptionPassphrase(const std::string& passphrase); | 136 void DoSetDecryptionPassphrase(const std::string& passphrase); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 syncer::WeakHandle<SyncBackendHost> host_; | 211 syncer::WeakHandle<SyncBackendHost> host_; |
215 | 212 |
216 // The loop where all the sync backend operations happen. | 213 // The loop where all the sync backend operations happen. |
217 // Non-NULL only between calls to DoInitialize() and DoShutdown(). | 214 // Non-NULL only between calls to DoInitialize() and DoShutdown(). |
218 MessageLoop* sync_loop_; | 215 MessageLoop* sync_loop_; |
219 | 216 |
220 // Our parent's registrar (not owned). Non-NULL only between | 217 // Our parent's registrar (not owned). Non-NULL only between |
221 // calls to DoInitialize() and DoShutdown(). | 218 // calls to DoInitialize() and DoShutdown(). |
222 SyncBackendRegistrar* registrar_; | 219 SyncBackendRegistrar* registrar_; |
223 | 220 |
| 221 // Our parent's notification bridge (not owned). Non-NULL only |
| 222 // between calls to DoInitialize() and DoShutdown(). |
| 223 ChromeSyncNotificationBridge* chrome_sync_notification_bridge_; |
| 224 |
224 // The timer used to periodically call SaveChanges. | 225 // The timer used to periodically call SaveChanges. |
225 scoped_ptr<base::RepeatingTimer<Core> > save_changes_timer_; | 226 scoped_ptr<base::RepeatingTimer<Core> > save_changes_timer_; |
226 | 227 |
227 // Our encryptor, which uses Chrome's encryption functions. | 228 // Our encryptor, which uses Chrome's encryption functions. |
228 ChromeEncryptor encryptor_; | 229 ChromeEncryptor encryptor_; |
229 | 230 |
230 // The top-level syncapi entry point. Lives on the sync thread. | 231 // The top-level syncapi entry point. Lives on the sync thread. |
231 scoped_ptr<syncer::SyncManager> sync_manager_; | 232 scoped_ptr<syncer::SyncManager> sync_manager_; |
232 | 233 |
233 DISALLOW_COPY_AND_ASSIGN(Core); | 234 DISALLOW_COPY_AND_ASSIGN(Core); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 sync_notifier_factory_( | 312 sync_notifier_factory_( |
312 ParseNotifierOptions(*CommandLine::ForCurrentProcess(), | 313 ParseNotifierOptions(*CommandLine::ForCurrentProcess(), |
313 profile_->GetRequestContext()), | 314 profile_->GetRequestContext()), |
314 content::GetUserAgent(GURL()), | 315 content::GetUserAgent(GURL()), |
315 base::WeakPtr<syncer::InvalidationStateTracker>()), | 316 base::WeakPtr<syncer::InvalidationStateTracker>()), |
316 frontend_(NULL) { | 317 frontend_(NULL) { |
317 } | 318 } |
318 | 319 |
319 SyncBackendHost::~SyncBackendHost() { | 320 SyncBackendHost::~SyncBackendHost() { |
320 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor."; | 321 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor."; |
| 322 DCHECK(!chrome_sync_notification_bridge_.get()); |
321 DCHECK(!registrar_.get()); | 323 DCHECK(!registrar_.get()); |
322 } | 324 } |
323 | 325 |
324 namespace { | 326 namespace { |
325 | 327 |
326 // Helper to construct a user agent string (ASCII) suitable for use by | 328 // Helper to construct a user agent string (ASCII) suitable for use by |
327 // the syncapi for any HTTP communication. This string is used by the sync | 329 // the syncapi for any HTTP communication. This string is used by the sync |
328 // backend for classifying client types when calculating statistics. | 330 // backend for classifying client types when calculating statistics. |
329 std::string MakeUserAgentForSyncApi() { | 331 std::string MakeUserAgentForSyncApi() { |
330 std::string user_agent; | 332 std::string user_agent; |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 base::Bind(&SyncBackendHost::Core::DoConfigureSyncer, | 740 base::Bind(&SyncBackendHost::Core::DoConfigureSyncer, |
739 core_.get(), | 741 core_.get(), |
740 reason, | 742 reason, |
741 types_to_config, | 743 types_to_config, |
742 routing_info, | 744 routing_info, |
743 ready_task, | 745 ready_task, |
744 retry_callback)); | 746 retry_callback)); |
745 } | 747 } |
746 | 748 |
747 void SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop( | 749 void SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop( |
748 syncer::ModelTypeSet types_to_configure, | 750 syncer::ModelTypeSet failed_configuration_types, |
749 syncer::ModelTypeSet configured_types, | |
750 const base::Callback<void(syncer::ModelTypeSet)>& ready_task) { | 751 const base::Callback<void(syncer::ModelTypeSet)>& ready_task) { |
751 const syncer::ModelTypeSet failed_configuration_types = | 752 if (!frontend_) |
752 Difference(types_to_configure, configured_types); | 753 return; |
753 SDVLOG(1) | 754 DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
754 << "Added types: " | |
755 << syncer::ModelTypeSetToString(types_to_configure) | |
756 << ", configured types: " | |
757 << syncer::ModelTypeSetToString(configured_types) | |
758 << ", failed configuration types: " | |
759 << syncer::ModelTypeSetToString(failed_configuration_types); | |
760 | |
761 // Update |chrome_sync_notification_bridge_|'s enabled types here as it has | |
762 // to happen on the UI thread. | |
763 chrome_sync_notification_bridge_->UpdateEnabledTypes(configured_types); | |
764 | |
765 // Notify SyncManager (especially the notification listener) about new types. | |
766 sync_thread_.message_loop()->PostTask(FROM_HERE, | |
767 base::Bind(&SyncBackendHost::Core::DoUpdateEnabledTypes, core_.get(), | |
768 configured_types)); | |
769 | |
770 if (!ready_task.is_null()) | 755 if (!ready_task.is_null()) |
771 ready_task.Run(failed_configuration_types); | 756 ready_task.Run(failed_configuration_types); |
772 } | 757 } |
773 | 758 |
774 SyncBackendHost::DoInitializeOptions::DoInitializeOptions( | 759 SyncBackendHost::DoInitializeOptions::DoInitializeOptions( |
775 MessageLoop* sync_loop, | 760 MessageLoop* sync_loop, |
776 SyncBackendRegistrar* registrar, | 761 SyncBackendRegistrar* registrar, |
777 const syncer::ModelSafeRoutingInfo& routing_info, | 762 const syncer::ModelSafeRoutingInfo& routing_info, |
778 const std::vector<syncer::ModelSafeWorker*>& workers, | 763 const std::vector<syncer::ModelSafeWorker*>& workers, |
779 syncer::ExtensionsActivityMonitor* extensions_activity_monitor, | 764 syncer::ExtensionsActivityMonitor* extensions_activity_monitor, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
812 | 797 |
813 SyncBackendHost::DoInitializeOptions::~DoInitializeOptions() {} | 798 SyncBackendHost::DoInitializeOptions::~DoInitializeOptions() {} |
814 | 799 |
815 SyncBackendHost::Core::Core(const std::string& name, | 800 SyncBackendHost::Core::Core(const std::string& name, |
816 const FilePath& sync_data_folder_path, | 801 const FilePath& sync_data_folder_path, |
817 const base::WeakPtr<SyncBackendHost>& backend) | 802 const base::WeakPtr<SyncBackendHost>& backend) |
818 : name_(name), | 803 : name_(name), |
819 sync_data_folder_path_(sync_data_folder_path), | 804 sync_data_folder_path_(sync_data_folder_path), |
820 host_(backend), | 805 host_(backend), |
821 sync_loop_(NULL), | 806 sync_loop_(NULL), |
822 registrar_(NULL) { | 807 registrar_(NULL), |
| 808 chrome_sync_notification_bridge_(NULL) { |
823 DCHECK(backend.get()); | 809 DCHECK(backend.get()); |
824 } | 810 } |
825 | 811 |
826 SyncBackendHost::Core::~Core() { | 812 SyncBackendHost::Core::~Core() { |
827 DCHECK(!sync_manager_.get()); | 813 DCHECK(!sync_manager_.get()); |
828 DCHECK(!sync_loop_); | 814 DCHECK(!sync_loop_); |
829 } | 815 } |
830 | 816 |
831 void SyncBackendHost::Core::OnSyncCycleCompleted( | 817 void SyncBackendHost::Core::OnSyncCycleCompleted( |
832 const SyncSessionSnapshot& snapshot) { | 818 const SyncSessionSnapshot& snapshot) { |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 | 947 |
962 // Make sure that the directory exists before initializing the backend. | 948 // Make sure that the directory exists before initializing the backend. |
963 // If it already exists, this will do no harm. | 949 // If it already exists, this will do no harm. |
964 bool success = file_util::CreateDirectory(sync_data_folder_path_); | 950 bool success = file_util::CreateDirectory(sync_data_folder_path_); |
965 DCHECK(success); | 951 DCHECK(success); |
966 | 952 |
967 DCHECK(!registrar_); | 953 DCHECK(!registrar_); |
968 registrar_ = options.registrar; | 954 registrar_ = options.registrar; |
969 DCHECK(registrar_); | 955 DCHECK(registrar_); |
970 | 956 |
| 957 DCHECK(!chrome_sync_notification_bridge_); |
| 958 chrome_sync_notification_bridge_ = options.chrome_sync_notification_bridge; |
| 959 DCHECK(chrome_sync_notification_bridge_); |
| 960 |
971 sync_manager_ = options.sync_manager_factory->CreateSyncManager(name_); | 961 sync_manager_ = options.sync_manager_factory->CreateSyncManager(name_); |
972 sync_manager_->AddObserver(this); | 962 sync_manager_->AddObserver(this); |
973 success = sync_manager_->Init( | 963 success = sync_manager_->Init( |
974 sync_data_folder_path_, | 964 sync_data_folder_path_, |
975 options.event_handler, | 965 options.event_handler, |
976 options.service_url.host() + options.service_url.path(), | 966 options.service_url.host() + options.service_url.path(), |
977 options.service_url.EffectiveIntPort(), | 967 options.service_url.EffectiveIntPort(), |
978 options.service_url.SchemeIsSecure(), | 968 options.service_url.SchemeIsSecure(), |
979 BrowserThread::GetBlockingPool(), | 969 BrowserThread::GetBlockingPool(), |
980 options.make_http_bridge_factory_fn.Run().Pass(), | 970 options.make_http_bridge_factory_fn.Run().Pass(), |
(...skipping 24 matching lines...) Expand all Loading... |
1005 sync_manager_->ThrowUnrecoverableError(); | 995 sync_manager_->ThrowUnrecoverableError(); |
1006 } | 996 } |
1007 } | 997 } |
1008 | 998 |
1009 void SyncBackendHost::Core::DoUpdateCredentials( | 999 void SyncBackendHost::Core::DoUpdateCredentials( |
1010 const SyncCredentials& credentials) { | 1000 const SyncCredentials& credentials) { |
1011 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1001 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1012 sync_manager_->UpdateCredentials(credentials); | 1002 sync_manager_->UpdateCredentials(credentials); |
1013 } | 1003 } |
1014 | 1004 |
1015 void SyncBackendHost::Core::DoUpdateEnabledTypes( | |
1016 const syncer::ModelTypeSet& enabled_types) { | |
1017 DCHECK_EQ(MessageLoop::current(), sync_loop_); | |
1018 sync_manager_->UpdateEnabledTypes(enabled_types); | |
1019 } | |
1020 | |
1021 void SyncBackendHost::Core::DoStartSyncing( | 1005 void SyncBackendHost::Core::DoStartSyncing( |
1022 const syncer::ModelSafeRoutingInfo& routing_info) { | 1006 const syncer::ModelSafeRoutingInfo& routing_info) { |
1023 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1007 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1024 sync_manager_->StartSyncingNormally(routing_info); | 1008 sync_manager_->StartSyncingNormally(routing_info); |
1025 } | 1009 } |
1026 | 1010 |
1027 void SyncBackendHost::Core::DoSetEncryptionPassphrase( | 1011 void SyncBackendHost::Core::DoSetEncryptionPassphrase( |
1028 const std::string& passphrase, | 1012 const std::string& passphrase, |
1029 bool is_explicit) { | 1013 bool is_explicit) { |
1030 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1014 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
(...skipping 27 matching lines...) Expand all Loading... |
1058 | 1042 |
1059 void SyncBackendHost::Core::DoShutdown(bool sync_disabled) { | 1043 void SyncBackendHost::Core::DoShutdown(bool sync_disabled) { |
1060 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1044 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1061 if (!sync_manager_.get()) | 1045 if (!sync_manager_.get()) |
1062 return; | 1046 return; |
1063 | 1047 |
1064 save_changes_timer_.reset(); | 1048 save_changes_timer_.reset(); |
1065 sync_manager_->ShutdownOnSyncThread(); | 1049 sync_manager_->ShutdownOnSyncThread(); |
1066 sync_manager_->RemoveObserver(this); | 1050 sync_manager_->RemoveObserver(this); |
1067 sync_manager_.reset(); | 1051 sync_manager_.reset(); |
| 1052 chrome_sync_notification_bridge_ = NULL; |
1068 registrar_ = NULL; | 1053 registrar_ = NULL; |
1069 | 1054 |
1070 if (sync_disabled) | 1055 if (sync_disabled) |
1071 DeleteSyncDataFolder(); | 1056 DeleteSyncDataFolder(); |
1072 | 1057 |
1073 sync_loop_ = NULL; | 1058 sync_loop_ = NULL; |
1074 | 1059 |
1075 host_.Reset(); | 1060 host_.Reset(); |
1076 } | 1061 } |
1077 | 1062 |
(...skipping 14 matching lines...) Expand all Loading... |
1092 ready_task), | 1077 ready_task), |
1093 base::Bind(&SyncBackendHost::Core::DoRetryConfiguration, | 1078 base::Bind(&SyncBackendHost::Core::DoRetryConfiguration, |
1094 this, | 1079 this, |
1095 retry_callback)); | 1080 retry_callback)); |
1096 } | 1081 } |
1097 | 1082 |
1098 void SyncBackendHost::Core::DoFinishConfigureDataTypes( | 1083 void SyncBackendHost::Core::DoFinishConfigureDataTypes( |
1099 syncer::ModelTypeSet types_to_config, | 1084 syncer::ModelTypeSet types_to_config, |
1100 const base::Callback<void(syncer::ModelTypeSet)>& ready_task) { | 1085 const base::Callback<void(syncer::ModelTypeSet)>& ready_task) { |
1101 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1086 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1102 syncer::ModelTypeSet configured_types = | 1087 |
1103 sync_manager_->InitialSyncEndedTypes(); | 1088 // Update the enabled types for the bridge and sync manager. |
1104 configured_types.RetainAll(types_to_config); | 1089 syncer::ModelSafeRoutingInfo routing_info; |
| 1090 registrar_->GetModelSafeRoutingInfo(&routing_info); |
| 1091 const syncer::ModelTypeSet enabled_types = GetRoutingInfoTypes(routing_info); |
| 1092 chrome_sync_notification_bridge_->UpdateEnabledTypes(enabled_types); |
| 1093 sync_manager_->UpdateEnabledTypes(enabled_types); |
| 1094 |
| 1095 const syncer::ModelTypeSet failed_configuration_types = |
| 1096 Difference(types_to_config, sync_manager_->InitialSyncEndedTypes()); |
1105 host_.Call(FROM_HERE, | 1097 host_.Call(FROM_HERE, |
1106 &SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop, | 1098 &SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop, |
1107 types_to_config, | 1099 failed_configuration_types, |
1108 configured_types, | |
1109 ready_task); | 1100 ready_task); |
1110 } | 1101 } |
1111 | 1102 |
1112 void SyncBackendHost::Core::DoRetryConfiguration( | 1103 void SyncBackendHost::Core::DoRetryConfiguration( |
1113 const base::Closure& retry_callback) { | 1104 const base::Closure& retry_callback) { |
1114 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1105 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1115 host_.Call(FROM_HERE, | 1106 host_.Call(FROM_HERE, |
1116 &SyncBackendHost::RetryConfigurationOnFrontendLoop, | 1107 &SyncBackendHost::RetryConfigurationOnFrontendLoop, |
1117 retry_callback); | 1108 retry_callback); |
1118 } | 1109 } |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1375 FROM_HERE, | 1366 FROM_HERE, |
1376 base::Bind(&SyncBackendHost::Core::DoRefreshNigori, | 1367 base::Bind(&SyncBackendHost::Core::DoRefreshNigori, |
1377 core_.get(), sync_thread_done_callback)); | 1368 core_.get(), sync_thread_done_callback)); |
1378 } | 1369 } |
1379 | 1370 |
1380 #undef SDVLOG | 1371 #undef SDVLOG |
1381 | 1372 |
1382 #undef SLOG | 1373 #undef SLOG |
1383 | 1374 |
1384 } // namespace browser_sync | 1375 } // namespace browser_sync |
OLD | NEW |