1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_SYNC_GLUE_DATA_TYPE_MANAGER_H__
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SYNC_GLUE_DATA_TYPE_MANAGER_H__
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/task.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/glue/data_type_controller.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/syncable/model_type.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This interface is for managing the start up and shut down life cycle
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of many different syncable data types.
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DataTypeManager {
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum State {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STOPPED,           // No data types are currently running.
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DOWNLOAD_PENDING,  // Not implemented yet: Waiting for the syncer to
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       // complete the initial download of new data
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       // types.
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CONFIGURING,       // Data types are being started.
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    BLOCKED,           // We can't move forward with configuration because some
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       // external action must take place (i.e. passphrase).
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CONFIGURED,        // All enabled data types are running.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    STOPPING           // Data types are being stopped.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum ConfigureResult {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OK,                  // Configuration finished without error.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSOCIATION_FAILED,  // An error occurred during model association.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ABORTED,             // Start was aborted by calling Stop() before
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         // all types were started.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UNRECOVERABLE_ERROR  // A data type experienced an unrecoverable error
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         // during startup.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::set<syncable::ModelType> TypeSet;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // In case of an error the location is filled with the location the
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // error originated from. In case of a success the error location value
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // is to be not used.
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(tim): We should rename this / ConfigureResult to something more
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // flexible like SyncConfigureDoneDetails.
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  struct ConfigureResultWithErrorLocation {
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ConfigureResult result;
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TypeSet requested_types;
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<tracked_objects::Location> location;
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ConfigureResultWithErrorLocation();
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ConfigureResultWithErrorLocation(const ConfigureResult& result,
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const tracked_objects::Location& location,
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const TypeSet& requested_types)
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        : result(result),
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          requested_types(requested_types) {
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      this->location.reset(new tracked_objects::Location(
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          location.function_name(),
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          location.file_name(),
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          location.line_number()));
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ~ConfigureResultWithErrorLocation();
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~DataTypeManager() {}
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Begins asynchronous configuration of data types.  Any currently
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // running data types that are not in the desired_types set will be
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // stopped.  Any stopped data types that are in the desired_types
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // set will be started.  All other data types are left in their
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // current state.  A SYNC_CONFIGURE_START notification will be sent
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to the UI thread when configuration is started and a
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // SYNC_CONFIGURE_DONE notification will be sent (with a
8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // ConfigureResult detail) when configuration is complete.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Note that you may call Configure() while configuration is in
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // progress.  Configuration will be complete only when the
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // desired_types supplied in the last call to Configure is achieved.
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Configure(const TypeSet& desired_types) = 0;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Synchronously stops all registered data types.  If called after
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Configure() is called but before it finishes, it will abort the
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // configure and any data types that have been started will be
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // stopped.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Stop() = 0;
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reference to map of data type controllers.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const DataTypeController::TypeMap& controllers() = 0;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The current state of the data type manager.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual State state() = 0;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace browser_sync
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_SYNC_GLUE_DATA_TYPE_MANAGER_H__
105