Home | History | Annotate | Download | only in internal_api
      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/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"
     31 
     32 namespace syncer {
     33 
     34 class SyncAPIServerConnectionManager;
     35 class WriteNode;
     36 class WriteTransaction;
     37 
     38 namespace sessions {
     39 class SyncSessionContext;
     40 }
     41 
     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.
     47 //
     48 // Unless stated otherwise, all methods of SyncManager should be called on the
     49 // same thread.
     50 class SYNC_EXPORT_PRIVATE SyncManagerImpl :
     51     public SyncManager,
     52     public net::NetworkChangeNotifier::IPAddressObserver,
     53     public net::NetworkChangeNotifier::ConnectionTypeObserver,
     54     public JsBackend,
     55     public SyncEngineEventListener,
     56     public ServerConnectionEventListener,
     57     public syncable::DirectoryChangeDelegate,
     58     public SyncEncryptionHandler::Observer {
     59  public:
     60   // Create an uninitialized SyncManager.  Callers must Init() before using.
     61   explicit SyncManagerImpl(const std::string& name);
     62   virtual ~SyncManagerImpl();
     63 
     64   // SyncManager implementation.
     65   virtual void Init(
     66       const base::FilePath& database_location,
     67       const WeakHandle<JsEventHandler>& event_handler,
     68       const std::string& sync_server_and_path,
     69       int sync_server_port,
     70       bool use_ssl,
     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,
     80       Encryptor* encryptor,
     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;
    115 
    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(
    131       PassphraseType type,
    132       base::Time explicit_passphrase_time) OVERRIDE;
    133 
    134   static int GetDefaultNudgeDelay();
    135   static int GetPreferencesNudgeDelay();
    136 
    137   // SyncEngineEventListener implementation.
    138   virtual void OnSyncEngineEvent(const SyncEngineEvent& event) OVERRIDE;
    139 
    140   // ServerConnectionEventListener implementation.
    141   virtual void OnServerConnectionEvent(
    142       const ServerConnectionEvent& event) OVERRIDE;
    143 
    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;
    150 
    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;
    168 
    169   // Handle explicit requests to fetch updates for the given types.
    170   virtual void RefreshTypes(ModelTypeSet types) OVERRIDE;
    171 
    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;
    178 
    179   const SyncScheduler* scheduler() const;
    180 
    181   bool GetHasInvalidAuthTokenForTest() const;
    182 
    183  protected:
    184   // Helper functions.  Virtual for testing.
    185   virtual void NotifyInitializationSuccess();
    186   virtual void NotifyInitializationFailure();
    187 
    188  private:
    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);
    195 
    196   struct NotificationInfo {
    197     NotificationInfo();
    198     ~NotificationInfo();
    199 
    200     int total_count;
    201     std::string payload;
    202 
    203     // Returned pointer owned by the caller.
    204     base::DictionaryValue* ToValue() const;
    205   };
    206 
    207   base::TimeDelta GetNudgeDelayTimeDelta(const ModelType& model_type);
    208 
    209   typedef std::map<ModelType, NotificationInfo> NotificationInfoMap;
    210   typedef JsArgList (SyncManagerImpl::*UnboundJsMessageHandler)(
    211       const JsArgList&);
    212   typedef base::Callback<JsArgList(const JsArgList&)> JsMessageHandler;
    213   typedef std::map<std::string, JsMessageHandler> JsMessageHandlerMap;
    214 
    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;
    222 
    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;
    229 
    230   // Open the directory named with |username|.
    231   bool OpenDirectory(const std::string& username);
    232 
    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);
    240 
    241   void RequestNudgeForDataTypes(
    242       const tracked_objects::Location& nudge_location,
    243       ModelTypeSet type);
    244 
    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,
    249                                 ModelType type,
    250                                 ChangeReorderBuffer* buffer,
    251                                 Cryptographer* cryptographer,
    252                                 const syncable::EntryKernel& original,
    253                                 bool existed_before,
    254                                 bool exists_now);
    255 
    256   // Called for every notification. This updates the notification statistics
    257   // to be displayed in about:sync.
    258   void UpdateNotificationInfo(const ObjectIdInvalidationMap& invalidation_map);
    259 
    260   // Checks for server reachabilty and requests a nudge.
    261   void OnNetworkConnectivityChangedImpl();
    262 
    263   // Helper function used only by the constructor.
    264   void BindJsMessageHandler(
    265     const std::string& name, UnboundJsMessageHandler unbound_message_handler);
    266 
    267   // Returned pointer is owned by the caller.
    268   static base::DictionaryValue* NotificationInfoToValue(
    269       const NotificationInfoMap& notification_info);
    270 
    271   static std::string NotificationInfoToString(
    272       const NotificationInfoMap& notification_info);
    273 
    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);
    283 
    284   syncable::Directory* directory();
    285 
    286   base::FilePath database_path_;
    287 
    288   const std::string name_;
    289 
    290   base::ThreadChecker thread_checker_;
    291 
    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().
    296   //
    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_;
    302 
    303   // We give a handle to share_ to clients of the API for use when constructing
    304   // any transaction type.
    305   UserShare share_;
    306 
    307   // This can be called from any thread, but only between calls to
    308   // OpenDirectory() and ShutdownOnSyncThread().
    309   WeakHandle<SyncManager::ChangeObserver> change_observer_;
    310 
    311   ObserverList<SyncManager::Observer> observers_;
    312 
    313   // The ServerConnectionManager used to abstract communication between the
    314   // client (the Syncer) and the sync server.
    315   scoped_ptr<SyncAPIServerConnectionManager> connection_manager_;
    316 
    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_;
    320 
    321   // The scheduler that runs the Syncer. Needs to be explicitly
    322   // Start()ed.
    323   scoped_ptr<SyncScheduler> scheduler_;
    324 
    325   // A multi-purpose status watch object that aggregates stats from various
    326   // sync components.
    327   AllStatus allstatus_;
    328 
    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_;
    337 
    338   SyncManager::ChangeDelegate* change_delegate_;
    339 
    340   // Set to true once Init has been called.
    341   bool initialized_;
    342 
    343   bool observing_network_connectivity_changes_;
    344 
    345   InvalidatorState invalidator_state_;
    346 
    347   // Map used to store the notification info to be displayed in
    348   // about:sync page.
    349   NotificationInfoMap notification_info_map_;
    350 
    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_;
    357 
    358   // This is for keeping track of client events to send to the server.
    359   DebugInfoEventListener debug_info_event_listener_;
    360 
    361   TrafficRecorder traffic_recorder_;
    362 
    363   Encryptor* encryptor_;
    364   scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler_;
    365   ReportUnrecoverableErrorFunction report_unrecoverable_error_function_;
    366 
    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_;
    371 
    372   base::WeakPtrFactory<SyncManagerImpl> weak_ptr_factory_;
    373 
    374   DISALLOW_COPY_AND_ASSIGN(SyncManagerImpl);
    375 };
    376 
    377 }  // namespace syncer
    378 
    379 #endif  // SYNC_INTERNAL_API_SYNC_MANAGER_H_
    380