15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_BACKEND_MIGRATOR_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SYNC_BACKEND_MIGRATOR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/data_type_manager.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncService; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct UserShare; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Interface for anything that wants to know when the migrator's state 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// changes. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MigrationObserver { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMigrationStateChange() = 0; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MigrationObserver(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class to perform migration of a datatype pursuant to the 'MIGRATION_DONE' 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// code in the sync protocol definition (protocol/sync.proto). 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BackendMigrator { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum State { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDLE, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WAITING_TO_START, // Waiting for previous configuration to finish. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLING_TYPES, // Exit criteria: SYNC_CONFIGURE_DONE for 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enabled types _excluding_ |to_migrate_| and 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // empty download progress markers for types 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in |to_migrate_|. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REENABLING_TYPES, // Exit criteria: SYNC_CONFIGURE_DONE for enabled 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // types. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(akalin): Remove the dependency on |user_share|. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendMigrator(const std::string& name, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::UserShare* user_share, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncService* service, 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_driver::DataTypeManager* manager, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure &migration_done_callback); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BackendMigrator(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts a sequence of events that will disable and reenable |types|. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MigrateTypes(syncer::ModelTypeSet types); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddMigrationObserver(MigrationObserver* observer); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasMigrationObserver(MigrationObserver* observer) const; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveMigrationObserver(MigrationObserver* observer); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state() const; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called from ProfileSyncService to notify us of configure done. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: We receive these notificiations only when our state is not IDLE. 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnConfigureDone( 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const sync_driver::DataTypeManager::ConfigureResult& result); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the types that are currently pending migration (if any). 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet GetPendingMigrationTypesForTest() const; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ChangeState(State new_state); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called only in state WAITING_TO_START. If ready to 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // start, meaning the data type manager is configured, calls 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RestartMigration() and returns true. Otherwise, does nothing and 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returns false. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool TryStart(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restarts migration, interrupting any existing migration. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RestartMigration(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by OnConfigureDone(). 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnConfigureDoneImpl( 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const sync_driver::DataTypeManager::ConfigureResult& result); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string name_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::UserShare* user_share_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncService* service_; 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_driver::DataTypeManager* manager_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<MigrationObserver> migration_observers_; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet to_migrate_; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure migration_done_callback_; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::WeakPtrFactory<BackendMigrator> weak_ptr_factory_; 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BackendMigrator); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace browser_sync 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_SYNC_BACKEND_MIGRATOR_H_ 111