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.
5 #ifndef SYNC_INTERNAL_API_SYNC_MANAGER_H_
6 #define SYNC_INTERNAL_API_SYNC_MANAGER_H_
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/sync_engine_event.h"
16 #include "sync/engine/traffic_recorder.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/public/sync_manager.h"
23 #include "sync/internal_api/public/user_share.h"
24 #include "sync/internal_api/sync_encryption_handler_impl.h"
25 #include "sync/js/js_backend.h"
26 #include "sync/notifier/invalidation_handler.h"
27 #include "sync/notifier/invalidator_state.h"
28 #include "sync/syncable/directory_change_delegate.h"
29 #include "sync/util/cryptographer.h"
30 #include "sync/util/time.h"
34 class SyncAPIServerConnectionManager;
36 class WriteTransaction;
39 class SyncSessionContext;
42 // SyncManager encapsulates syncable::Directory and serves as the parent of all
43 // other objects in the sync API. If multiple threads interact with the same
44 // local sync repository (i.e. the same sqlite database), they should share a
45 // single SyncManager instance. The caller should typically create one
46 // SyncManager for the lifetime of a user session.
48 // Unless stated otherwise, all methods of SyncManager should be called on the
50 class SYNC_EXPORT_PRIVATE SyncManagerImpl :
52 public net::NetworkChangeNotifier::IPAddressObserver,
53 public net::NetworkChangeNotifier::ConnectionTypeObserver,
55 public SyncEngineEventListener,
56 public ServerConnectionEventListener,
57 public syncable::DirectoryChangeDelegate,
58 public SyncEncryptionHandler::Observer {
60 // Create an uninitialized SyncManager. Callers must Init() before using.
61 explicit SyncManagerImpl(const std::string& name);
62 virtual ~SyncManagerImpl();
64 // SyncManager implementation.
66 const base::FilePath& database_location,
67 const WeakHandle<JsEventHandler>& event_handler,
68 const std::string& sync_server_and_path,
71 scoped_ptr<HttpPostProviderFactory> post_factory,
72 const std::vector<ModelSafeWorker*>& workers,
73 ExtensionsActivity* extensions_activity,
74 SyncManager::ChangeDelegate* change_delegate,
75 const SyncCredentials& credentials,
76 const std::string& invalidator_client_id,
77 const std::string& restored_key_for_bootstrapping,
78 const std::string& restored_keystore_key_for_bootstrapping,
79 InternalComponentsFactory* internal_components_factory,
81 scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler,
82 ReportUnrecoverableErrorFunction
83 report_unrecoverable_error_function,
84 CancelationSignal* cancelation_signal) OVERRIDE;
85 virtual void ThrowUnrecoverableError() OVERRIDE;
86 virtual ModelTypeSet InitialSyncEndedTypes() OVERRIDE;
87 virtual ModelTypeSet GetTypesWithEmptyProgressMarkerToken(
88 ModelTypeSet types) OVERRIDE;
89 virtual bool PurgePartiallySyncedTypes() OVERRIDE;
90 virtual void UpdateCredentials(const SyncCredentials& credentials) OVERRIDE;
91 virtual void StartSyncingNormally(
92 const ModelSafeRoutingInfo& routing_info) OVERRIDE;
93 virtual void ConfigureSyncer(
94 ConfigureReason reason,
95 ModelTypeSet to_download,
96 ModelTypeSet to_purge,
97 ModelTypeSet to_journal,
98 ModelTypeSet to_unapply,
99 const ModelSafeRoutingInfo& new_routing_info,
100 const base::Closure& ready_task,
101 const base::Closure& retry_task) OVERRIDE;
102 virtual void OnInvalidatorStateChange(InvalidatorState state) OVERRIDE;
103 virtual void OnIncomingInvalidation(
104 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE;
105 virtual void AddObserver(SyncManager::Observer* observer) OVERRIDE;
106 virtual void RemoveObserver(SyncManager::Observer* observer) OVERRIDE;
107 virtual SyncStatus GetDetailedStatus() const OVERRIDE;
108 virtual void SaveChanges() OVERRIDE;
109 virtual void ShutdownOnSyncThread() OVERRIDE;
110 virtual UserShare* GetUserShare() OVERRIDE;
111 virtual const std::string cache_guid() OVERRIDE;
112 virtual bool ReceivedExperiment(Experiments* experiments) OVERRIDE;
113 virtual bool HasUnsyncedItems() OVERRIDE;
114 virtual SyncEncryptionHandler* GetEncryptionHandler() OVERRIDE;
116 // SyncEncryptionHandler::Observer implementation.
117 virtual void OnPassphraseRequired(
118 PassphraseRequiredReason reason,
119 const sync_pb::EncryptedData& pending_keys) OVERRIDE;
120 virtual void OnPassphraseAccepted() OVERRIDE;
121 virtual void OnBootstrapTokenUpdated(
122 const std::string& bootstrap_token,
123 BootstrapTokenType type) OVERRIDE;
124 virtual void OnEncryptedTypesChanged(
125 ModelTypeSet encrypted_types,
126 bool encrypt_everything) OVERRIDE;
127 virtual void OnEncryptionComplete() OVERRIDE;
128 virtual void OnCryptographerStateChanged(
129 Cryptographer* cryptographer) OVERRIDE;
130 virtual void OnPassphraseTypeChanged(
132 base::Time explicit_passphrase_time) OVERRIDE;
134 static int GetDefaultNudgeDelay();
135 static int GetPreferencesNudgeDelay();
137 // SyncEngineEventListener implementation.
138 virtual void OnSyncEngineEvent(const SyncEngineEvent& event) OVERRIDE;
140 // ServerConnectionEventListener implementation.
141 virtual void OnServerConnectionEvent(
142 const ServerConnectionEvent& event) OVERRIDE;
144 // JsBackend implementation.
145 virtual void SetJsEventHandler(
146 const WeakHandle<JsEventHandler>& event_handler) OVERRIDE;
147 virtual void ProcessJsMessage(
148 const std::string& name, const JsArgList& args,
149 const WeakHandle<JsReplyHandler>& reply_handler) OVERRIDE;
151 // DirectoryChangeDelegate implementation.
152 // This listener is called upon completion of a syncable transaction, and
153 // builds the list of sync-engine initiated changes that will be forwarded to
154 // the SyncManager's Observers.
155 virtual void HandleTransactionCompleteChangeEvent(
156 ModelTypeSet models_with_changes) OVERRIDE;
157 virtual ModelTypeSet HandleTransactionEndingChangeEvent(
158 const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
159 syncable::BaseTransaction* trans) OVERRIDE;
160 virtual void HandleCalculateChangesChangeEventFromSyncApi(
161 const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
162 syncable::BaseTransaction* trans,
163 std::vector<int64>* entries_changed) OVERRIDE;
164 virtual void HandleCalculateChangesChangeEventFromSyncer(
165 const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
166 syncable::BaseTransaction* trans,
167 std::vector<int64>* entries_changed) OVERRIDE;
169 // Handle explicit requests to fetch updates for the given types.
170 virtual void RefreshTypes(ModelTypeSet types) OVERRIDE;
172 // These OnYYYChanged() methods are only called by our NetworkChangeNotifier.
173 // Called when IP address of primary interface changes.
174 virtual void OnIPAddressChanged() OVERRIDE;
175 // Called when the connection type of the system has changed.
176 virtual void OnConnectionTypeChanged(
177 net::NetworkChangeNotifier::ConnectionType) OVERRIDE;
179 const SyncScheduler* scheduler() const;
181 bool GetHasInvalidAuthTokenForTest() const;
184 // Helper functions. Virtual for testing.
185 virtual void NotifyInitializationSuccess();
186 virtual void NotifyInitializationFailure();
189 friend class SyncManagerTest;
190 FRIEND_TEST_ALL_PREFIXES(SyncManagerTest, NudgeDelayTest);
191 FRIEND_TEST_ALL_PREFIXES(SyncManagerTest, OnNotificationStateChange);
192 FRIEND_TEST_ALL_PREFIXES(SyncManagerTest, OnIncomingNotification);
193 FRIEND_TEST_ALL_PREFIXES(SyncManagerTest, PurgeDisabledTypes);
194 FRIEND_TEST_ALL_PREFIXES(SyncManagerTest, PurgeUnappliedTypes);
196 struct NotificationInfo {
203 // Returned pointer owned by the caller.
204 base::DictionaryValue* ToValue() const;
207 base::TimeDelta GetNudgeDelayTimeDelta(const ModelType& model_type);
209 typedef std::map<ModelType, NotificationInfo> NotificationInfoMap;
210 typedef JsArgList (SyncManagerImpl::*UnboundJsMessageHandler)(
212 typedef base::Callback<JsArgList(const JsArgList&)> JsMessageHandler;
213 typedef std::map<std::string, JsMessageHandler> JsMessageHandlerMap;
215 // Determine if the parents or predecessors differ between the old and new
216 // versions of an entry. Note that a node's index may change without its
217 // UNIQUE_POSITION changing if its sibling nodes were changed. To handle such
218 // cases, we rely on the caller to treat a position update on any sibling as
219 // updating the positions of all siblings.
220 bool VisiblePositionsDiffer(
221 const syncable::EntryKernelMutation& mutation) const;
223 // Determine if any of the fields made visible to clients of the Sync API
224 // differ between the versions of an entry stored in |a| and |b|. A return
225 // value of false means that it should be OK to ignore this change.
226 bool VisiblePropertiesDiffer(
227 const syncable::EntryKernelMutation& mutation,
228 Cryptographer* cryptographer) const;
230 // Open the directory named with |username|.
231 bool OpenDirectory(const std::string& username);
233 // Purge those disabled types as specified by |to_purge|. |to_journal| and
234 // |to_unapply| specify subsets that require special handling. |to_journal|
235 // types are saved into the delete journal, while |to_unapply| have only
236 // their local data deleted, while their server data is preserved.
237 bool PurgeDisabledTypes(ModelTypeSet to_purge,
238 ModelTypeSet to_journal,
239 ModelTypeSet to_unapply);
241 void RequestNudgeForDataTypes(
242 const tracked_objects::Location& nudge_location,
245 // If this is a deletion for a password, sets the legacy
246 // ExtraPasswordChangeRecordData field of |buffer|. Otherwise sets
247 // |buffer|'s specifics field to contain the unencrypted data.
248 void SetExtraChangeRecordData(int64 id,
250 ChangeReorderBuffer* buffer,
251 Cryptographer* cryptographer,
252 const syncable::EntryKernel& original,
256 // Called for every notification. This updates the notification statistics
257 // to be displayed in about:sync.
258 void UpdateNotificationInfo(const ObjectIdInvalidationMap& invalidation_map);
260 // Checks for server reachabilty and requests a nudge.
261 void OnNetworkConnectivityChangedImpl();
263 // Helper function used only by the constructor.
264 void BindJsMessageHandler(
265 const std::string& name, UnboundJsMessageHandler unbound_message_handler);
267 // Returned pointer is owned by the caller.
268 static base::DictionaryValue* NotificationInfoToValue(
269 const NotificationInfoMap& notification_info);
271 static std::string NotificationInfoToString(
272 const NotificationInfoMap& notification_info);
274 // JS message handlers.
275 JsArgList GetNotificationState(const JsArgList& args);
276 JsArgList GetNotificationInfo(const JsArgList& args);
277 JsArgList GetRootNodeDetails(const JsArgList& args);
278 JsArgList GetAllNodes(const JsArgList& args);
279 JsArgList GetNodeSummariesById(const JsArgList& args);
280 JsArgList GetNodeDetailsById(const JsArgList& args);
281 JsArgList GetChildNodeIds(const JsArgList& args);
282 JsArgList GetClientServerTraffic(const JsArgList& args);
284 syncable::Directory* directory();
286 base::FilePath database_path_;
288 const std::string name_;
290 base::ThreadChecker thread_checker_;
292 // Thread-safe handle used by
293 // HandleCalculateChangesChangeEventFromSyncApi(), which can be
294 // called from any thread. Valid only between between calls to
295 // Init() and Shutdown().
297 // TODO(akalin): Ideally, we wouldn't need to store this; instead,
298 // we'd have another worker class which implements
299 // HandleCalculateChangesChangeEventFromSyncApi() and we'd pass it a
300 // WeakHandle when we construct it.
301 WeakHandle<SyncManagerImpl> weak_handle_this_;
303 // We give a handle to share_ to clients of the API for use when constructing
304 // any transaction type.
307 // This can be called from any thread, but only between calls to
308 // OpenDirectory() and ShutdownOnSyncThread().
309 WeakHandle<SyncManager::ChangeObserver> change_observer_;
311 ObserverList<SyncManager::Observer> observers_;
313 // The ServerConnectionManager used to abstract communication between the
314 // client (the Syncer) and the sync server.
315 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_;
317 // A container of various bits of information used by the SyncScheduler to
318 // create SyncSessions. Must outlive the SyncScheduler.
319 scoped_ptr<sessions::SyncSessionContext> session_context_;
321 // The scheduler that runs the Syncer. Needs to be explicitly
323 scoped_ptr<SyncScheduler> scheduler_;
325 // A multi-purpose status watch object that aggregates stats from various
327 AllStatus allstatus_;
329 // Each element of this map is a store of change records produced by
330 // HandleChangeEventFromSyncer during the CALCULATE_CHANGES step. The changes
331 // are grouped by model type, and are stored here in tree order to be
332 // forwarded to the observer slightly later, at the TRANSACTION_ENDING step
333 // by HandleTransactionEndingChangeEvent. The list is cleared after observer
334 // finishes processing.
335 typedef std::map<int, ImmutableChangeRecordList> ChangeRecordMap;
336 ChangeRecordMap change_records_;
338 SyncManager::ChangeDelegate* change_delegate_;
340 // Set to true once Init has been called.
343 bool observing_network_connectivity_changes_;
345 InvalidatorState invalidator_state_;
347 // Map used to store the notification info to be displayed in
349 NotificationInfoMap notification_info_map_;
351 // These are for interacting with chrome://sync-internals.
352 JsMessageHandlerMap js_message_handlers_;
353 WeakHandle<JsEventHandler> js_event_handler_;
354 JsSyncManagerObserver js_sync_manager_observer_;
355 JsMutationEventObserver js_mutation_event_observer_;
356 JsSyncEncryptionHandlerObserver js_sync_encryption_handler_observer_;
358 // This is for keeping track of client events to send to the server.
359 DebugInfoEventListener debug_info_event_listener_;
361 TrafficRecorder traffic_recorder_;
363 Encryptor* encryptor_;
364 scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler_;
365 ReportUnrecoverableErrorFunction report_unrecoverable_error_function_;
367 // Sync's encryption handler. It tracks the set of encrypted types, manages
368 // changing passphrases, and in general handles sync-specific interactions
369 // with the cryptographer.
370 scoped_ptr<SyncEncryptionHandlerImpl> sync_encryption_handler_;
372 base::WeakPtrFactory<SyncManagerImpl> weak_ptr_factory_;
374 DISALLOW_COPY_AND_ASSIGN(SyncManagerImpl);
377 } // namespace syncer
379 #endif // SYNC_INTERNAL_API_SYNC_MANAGER_H_