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