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 "components/sync_driver/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 16class ProfileSyncService; 17 18namespace syncer { 19struct UserShare; 20} // namespace syncer 21 22namespace browser_sync { 23 24// Interface for anything that wants to know when the migrator's state 25// changes. 26class 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). 36class 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 sync_driver::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( 69 const sync_driver::DataTypeManager::ConfigureResult& result); 70 71 // Returns the types that are currently pending migration (if any). 72 syncer::ModelTypeSet GetPendingMigrationTypesForTest() const; 73 74 private: 75 void ChangeState(State new_state); 76 77 // Must be called only in state WAITING_TO_START. If ready to 78 // start, meaning the data type manager is configured, calls 79 // RestartMigration() and returns true. Otherwise, does nothing and 80 // returns false. 81 bool TryStart(); 82 83 // Restarts migration, interrupting any existing migration. 84 void RestartMigration(); 85 86 // Called by OnConfigureDone(). 87 void OnConfigureDoneImpl( 88 const sync_driver::DataTypeManager::ConfigureResult& result); 89 90 const std::string name_; 91 syncer::UserShare* user_share_; 92 ProfileSyncService* service_; 93 sync_driver::DataTypeManager* manager_; 94 95 State state_; 96 97 ObserverList<MigrationObserver> migration_observers_; 98 99 syncer::ModelTypeSet to_migrate_; 100 101 base::Closure migration_done_callback_; 102 103 base::WeakPtrFactory<BackendMigrator> weak_ptr_factory_; 104 105 DISALLOW_COPY_AND_ASSIGN(BackendMigrator); 106}; 107 108} // namespace browser_sync 109 110#endif // CHROME_BROWSER_SYNC_BACKEND_MIGRATOR_H_ 111