• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // SyncSessionContext encapsulates the contextual information and engine
6 // components specific to a SyncSession.  Unlike the SyncSession, the context
7 // can be reused across several sync cycles.
8 //
9 // The context does not take ownership of its pointer members.  It's up to
10 // the surrounding classes to ensure those members remain valid while the
11 // context is in use.
12 //
13 // It can only be used from the SyncerThread.
14 
15 #ifndef SYNC_SESSIONS_SYNC_SESSION_CONTEXT_H_
16 #define SYNC_SESSIONS_SYNC_SESSION_CONTEXT_H_
17 
18 #include <string>
19 
20 #include "sync/base/sync_export.h"
21 #include "sync/engine/sync_engine_event_listener.h"
22 #include "sync/sessions/debug_info_getter.h"
23 #include "sync/sessions/model_type_registry.h"
24 
25 namespace syncer {
26 
27 class ExtensionsActivity;
28 class ModelTypeRegistry;
29 class ServerConnectionManager;
30 
31 namespace syncable {
32 class Directory;
33 }
34 
35 // Default number of items a client can commit in a single message.
36 static const int kDefaultMaxCommitBatchSize = 25;
37 
38 namespace sessions {
39 class TestScopedSessionEventListener;
40 
41 class SYNC_EXPORT_PRIVATE SyncSessionContext {
42  public:
43   SyncSessionContext(
44       ServerConnectionManager* connection_manager,
45       syncable::Directory* directory,
46       ExtensionsActivity* extensions_activity,
47       const std::vector<SyncEngineEventListener*>& listeners,
48       DebugInfoGetter* debug_info_getter,
49       ModelTypeRegistry* model_type_registry,
50       bool keystore_encryption_enabled,
51       bool client_enabled_pre_commit_update_avoidance,
52       const std::string& invalidator_client_id);
53 
54   ~SyncSessionContext();
55 
connection_manager()56   ServerConnectionManager* connection_manager() {
57     return connection_manager_;
58   }
directory()59   syncable::Directory* directory() {
60     return directory_;
61   }
62 
63   ModelTypeSet GetEnabledTypes() const;
64 
65   void SetRoutingInfo(const ModelSafeRoutingInfo& routing_info);
66 
extensions_activity()67   ExtensionsActivity* extensions_activity() {
68     return extensions_activity_.get();
69   }
70 
debug_info_getter()71   DebugInfoGetter* debug_info_getter() {
72     return debug_info_getter_;
73   }
74 
75   // Talk notification status.
set_notifications_enabled(bool enabled)76   void set_notifications_enabled(bool enabled) {
77     notifications_enabled_ = enabled;
78   }
notifications_enabled()79   bool notifications_enabled() { return notifications_enabled_; }
80 
81   // Account name, set once a directory has been opened.
set_account_name(const std::string & name)82   void set_account_name(const std::string& name) {
83     DCHECK(account_name_.empty());
84     account_name_ = name;
85   }
account_name()86   const std::string& account_name() const { return account_name_; }
87 
set_max_commit_batch_size(int batch_size)88   void set_max_commit_batch_size(int batch_size) {
89     max_commit_batch_size_ = batch_size;
90   }
max_commit_batch_size()91   int32 max_commit_batch_size() const { return max_commit_batch_size_; }
92 
listeners()93   ObserverList<SyncEngineEventListener>* listeners() {
94     return &listeners_;
95   }
96 
keystore_encryption_enabled()97   bool keystore_encryption_enabled() const {
98     return keystore_encryption_enabled_;
99   }
100 
set_hierarchy_conflict_detected(bool value)101   void set_hierarchy_conflict_detected(bool value) {
102     client_status_.set_hierarchy_conflict_detected(value);
103   }
104 
client_status()105   const sync_pb::ClientStatus& client_status() const {
106     return client_status_;
107   }
108 
invalidator_client_id()109   const std::string& invalidator_client_id() const {
110     return invalidator_client_id_;
111   }
112 
ShouldFetchUpdatesBeforeCommit()113   bool ShouldFetchUpdatesBeforeCommit() const {
114     return !(server_enabled_pre_commit_update_avoidance_ ||
115              client_enabled_pre_commit_update_avoidance_);
116   }
117 
set_server_enabled_pre_commit_update_avoidance(bool value)118   void set_server_enabled_pre_commit_update_avoidance(bool value) {
119     server_enabled_pre_commit_update_avoidance_ = value;
120   }
121 
model_type_registry()122   ModelTypeRegistry* model_type_registry() {
123     return model_type_registry_;
124   }
125 
126  private:
127   // Rather than force clients to set and null-out various context members, we
128   // extend our encapsulation boundary to scoped helpers that take care of this
129   // once they are allocated. See definitions of these below.
130   friend class TestScopedSessionEventListener;
131 
132   ObserverList<SyncEngineEventListener> listeners_;
133 
134   ServerConnectionManager* const connection_manager_;
135   syncable::Directory* const directory_;
136 
137   // We use this to stuff extensions activity into CommitMessages so the server
138   // can correlate commit traffic with extension-related bookmark mutations.
139   scoped_refptr<ExtensionsActivity> extensions_activity_;
140 
141   // Kept up to date with talk events to determine whether notifications are
142   // enabled. True only if the notification channel is authorized and open.
143   bool notifications_enabled_;
144 
145   // The name of the account being synced.
146   std::string account_name_;
147 
148   // The server limits the number of items a client can commit in one batch.
149   int max_commit_batch_size_;
150 
151   // We use this to get debug info to send to the server for debugging
152   // client behavior on server side.
153   DebugInfoGetter* const debug_info_getter_;
154 
155   ModelTypeRegistry* model_type_registry_;
156 
157   // Satus information to be sent up to the server.
158   sync_pb::ClientStatus client_status_;
159 
160   // Temporary variable while keystore encryption is behind a flag. True if
161   // we should attempt performing keystore encryption related work, false if
162   // the experiment is not enabled.
163   bool keystore_encryption_enabled_;
164 
165   // This is a copy of the identifier the that the invalidations client used to
166   // register itself with the invalidations server during startup.  We need to
167   // provide this to the sync server when we make changes to enable it to
168   // prevent us from receiving notifications of changes we make ourselves.
169   const std::string invalidator_client_id_;
170 
171   // Flag to enable or disable the no pre-commit GetUpdates experiment.  When
172   // this flag is set to false, the syncer has the option of not performing at
173   // GetUpdates request when there is nothing to fetch.
174   bool server_enabled_pre_commit_update_avoidance_;
175 
176   // If true, indicates that we've been passed a command-line flag to force
177   // enable the pre-commit update avoidance experiment described above.
178   const bool client_enabled_pre_commit_update_avoidance_;
179 
180   DISALLOW_COPY_AND_ASSIGN(SyncSessionContext);
181 };
182 
183 }  // namespace sessions
184 }  // namespace syncer
185 
186 #endif  // SYNC_SESSIONS_SYNC_SESSION_CONTEXT_H_
187