1 // Copyright 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef SYNC_INTERNAL_API_SYNC_MANAGER_H_ 6 #define SYNC_INTERNAL_API_SYNC_MANAGER_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "net/base/network_change_notifier.h" 12 #include "sync/base/sync_export.h" 13 #include "sync/engine/all_status.h" 14 #include "sync/engine/net/server_connection_manager.h" 15 #include "sync/engine/nudge_handler.h" 16 #include "sync/engine/sync_engine_event_listener.h" 17 #include "sync/internal_api/change_reorder_buffer.h" 18 #include "sync/internal_api/debug_info_event_listener.h" 19 #include "sync/internal_api/js_mutation_event_observer.h" 20 #include "sync/internal_api/js_sync_encryption_handler_observer.h" 21 #include "sync/internal_api/js_sync_manager_observer.h" 22 #include "sync/internal_api/protocol_event_buffer.h" 23 #include "sync/internal_api/public/sync_context_proxy.h" 24 #include "sync/internal_api/public/sync_manager.h" 25 #include "sync/internal_api/public/user_share.h" 26 #include "sync/internal_api/sync_encryption_handler_impl.h" 27 #include "sync/js/js_backend.h" 28 #include "sync/syncable/directory_change_delegate.h" 29 #include "sync/util/cryptographer.h" 30 #include "sync/util/time.h" 31 32 class GURL; 33 34 namespace syncer { 35 36 class ModelTypeRegistry; 37 class SyncAPIServerConnectionManager; 38 class SyncContext; 39 class TypeDebugInfoObserver; 40 class WriteNode; 41 class WriteTransaction; 42 43 namespace sessions { 44 class SyncSessionContext; 45 } 46 47 // SyncManager encapsulates syncable::Directory and serves as the parent of all 48 // other objects in the sync API. If multiple threads interact with the same 49 // local sync repository (i.e. the same sqlite database), they should share a 50 // single SyncManager instance. The caller should typically create one 51 // SyncManager for the lifetime of a user session. 52 // 53 // Unless stated otherwise, all methods of SyncManager should be called on the 54 // same thread. 55 class SYNC_EXPORT_PRIVATE SyncManagerImpl 56 : public SyncManager, 57 public net::NetworkChangeNotifier::IPAddressObserver, 58 public net::NetworkChangeNotifier::ConnectionTypeObserver, 59 public JsBackend, 60 public SyncEngineEventListener, 61 public ServerConnectionEventListener, 62 public syncable::DirectoryChangeDelegate, 63 public SyncEncryptionHandler::Observer, 64 public NudgeHandler { 65 public: 66 // Create an uninitialized SyncManager. Callers must Init() before using. 67 explicit SyncManagerImpl(const std::string& name); 68 virtual ~SyncManagerImpl(); 69 70 // SyncManager implementation. 71 virtual void Init(InitArgs* args) OVERRIDE; 72 virtual ModelTypeSet InitialSyncEndedTypes() OVERRIDE; 73 virtual ModelTypeSet GetTypesWithEmptyProgressMarkerToken( 74 ModelTypeSet types) OVERRIDE; 75 virtual bool PurgePartiallySyncedTypes() OVERRIDE; 76 virtual void UpdateCredentials(const SyncCredentials& credentials) OVERRIDE; 77 virtual void StartSyncingNormally( 78 const ModelSafeRoutingInfo& routing_info) OVERRIDE; 79 virtual void ConfigureSyncer( 80 ConfigureReason reason, 81 ModelTypeSet to_download, 82 ModelTypeSet to_purge, 83 ModelTypeSet to_journal, 84 ModelTypeSet to_unapply, 85 const ModelSafeRoutingInfo& new_routing_info, 86 const base::Closure& ready_task, 87 const base::Closure& retry_task) OVERRIDE; 88 virtual void SetInvalidatorEnabled(bool invalidator_enabled) OVERRIDE; 89 virtual void OnIncomingInvalidation( 90 syncer::ModelType type, 91 scoped_ptr<InvalidationInterface> invalidation) OVERRIDE; 92 virtual void AddObserver(SyncManager::Observer* observer) OVERRIDE; 93 virtual void RemoveObserver(SyncManager::Observer* observer) OVERRIDE; 94 virtual SyncStatus GetDetailedStatus() const OVERRIDE; 95 virtual void SaveChanges() OVERRIDE; 96 virtual void ShutdownOnSyncThread(ShutdownReason reason) OVERRIDE; 97 virtual UserShare* GetUserShare() OVERRIDE; 98 virtual syncer::SyncContextProxy* GetSyncContextProxy() OVERRIDE; 99 virtual const std::string cache_guid() OVERRIDE; 100 virtual bool ReceivedExperiment(Experiments* experiments) OVERRIDE; 101 virtual bool HasUnsyncedItems() OVERRIDE; 102 virtual SyncEncryptionHandler* GetEncryptionHandler() OVERRIDE; 103 virtual ScopedVector<syncer::ProtocolEvent> 104 GetBufferedProtocolEvents() OVERRIDE; 105 virtual scoped_ptr<base::ListValue> GetAllNodesForType( 106 syncer::ModelType type) OVERRIDE; 107 virtual void RegisterDirectoryTypeDebugInfoObserver( 108 syncer::TypeDebugInfoObserver* observer) OVERRIDE; 109 virtual void UnregisterDirectoryTypeDebugInfoObserver( 110 syncer::TypeDebugInfoObserver* observer) OVERRIDE; 111 virtual bool HasDirectoryTypeDebugInfoObserver( 112 syncer::TypeDebugInfoObserver* observer) OVERRIDE; 113 virtual void RequestEmitDebugInfo() OVERRIDE; 114 115 // SyncEncryptionHandler::Observer implementation. 116 virtual void OnPassphraseRequired( 117 PassphraseRequiredReason reason, 118 const sync_pb::EncryptedData& pending_keys) OVERRIDE; 119 virtual void OnPassphraseAccepted() OVERRIDE; 120 virtual void OnBootstrapTokenUpdated( 121 const std::string& bootstrap_token, 122 BootstrapTokenType type) OVERRIDE; 123 virtual void OnEncryptedTypesChanged( 124 ModelTypeSet encrypted_types, 125 bool encrypt_everything) OVERRIDE; 126 virtual void OnEncryptionComplete() OVERRIDE; 127 virtual void OnCryptographerStateChanged( 128 Cryptographer* cryptographer) OVERRIDE; 129 virtual void OnPassphraseTypeChanged( 130 PassphraseType type, 131 base::Time explicit_passphrase_time) OVERRIDE; 132 133 // SyncEngineEventListener implementation. 134 virtual void OnSyncCycleEvent(const SyncCycleEvent& event) OVERRIDE; 135 virtual void OnActionableError(const SyncProtocolError& error) OVERRIDE; 136 virtual void OnRetryTimeChanged(base::Time retry_time) OVERRIDE; 137 virtual void OnThrottledTypesChanged(ModelTypeSet throttled_types) OVERRIDE; 138 virtual void OnMigrationRequested(ModelTypeSet types) OVERRIDE; 139 virtual void OnProtocolEvent(const ProtocolEvent& event) OVERRIDE; 140 141 // ServerConnectionEventListener implementation. 142 virtual void OnServerConnectionEvent( 143 const ServerConnectionEvent& event) OVERRIDE; 144 145 // JsBackend implementation. 146 virtual void SetJsEventHandler( 147 const WeakHandle<JsEventHandler>& event_handler) OVERRIDE; 148 149 // DirectoryChangeDelegate implementation. 150 // This listener is called upon completion of a syncable transaction, and 151 // builds the list of sync-engine initiated changes that will be forwarded to 152 // the SyncManager's Observers. 153 virtual void HandleTransactionCompleteChangeEvent( 154 ModelTypeSet models_with_changes) OVERRIDE; 155 virtual ModelTypeSet HandleTransactionEndingChangeEvent( 156 const syncable::ImmutableWriteTransactionInfo& write_transaction_info, 157 syncable::BaseTransaction* trans) OVERRIDE; 158 virtual void HandleCalculateChangesChangeEventFromSyncApi( 159 const syncable::ImmutableWriteTransactionInfo& write_transaction_info, 160 syncable::BaseTransaction* trans, 161 std::vector<int64>* entries_changed) OVERRIDE; 162 virtual void HandleCalculateChangesChangeEventFromSyncer( 163 const syncable::ImmutableWriteTransactionInfo& write_transaction_info, 164 syncable::BaseTransaction* trans, 165 std::vector<int64>* entries_changed) OVERRIDE; 166 167 // Handle explicit requests to fetch updates for the given types. 168 virtual void RefreshTypes(ModelTypeSet types) OVERRIDE; 169 170 // These OnYYYChanged() methods are only called by our NetworkChangeNotifier. 171 // Called when IP address of primary interface changes. 172 virtual void OnIPAddressChanged() OVERRIDE; 173 // Called when the connection type of the system has changed. 174 virtual void OnConnectionTypeChanged( 175 net::NetworkChangeNotifier::ConnectionType) OVERRIDE; 176 177 // NudgeHandler implementation. 178 virtual void NudgeForInitialDownload(syncer::ModelType type) OVERRIDE; 179 virtual void NudgeForCommit(syncer::ModelType type) OVERRIDE; 180 virtual void NudgeForRefresh(syncer::ModelType type) OVERRIDE; 181 182 const SyncScheduler* scheduler() const; 183 184 bool GetHasInvalidAuthTokenForTest() const; 185 186 protected: 187 // Helper functions. Virtual for testing. 188 virtual void NotifyInitializationSuccess(); 189 virtual void NotifyInitializationFailure(); 190 191 private: 192 friend class SyncManagerTest; 193 FRIEND_TEST_ALL_PREFIXES(SyncManagerTest, NudgeDelayTest); 194 FRIEND_TEST_ALL_PREFIXES(SyncManagerTest, PurgeDisabledTypes); 195 FRIEND_TEST_ALL_PREFIXES(SyncManagerTest, PurgeUnappliedTypes); 196 197 struct NotificationInfo { 198 NotificationInfo(); 199 ~NotificationInfo(); 200 201 int total_count; 202 std::string payload; 203 204 // Returned pointer owned by the caller. 205 base::DictionaryValue* ToValue() const; 206 }; 207 208 base::TimeDelta GetNudgeDelayTimeDelta(const ModelType& model_type); 209 210 typedef std::map<ModelType, NotificationInfo> NotificationInfoMap; 211 212 // Determine if the parents or predecessors differ between the old and new 213 // versions of an entry. Note that a node's index may change without its 214 // UNIQUE_POSITION changing if its sibling nodes were changed. To handle such 215 // cases, we rely on the caller to treat a position update on any sibling as 216 // updating the positions of all siblings. 217 bool VisiblePositionsDiffer( 218 const syncable::EntryKernelMutation& mutation) const; 219 220 // Determine if any of the fields made visible to clients of the Sync API 221 // differ between the versions of an entry stored in |a| and |b|. A return 222 // value of false means that it should be OK to ignore this change. 223 bool VisiblePropertiesDiffer( 224 const syncable::EntryKernelMutation& mutation, 225 Cryptographer* cryptographer) const; 226 227 // Open the directory named with |username|. 228 bool OpenDirectory(const std::string& username); 229 230 // Purge those disabled types as specified by |to_purge|. |to_journal| and 231 // |to_unapply| specify subsets that require special handling. |to_journal| 232 // types are saved into the delete journal, while |to_unapply| have only 233 // their local data deleted, while their server data is preserved. 234 bool PurgeDisabledTypes(ModelTypeSet to_purge, 235 ModelTypeSet to_journal, 236 ModelTypeSet to_unapply); 237 238 void RequestNudgeForDataTypes( 239 const tracked_objects::Location& nudge_location, 240 ModelTypeSet type); 241 242 // If this is a deletion for a password, sets the legacy 243 // ExtraPasswordChangeRecordData field of |buffer|. Otherwise sets 244 // |buffer|'s specifics field to contain the unencrypted data. 245 void SetExtraChangeRecordData(int64 id, 246 ModelType type, 247 ChangeReorderBuffer* buffer, 248 Cryptographer* cryptographer, 249 const syncable::EntryKernel& original, 250 bool existed_before, 251 bool exists_now); 252 253 // Checks for server reachabilty and requests a nudge. 254 void OnNetworkConnectivityChangedImpl(); 255 256 syncable::Directory* directory(); 257 258 base::FilePath database_path_; 259 260 const std::string name_; 261 262 base::ThreadChecker thread_checker_; 263 264 // Thread-safe handle used by 265 // HandleCalculateChangesChangeEventFromSyncApi(), which can be 266 // called from any thread. Valid only between between calls to 267 // Init() and Shutdown(). 268 // 269 // TODO(akalin): Ideally, we wouldn't need to store this; instead, 270 // we'd have another worker class which implements 271 // HandleCalculateChangesChangeEventFromSyncApi() and we'd pass it a 272 // WeakHandle when we construct it. 273 WeakHandle<SyncManagerImpl> weak_handle_this_; 274 275 // We give a handle to share_ to clients of the API for use when constructing 276 // any transaction type. 277 UserShare share_; 278 279 // This can be called from any thread, but only between calls to 280 // OpenDirectory() and ShutdownOnSyncThread(). 281 WeakHandle<SyncManager::ChangeObserver> change_observer_; 282 283 ObserverList<SyncManager::Observer> observers_; 284 285 // The ServerConnectionManager used to abstract communication between the 286 // client (the Syncer) and the sync server. 287 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_; 288 289 // Maintains state that affects the way we interact with different sync types. 290 // This state changes when entering or exiting a configuration cycle. 291 scoped_ptr<ModelTypeRegistry> model_type_registry_; 292 293 // The main interface for non-blocking sync types and a thread-safe wrapper. 294 scoped_ptr<SyncContext> sync_context_; 295 scoped_ptr<SyncContextProxy> sync_context_proxy_; 296 297 // A container of various bits of information used by the SyncScheduler to 298 // create SyncSessions. Must outlive the SyncScheduler. 299 scoped_ptr<sessions::SyncSessionContext> session_context_; 300 301 // The scheduler that runs the Syncer. Needs to be explicitly 302 // Start()ed. 303 scoped_ptr<SyncScheduler> scheduler_; 304 305 // A multi-purpose status watch object that aggregates stats from various 306 // sync components. 307 AllStatus allstatus_; 308 309 // Each element of this map is a store of change records produced by 310 // HandleChangeEventFromSyncer during the CALCULATE_CHANGES step. The changes 311 // are grouped by model type, and are stored here in tree order to be 312 // forwarded to the observer slightly later, at the TRANSACTION_ENDING step 313 // by HandleTransactionEndingChangeEvent. The list is cleared after observer 314 // finishes processing. 315 typedef std::map<int, ImmutableChangeRecordList> ChangeRecordMap; 316 ChangeRecordMap change_records_; 317 318 SyncManager::ChangeDelegate* change_delegate_; 319 320 // Set to true once Init has been called. 321 bool initialized_; 322 323 bool observing_network_connectivity_changes_; 324 325 // Map used to store the notification info to be displayed in 326 // about:sync page. 327 NotificationInfoMap notification_info_map_; 328 329 // These are for interacting with chrome://sync-internals. 330 JsSyncManagerObserver js_sync_manager_observer_; 331 JsMutationEventObserver js_mutation_event_observer_; 332 JsSyncEncryptionHandlerObserver js_sync_encryption_handler_observer_; 333 334 // This is for keeping track of client events to send to the server. 335 DebugInfoEventListener debug_info_event_listener_; 336 337 ProtocolEventBuffer protocol_event_buffer_; 338 339 scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler_; 340 ReportUnrecoverableErrorFunction report_unrecoverable_error_function_; 341 342 // Sync's encryption handler. It tracks the set of encrypted types, manages 343 // changing passphrases, and in general handles sync-specific interactions 344 // with the cryptographer. 345 scoped_ptr<SyncEncryptionHandlerImpl> sync_encryption_handler_; 346 347 base::WeakPtrFactory<SyncManagerImpl> weak_ptr_factory_; 348 349 DISALLOW_COPY_AND_ASSIGN(SyncManagerImpl); 350 }; 351 352 } // namespace syncer 353 354 #endif // SYNC_INTERNAL_API_SYNC_MANAGER_H_ 355