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::Closure migration_done_callback_; 100 101 base::WeakPtrFactory<BackendMigrator> weak_ptr_factory_; 102 103 DISALLOW_COPY_AND_ASSIGN(BackendMigrator); 104 }; 105 106 } // namespace browser_sync 107 108 #endif // CHROME_BROWSER_SYNC_BACKEND_MIGRATOR_H_ 109