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