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