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