text: // Copyright 2012 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_SYNC_CYCLE_CONTEXT_H_
  #define COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_SYNC_CYCLE_CONTEXT_H_
  
  #include <stdint.h>
  
  #include <string>
  #include <vector>
  
  #include "base/macros.h"
  #include "components/sync/engine_impl/cycle/debug_info_getter.h"
  #include "components/sync/engine_impl/model_type_registry.h"
  #include "components/sync/engine_impl/sync_engine_event_listener.h"
  
  namespace syncer {
  
  class ExtensionsActivity;
  class ModelTypeRegistry;
  class ServerConnectionManager;
  
  namespace syncable {
  class Directory;
  }
  
  // Default number of items a client can commit in a single message.
  static const int kDefaultMaxCommitBatchSize = 25;
  
  // SyncCycleContext encapsulates the contextual information and engine
  // components specific to a SyncCycle.  Unlike the SyncCycle, the context
  // can be reused across several sync cycles.
  //
  // The context does not take ownership of its pointer members.  It's up to
  // the surrounding classes to ensure those members remain valid while the
  // context is in use.
  //
  // It can only be used from the SyncerThread.
  class SyncCycleContext {
   public:
    SyncCycleContext(ServerConnectionManager* connection_manager,
                     syncable::Directory* directory,
                     ExtensionsActivity* extensions_activity,
                     const std::vector<SyncEngineEventListener*>& listeners,
                     DebugInfoGetter* debug_info_getter,
                     ModelTypeRegistry* model_type_registry,
                     bool keystore_encryption_enabled,
                     bool client_enabled_pre_commit_update_avoidance,
                     const std::string& invalidator_client_id);
  
    ~SyncCycleContext();
  
    ServerConnectionManager* connection_manager() { return connection_manager_; }
    syncable::Directory* directory() { return directory_; }
  
    ModelTypeSet GetEnabledTypes() const;
  
    void SetRoutingInfo(const ModelSafeRoutingInfo& routing_info);
  
    ExtensionsActivity* extensions_activity() {
      return extensions_activity_.get();
    }
  
    DebugInfoGetter* debug_info_getter() { return debug_info_getter_; }
  
    // Talk notification status.
    void set_notifications_enabled(bool enabled) {
      notifications_enabled_ = enabled;
    }
    bool notifications_enabled() { return notifications_enabled_; }
  
    // Account name, set once a directory has been opened.
    void set_account_name(const std::string& name) { account_name_ = name; }
    const std::string& account_name() const { return account_name_; }
  
    void set_max_commit_batch_size(int batch_size) {
      max_commit_batch_size_ = batch_size;
    }
    int32_t max_commit_batch_size() const { return max_commit_batch_size_; }
  
    base::ObserverList<SyncEngineEventListener>* listeners() {
      return &listeners_;
    }
  
    bool keystore_encryption_enabled() const {
      return keystore_encryption_enabled_;
    }
  
    void set_hierarchy_conflict_detected(bool value) {
      client_status_.set_hierarchy_conflict_detected(value);
    }
  
    const sync_pb::ClientStatus& client_status() const { return client_status_; }
  
    const std::string& invalidator_client_id() const {
      return invalidator_client_id_;
    }
  
    bool ShouldFetchUpdatesBeforeCommit() const {
      return !(server_enabled_pre_commit_update_avoidance_ ||
               client_enabled_pre_commit_update_avoidance_);
    }
  
    void set_server_enabled_pre_commit_update_avoidance(bool value) {
      server_enabled_pre_commit_update_avoidance_ = value;
    }
  
    ModelTypeRegistry* model_type_registry() { return model_type_registry_; }
  
    bool cookie_jar_mismatch() const { return cookie_jar_mismatch_; }
  
    void set_cookie_jar_mismatch(bool cookie_jar_mismatch) {
      cookie_jar_mismatch_ = cookie_jar_mismatch;
    }
  
    bool cookie_jar_empty() const { return cookie_jar_empty_; }
  
    void set_cookie_jar_empty(bool empty_jar) { cookie_jar_empty_ = empty_jar; }
  
   private:
    base::ObserverList<SyncEngineEventListener> listeners_;
  
    ServerConnectionManager* const connection_manager_;
    syncable::Directory* const directory_;
  
    // We use this to stuff extensions activity into CommitMessages so the server
    // can correlate commit traffic with extension-related bookmark mutations.
    scoped_refptr<ExtensionsActivity> extensions_activity_;
  
    // Kept up to date with talk events to determine whether notifications are
    // enabled. True only if the notification channel is authorized and open.
    bool notifications_enabled_;
  
    // The name of the account being synced.
    std::string account_name_;
  
    // The server limits the number of items a client can commit in one batch.
    int max_commit_batch_size_;
  
    // We use this to get debug info to send to the server for debugging
    // client behavior on server side.
    DebugInfoGetter* const debug_info_getter_;
  
    ModelTypeRegistry* model_type_registry_;
  
    // Satus information to be sent up to the server.
    sync_pb::ClientStatus client_status_;
  
    // Temporary variable while keystore encryption is behind a flag. True if
    // we should attempt performing keystore encryption related work, false if
    // the experiment is not enabled.
    bool keystore_encryption_enabled_;
  
    // This is a copy of the identifier the that the invalidations client used to
    // register itself with the invalidations server during startup.  We need to
    // provide this to the sync server when we make changes to enable it to
    // prevent us from receiving notifications of changes we make ourselves.
    const std::string invalidator_client_id_;
  
    // Flag to enable or disable the no pre-commit GetUpdates experiment.  When
    // this flag is set to false, the syncer has the option of not performing at
    // GetUpdates request when there is nothing to fetch.
    bool server_enabled_pre_commit_update_avoidance_;
  
    // If true, indicates that we've been passed a command-line flag to force
    // enable the pre-commit update avoidance experiment described above.
    const bool client_enabled_pre_commit_update_avoidance_;
  
    // Whether the account(s) present in the content area's cookie jar match the
    // chrome account. If multiple accounts are present in the cookie jar, a
    // mismatch implies all of them are different from the chrome account.
    bool cookie_jar_mismatch_;
  
    // If there's a cookie jar mismatch, whether the cookie jar was empty or not.
    bool cookie_jar_empty_;
  
    DISALLOW_COPY_AND_ASSIGN(SyncCycleContext);
  };
  
  }  // namespace syncer
  
  #endif  // COMPONENTS_SYNC_ENGINE_IMPL_CYCLE_SYNC_CYCLE_CONTEXT_H_
  