#ifndef COMPONENTS_SYNC_DRIVER_BACKEND_MIGRATOR_H_
#define COMPONENTS_SYNC_DRIVER_BACKEND_MIGRATOR_H_
#include <string>
#include "base/compiler_specific.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "components/sync/base/model_type.h"
#include "components/sync/driver/data_type_manager.h"
namespace syncer {
class MigrationObserver {
public:
virtual void OnMigrationStateChange() = 0;
protected:
virtual ~MigrationObserver();
};
class BackendMigrator {
public:
enum State {
IDLE,
WAITING_TO_START,
DISABLING_TYPES,
REENABLING_TYPES,
};
BackendMigrator(const std::string& name,
DataTypeManager* manager,
const base::RepeatingClosure& reconfigure_callback,
const base::RepeatingClosure& migration_done_callback);
BackendMigrator(const BackendMigrator&) = delete;
BackendMigrator& operator=(const BackendMigrator&) = delete;
virtual ~BackendMigrator();
void MigrateTypes(ModelTypeSet types);
void AddMigrationObserver(MigrationObserver* observer);
void RemoveMigrationObserver(MigrationObserver* observer);
State state() const;
void OnConfigureDone(const DataTypeManager::ConfigureResult& result);
ModelTypeSet GetPendingMigrationTypesForTest() const;
private:
void ChangeState(State new_state);
bool TryStart();
void RestartMigration();
void OnConfigureDoneImpl(const DataTypeManager::ConfigureResult& result);
const std::string name_;
raw_ptr<DataTypeManager, DanglingUntriaged> manager_;
const base::RepeatingClosure reconfigure_callback_;
const base::RepeatingClosure migration_done_callback_;
State state_;
base::ObserverList<MigrationObserver>::Unchecked migration_observers_;
ModelTypeSet to_migrate_;
base::WeakPtrFactory<BackendMigrator> weak_ptr_factory_{this};
};
}
#endif