15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_GLUE_DATA_TYPE_MANAGER_H__ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SYNC_GLUE_DATA_TYPE_MANAGER_H__ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/data_type_controller.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/configure_reason.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This interface is for managing the start up and shut down life cycle 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of many different syncable data types. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DataTypeManager { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum State { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STOPPED, // No data types are currently running. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOWNLOAD_PENDING, // Not implemented yet: Waiting for the syncer to 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // complete the initial download of new data 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // types. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONFIGURING, // Data types are being started. 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RETRYING, // Retrying a pending reconfiguration. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONFIGURED, // All enabled data types are running. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STOPPING // Data types are being stopped. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update NotifyDone() in data_type_manager_impl.cc if you update 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ConfigureStatus { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNKNOWN = -1, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OK, // Configuration finished without error. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PARTIAL_SUCCESS, // Some data types had an error while starting up. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ABORTED, // Start was aborted by calling Stop() before 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all types were started. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNRECOVERABLE_ERROR // We got an unrecoverable error during startup. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: |errors| is only filled when status is not OK. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ConfigureResult { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureResult(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureResult(ConfigureStatus status, 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) syncer::ModelTypeSet requested_types); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureResult(ConfigureStatus status, 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) syncer::ModelTypeSet requested_types, 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::map<syncer::ModelType, syncer::SyncError> 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) failed_data_types, 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) syncer::ModelTypeSet waiting_to_start, 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) syncer::ModelTypeSet needs_crypto); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ConfigureResult(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigureStatus status; 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) syncer::ModelTypeSet requested_types; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These types encountered a failure in association. 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::map<syncer::ModelType, syncer::SyncError> failed_data_types; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List of types that failed to start association with in our alloted 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time period(see kDataTypeLoadWaitTimeInSeconds). We move 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // forward here and allow these types to continue loading in the 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background. When these types are loaded DataTypeManager will 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be informed and another configured cycle will be started. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelTypeSet waiting_to_start; 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Those types that are unable to start due to the cryptographer not being 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // ready. 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) syncer::ModelTypeSet needs_crypto; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DataTypeManager() {} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert a ConfigureStatus to string for debug purposes. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string ConfigureStatusToString(ConfigureStatus status); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Begins asynchronous configuration of data types. Any currently 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // running data types that are not in the desired_types set will be 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stopped. Any stopped data types that are in the desired_types 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // set will be started. All other data types are left in their 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current state. A SYNC_CONFIGURE_START notification will be sent 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the UI thread when configuration is started and a 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SYNC_CONFIGURE_DONE notification will be sent (with a 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ConfigureResult detail) when configuration is complete. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that you may call Configure() while configuration is in 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // progress. Configuration will be complete only when the 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // desired_types supplied in the last call to Configure is achieved. 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void Configure(syncer::ModelTypeSet desired_types, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ConfigureReason reason) = 0; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void PurgeForMigration(syncer::ModelTypeSet undesired_types, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ConfigureReason reason) = 0; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synchronously stops all registered data types. If called after 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Configure() is called but before it finishes, it will abort the 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // configure and any data types that have been started will be 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stopped. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Stop() = 0; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current state of the data type manager. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual State state() const = 0; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace browser_sync 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_SYNC_GLUE_DATA_TYPE_MANAGER_H__ 113