Home | History | Annotate | Download | only in sync
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_SYNC_BACKEND_MIGRATOR_H_
      6 #define CHROME_BROWSER_SYNC_BACKEND_MIGRATOR_H_
      7 
      8 #include "base/compiler_specific.h"
      9 #include "base/memory/weak_ptr.h"
     10 #include "base/observer_list.h"
     11 #include "chrome/browser/sync/glue/data_type_manager.h"
     12 #include "content/public/browser/notification_observer.h"
     13 #include "content/public/browser/notification_registrar.h"
     14 #include "sync/internal_api/public/base/model_type.h"
     15 
     16 class ProfileSyncService;
     17 
     18 namespace syncer {
     19 struct UserShare;
     20 }  // namespace syncer
     21 
     22 namespace browser_sync {
     23 
     24 // Interface for anything that wants to know when the migrator's state
     25 // changes.
     26 class MigrationObserver {
     27  public:
     28   virtual void OnMigrationStateChange() = 0;
     29 
     30  protected:
     31   virtual ~MigrationObserver();
     32 };
     33 
     34 // A class to perform migration of a datatype pursuant to the 'MIGRATION_DONE'
     35 // code in the sync protocol definition (protocol/sync.proto).
     36 class BackendMigrator {
     37  public:
     38   enum State {
     39     IDLE,
     40     WAITING_TO_START,   // Waiting for previous configuration to finish.
     41     DISABLING_TYPES,    // Exit criteria: SYNC_CONFIGURE_DONE for
     42                         // enabled types _excluding_ |to_migrate_| and
     43                         // empty download progress markers for types
     44                         // in |to_migrate_|.
     45     REENABLING_TYPES,   // Exit criteria: SYNC_CONFIGURE_DONE for enabled
     46                         // types.
     47   };
     48 
     49   // TODO(akalin): Remove the dependency on |user_share|.
     50   BackendMigrator(const std::string& name,
     51                   syncer::UserShare* user_share,
     52                   ProfileSyncService* service,
     53                   DataTypeManager* manager,
     54                   const base::Closure &migration_done_callback);
     55   virtual ~BackendMigrator();
     56 
     57   // Starts a sequence of events that will disable and reenable |types|.
     58   void MigrateTypes(syncer::ModelTypeSet types);
     59 
     60   void AddMigrationObserver(MigrationObserver* observer);
     61   bool HasMigrationObserver(MigrationObserver* observer) const;
     62   void RemoveMigrationObserver(MigrationObserver* observer);
     63 
     64   State state() const;
     65 
     66   // Called from ProfileSyncService to notify us of configure done.
     67   // Note: We receive these notificiations only when our state is not IDLE.
     68   void OnConfigureDone(const DataTypeManager::ConfigureResult& result);
     69 
     70   // Returns the types that are currently pending migration (if any).
     71   syncer::ModelTypeSet GetPendingMigrationTypesForTest() const;
     72 
     73  private:
     74   void ChangeState(State new_state);
     75 
     76   // Must be called only in state WAITING_TO_START.  If ready to
     77   // start, meaning the data type manager is configured, calls
     78   // RestartMigration() and returns true.  Otherwise, does nothing and
     79   // returns false.
     80   bool TryStart();
     81 
     82   // Restarts migration, interrupting any existing migration.
     83   void RestartMigration();
     84 
     85   // Called by OnConfigureDone().
     86   void OnConfigureDoneImpl(const DataTypeManager::ConfigureResult& result);
     87 
     88   const std::string name_;
     89   syncer::UserShare* user_share_;
     90   ProfileSyncService* service_;
     91   DataTypeManager* manager_;
     92 
     93   State state_;
     94 
     95   ObserverList<MigrationObserver> migration_observers_;
     96 
     97   syncer::ModelTypeSet to_migrate_;
     98 
     99   base::WeakPtrFactory<BackendMigrator> weak_ptr_factory_;
    100 
    101   base::Closure migration_done_callback_;
    102 
    103   DISALLOW_COPY_AND_ASSIGN(BackendMigrator);
    104 };
    105 
    106 }  // namespace browser_sync
    107 
    108 #endif  // CHROME_BROWSER_SYNC_BACKEND_MIGRATOR_H_
    109