1// Copyright 2014 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 COMPONENTS_SYNC_DRIVER_DATA_TYPE_MANAGER_H__
6#define COMPONENTS_SYNC_DRIVER_DATA_TYPE_MANAGER_H__
7
8#include <list>
9#include <set>
10#include <string>
11
12#include "components/sync_driver/data_type_controller.h"
13#include "components/sync_driver/data_type_status_table.h"
14#include "sync/api/sync_error.h"
15#include "sync/internal_api/public/base/model_type.h"
16#include "sync/internal_api/public/configure_reason.h"
17
18namespace sync_driver {
19
20// This interface is for managing the start up and shut down life cycle
21// of many different syncable data types.
22class DataTypeManager {
23 public:
24  enum State {
25    STOPPED,           // No data types are currently running.
26    DOWNLOAD_PENDING,  // Not implemented yet: Waiting for the syncer to
27                       // complete the initial download of new data
28                       // types.
29
30    CONFIGURING,       // Data types are being started.
31    RETRYING,          // Retrying a pending reconfiguration.
32
33    CONFIGURED,        // All enabled data types are running.
34    STOPPING           // Data types are being stopped.
35  };
36
37  // Update NotifyDone() in data_type_manager_impl.cc if you update
38  // this.
39  enum ConfigureStatus {
40    UNKNOWN = -1,
41    OK,                  // Configuration finished some or all types.
42    ABORTED,             // Start was aborted by calling Stop() before
43                         // all types were started.
44    UNRECOVERABLE_ERROR  // We got an unrecoverable error during startup.
45  };
46
47  // Note: |errors| is only filled when status is not OK.
48  struct ConfigureResult {
49    ConfigureResult();
50    ConfigureResult(ConfigureStatus status,
51                    syncer::ModelTypeSet requested_types);
52    ~ConfigureResult();
53
54    ConfigureStatus status;
55    syncer::ModelTypeSet requested_types;
56    DataTypeStatusTable data_type_status_table;
57  };
58
59  virtual ~DataTypeManager() {}
60
61  // Convert a ConfigureStatus to string for debug purposes.
62  static std::string ConfigureStatusToString(ConfigureStatus status);
63
64  // Begins asynchronous configuration of data types.  Any currently
65  // running data types that are not in the desired_types set will be
66  // stopped.  Any stopped data types that are in the desired_types
67  // set will be started.  All other data types are left in their
68  // current state.  A SYNC_CONFIGURE_START notification will be sent
69  // to the UI thread when configuration is started and a
70  // SYNC_CONFIGURE_DONE notification will be sent (with a
71  // ConfigureResult detail) when configuration is complete.
72  //
73  // Note that you may call Configure() while configuration is in
74  // progress.  Configuration will be complete only when the
75  // desired_types supplied in the last call to Configure is achieved.
76  virtual void Configure(syncer::ModelTypeSet desired_types,
77                         syncer::ConfigureReason reason) = 0;
78
79  // Resets the error state for |type| and triggers a reconfiguration if
80  // necessary.
81  virtual void ReenableType(syncer::ModelType type) = 0;
82
83  // Resets all data type error state.
84  virtual void ResetDataTypeErrors() = 0;
85
86  virtual void PurgeForMigration(syncer::ModelTypeSet undesired_types,
87                                 syncer::ConfigureReason reason) = 0;
88
89  // Synchronously stops all registered data types.  If called after
90  // Configure() is called but before it finishes, it will abort the
91  // configure and any data types that have been started will be
92  // stopped.
93  virtual void Stop() = 0;
94
95  // The current state of the data type manager.
96  virtual State state() const = 0;
97};
98
99}  // namespace sync_driver
100
101#endif  // COMPONENTS_SYNC_DRIVER_DATA_TYPE_MANAGER_H__
102