15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 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) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef COMPONENTS_SYNC_DRIVER_BACKEND_DATA_TYPE_CONFIGURER_H_ 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define COMPONENTS_SYNC_DRIVER_BACKEND_DATA_TYPE_CONFIGURER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/configure_reason.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "sync/internal_api/public/engine/model_safe_worker.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace sync_driver { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class ChangeProcessor; 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The DataTypeConfigurer interface abstracts out the action of 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// configuring a set of new data types and cleaning up after a set of 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// removed data types. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BackendDataTypeConfigurer { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum DataTypeConfigState { 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CONFIGURE_ACTIVE, // Actively being configured. Data of such types 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // will be downloaded if not present locally. 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CONFIGURE_INACTIVE, // Already configured or to be configured in future. 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Data of such types is left as it is, no 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // downloading or purging. 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CONFIGURE_CLEAN, // Actively being configured but requiring unapply 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // and GetUpdates first (e.g. for persistence errors). 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISABLED, // Not syncing. Disabled by user. 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FATAL, // Not syncing due to unrecoverable error. 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CRYPTO, // Not syncing due to a cryptographer error. 356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) UNREADY, // Not syncing due to transient error. 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<syncer::ModelType, DataTypeConfigState> 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DataTypeConfigStateMap; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Configures sync for data types in config_state_map according to the states. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |ready_task| is called on the same thread as ConfigureDataTypes 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is called when configuration is done with the set of data types 43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // that succeeded/failed configuration (i.e., configuration succeeded iff 44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // the failed set is empty). 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(akalin): Use a Delegate class with 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnConfigureSuccess/OnConfigureFailure/OnConfigureRetry instead of 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a pair of callbacks. The awkward part is handling when 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SyncBackendHost calls ConfigureDataTypes on itself to configure 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nigori. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ConfigureDataTypes( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ConfigureReason reason, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DataTypeConfigStateMap& config_state_map, 54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const base::Callback<void(syncer::ModelTypeSet, 55b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) syncer::ModelTypeSet)>& ready_task, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Callback<void()>& retry_callback) = 0; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Return model types in |state_map| that match |state|. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static syncer::ModelTypeSet GetDataTypesInState( 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DataTypeConfigState state, const DataTypeConfigStateMap& state_map); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Activates change processing for the given data type. This must 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // be called synchronously with the data type's model association so 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // no changes are dropped between model association and change 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // processor activation. 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void ActivateDataType( 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) syncer::ModelType type, syncer::ModelSafeGroup group, 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ChangeProcessor* change_processor) = 0; 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Deactivates change processing for the given data type. 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void DeactivateDataType(syncer::ModelType type) = 0; 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set state of |types| in |state_map| to |state|. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void SetDataTypesState(DataTypeConfigState state, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::ModelTypeSet types, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DataTypeConfigStateMap* state_map); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BackendDataTypeConfigurer() {} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace sync_driver 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // COMPONENTS_SYNC_DRIVER_BACKEND_DATA_TYPE_CONFIGURER_H_ 85