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_IMPL_H__
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SYNC_GLUE_DATA_TYPE_MANAGER_IMPL_H__
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/glue/data_type_manager.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/task.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DataTypeController;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SyncBackendHost;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass DataTypeManagerImpl : public DataTypeManager {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DataTypeManagerImpl(SyncBackendHost* backend,
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const DataTypeController::TypeMap& controllers);
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~DataTypeManagerImpl();
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // DataTypeManager interface.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Configure(const TypeSet& desired_types);
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Stop();
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const DataTypeController::TypeMap& controllers();
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual State state();
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Starts the next data type in the kStartOrder list, indicated by
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the current_type_ member.  If there are no more data types to
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // start, the stashed start_callback_ is invoked.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartNextType();
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Callback passed to each data type controller on startup.
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void TypeStartCallback(DataTypeController::StartResult result,
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const tracked_objects::Location& from_here);
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Stops all data types.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void FinishStop();
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void FinishStopAndNotify(ConfigureResult result,
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen       const tracked_objects::Location& location);
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns true if any last_requested_types_ currently needs to start model
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // association.  If non-null, fills |needs_start| with all such controllers.
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool GetControllersNeedingStart(
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::vector<DataTypeController*>* needs_start);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Restart();
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DownloadReady();
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void NotifyStart();
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void NotifyDone(ConfigureResult result,
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const tracked_objects::Location& location);
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetBlockedAndNotify();
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SyncBackendHost* backend_;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Map of all data type controllers that are available for sync.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This list is determined at startup by various command line flags.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const DataTypeController::TypeMap controllers_;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  State state_;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::map<syncable::ModelType, int> start_order_;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TypeSet last_requested_types_;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<DataTypeController*> needs_start_;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<DataTypeController*> needs_stop_;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Whether an attempt to reconfigure was made while we were busy configuring.
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The |last_requested_types_| will reflect the newest set of requested types.
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool needs_reconfigure_;
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedRunnableMethodFactory<DataTypeManagerImpl> method_factory_;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(DataTypeManagerImpl);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace browser_sync
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_SYNC_GLUE_DATA_TYPE_MANAGER_IMPL_H__
83