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