12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 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)// SyncSessionContext encapsulates the contextual information and engine
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// components specific to a SyncSession.  Unlike the SyncSession, the context
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// can be reused across several sync cycles.
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)//
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// The context does not take ownership of its pointer members.  It's up to
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// the surrounding classes to ensure those members remain valid while the
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// context is in use.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It can only be used from the SyncerThread.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SYNC_SESSIONS_SYNC_SESSION_CONTEXT_H_
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_SESSIONS_SYNC_SESSION_CONTEXT_H_
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/base/sync_export.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "sync/engine/sync_engine_event_listener.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/sessions/debug_info_getter.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "sync/sessions/model_type_registry.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class ExtensionsActivity;
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ModelTypeRegistry;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServerConnectionManager;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncable {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Directory;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default number of items a client can commit in a single message.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kDefaultMaxCommitBatchSize = 25;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sessions {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestScopedSessionEventListener;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SYNC_EXPORT_PRIVATE SyncSessionContext {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SyncSessionContext(
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ServerConnectionManager* connection_manager,
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      syncable::Directory* directory,
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ExtensionsActivity* extensions_activity,
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::vector<SyncEngineEventListener*>& listeners,
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DebugInfoGetter* debug_info_getter,
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ModelTypeRegistry* model_type_registry,
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool keystore_encryption_enabled,
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool client_enabled_pre_commit_update_avoidance,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& invalidator_client_id);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SyncSessionContext();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServerConnectionManager* connection_manager() {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return connection_manager_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::Directory* directory() {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return directory_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ModelTypeSet GetEnabledTypes() const;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetRoutingInfo(const ModelSafeRoutingInfo& routing_info);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ExtensionsActivity* extensions_activity() {
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return extensions_activity_.get();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DebugInfoGetter* debug_info_getter() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return debug_info_getter_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Talk notification status.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_notifications_enabled(bool enabled) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notifications_enabled_ = enabled;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool notifications_enabled() { return notifications_enabled_; }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Account name, set once a directory has been opened.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_account_name(const std::string& name) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(account_name_.empty());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    account_name_ = name;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& account_name() const { return account_name_; }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_max_commit_batch_size(int batch_size) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_commit_batch_size_ = batch_size;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 max_commit_batch_size() const { return max_commit_batch_size_; }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ObserverList<SyncEngineEventListener>* listeners() {
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return &listeners_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool keystore_encryption_enabled() const {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return keystore_encryption_enabled_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_hierarchy_conflict_detected(bool value) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client_status_.set_hierarchy_conflict_detected(value);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const sync_pb::ClientStatus& client_status() const {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return client_status_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& invalidator_client_id() const {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return invalidator_client_id_;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool ShouldFetchUpdatesBeforeCommit() const {
114ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return !(server_enabled_pre_commit_update_avoidance_ ||
115ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch             client_enabled_pre_commit_update_avoidance_);
116ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void set_server_enabled_pre_commit_update_avoidance(bool value) {
119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    server_enabled_pre_commit_update_avoidance_ = value;
120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ModelTypeRegistry* model_type_registry() {
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return model_type_registry_;
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Rather than force clients to set and null-out various context members, we
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extend our encapsulation boundary to scoped helpers that take care of this
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // once they are allocated. See definitions of these below.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class TestScopedSessionEventListener;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<SyncEngineEventListener> listeners_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServerConnectionManager* const connection_manager_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncable::Directory* const directory_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use this to stuff extensions activity into CommitMessages so the server
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // can correlate commit traffic with extension-related bookmark mutations.
139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<ExtensionsActivity> extensions_activity_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kept up to date with talk events to determine whether notifications are
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // enabled. True only if the notification channel is authorized and open.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool notifications_enabled_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The name of the account being synced.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string account_name_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The server limits the number of items a client can commit in one batch.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_commit_batch_size_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use this to get debug info to send to the server for debugging
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // client behavior on server side.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DebugInfoGetter* const debug_info_getter_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ModelTypeRegistry* model_type_registry_;
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Satus information to be sent up to the server.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::ClientStatus client_status_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary variable while keystore encryption is behind a flag. True if
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we should attempt performing keystore encryption related work, false if
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the experiment is not enabled.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool keystore_encryption_enabled_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is a copy of the identifier the that the invalidations client used to
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // register itself with the invalidations server during startup.  We need to
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // provide this to the sync server when we make changes to enable it to
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // prevent us from receiving notifications of changes we make ourselves.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string invalidator_client_id_;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
171ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Flag to enable or disable the no pre-commit GetUpdates experiment.  When
172ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // this flag is set to false, the syncer has the option of not performing at
173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // GetUpdates request when there is nothing to fetch.
174ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool server_enabled_pre_commit_update_avoidance_;
175ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // If true, indicates that we've been passed a command-line flag to force
177ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // enable the pre-commit update avoidance experiment described above.
178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const bool client_enabled_pre_commit_update_avoidance_;
179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SyncSessionContext);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace sessions
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // SYNC_SESSIONS_SYNC_SESSION_CONTEXT_H_
187