| // Copyright (c) 2011 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. |
| |
| // SyncSessionContext encapsulates the contextual information and engine |
| // components specific to a SyncSession. A context is accessible via |
| // a SyncSession so that session SyncerCommands and parts of the engine have |
| // a convenient way to access other parts. In this way it can be thought of as |
| // the surrounding environment for the SyncSession. The components of this |
| // environment are either valid or not valid for the entire context lifetime, |
| // or they are valid for explicitly scoped periods of time by using Scoped |
| // installation utilities found below. This means that the context assumes no |
| // ownership whatsoever of any object that was not created by the context |
| // itself. |
| // |
| // It can only be used from the SyncerThread. |
| |
| #ifndef CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSION_CONTEXT_H_ |
| #define CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSION_CONTEXT_H_ |
| #pragma once |
| |
| #include <string> |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "chrome/browser/sync/engine/model_safe_worker.h" |
| #include "chrome/browser/sync/engine/syncer_types.h" |
| |
| namespace syncable { |
| class DirectoryManager; |
| } |
| |
| namespace browser_sync { |
| |
| class ConflictResolver; |
| class ExtensionsActivityMonitor; |
| class ModelSafeWorkerRegistrar; |
| class ServerConnectionManager; |
| |
| // Default number of items a client can commit in a single message. |
| static const int kDefaultMaxCommitBatchSize = 25; |
| |
| namespace sessions { |
| class ScopedSessionContextConflictResolver; |
| struct SyncSessionSnapshot; |
| class TestScopedSessionEventListener; |
| |
| class SyncSessionContext { |
| public: |
| SyncSessionContext(ServerConnectionManager* connection_manager, |
| syncable::DirectoryManager* directory_manager, |
| ModelSafeWorkerRegistrar* model_safe_worker_registrar, |
| const std::vector<SyncEngineEventListener*>& listeners); |
| ~SyncSessionContext(); |
| |
| ConflictResolver* resolver() { return resolver_; } |
| ServerConnectionManager* connection_manager() { |
| return connection_manager_; |
| } |
| syncable::DirectoryManager* directory_manager() { |
| return directory_manager_; |
| } |
| ModelSafeWorkerRegistrar* registrar() { |
| return registrar_; |
| } |
| ExtensionsActivityMonitor* extensions_monitor() { |
| return extensions_activity_monitor_; |
| } |
| |
| // 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) { |
| DCHECK(account_name_.empty()); |
| account_name_ = name; |
| } |
| const std::string& account_name() { return account_name_; } |
| |
| void set_max_commit_batch_size(int batch_size) { |
| max_commit_batch_size_ = batch_size; |
| } |
| int32 max_commit_batch_size() const { return max_commit_batch_size_; } |
| |
| const ModelSafeRoutingInfo& previous_session_routing_info() const { |
| return previous_session_routing_info_; |
| } |
| |
| void set_previous_session_routing_info(const ModelSafeRoutingInfo& info) { |
| previous_session_routing_info_ = info; |
| } |
| |
| // TODO(tim): Deprecated. Bug 26339. |
| sessions::SyncSessionSnapshot* previous_session_snapshot() { |
| return previous_session_snapshot_.get(); |
| } |
| |
| void set_last_snapshot(const SyncSessionSnapshot& snapshot); |
| |
| void NotifyListeners(const SyncEngineEvent& event) { |
| FOR_EACH_OBSERVER(SyncEngineEventListener, listeners_, |
| OnSyncEngineEvent(event)); |
| } |
| |
| private: |
| // Rather than force clients to set and null-out various context members, we |
| // extend our encapsulation boundary to scoped helpers that take care of this |
| // once they are allocated. See definitions of these below. |
| friend class ScopedSessionContextConflictResolver; |
| friend class TestScopedSessionEventListener; |
| |
| // This is installed by Syncer objects when needed and may be NULL. |
| ConflictResolver* resolver_; |
| |
| ObserverList<SyncEngineEventListener> listeners_; |
| |
| ServerConnectionManager* const connection_manager_; |
| syncable::DirectoryManager* const directory_manager_; |
| |
| // A registrar of workers capable of processing work closures on a thread |
| // that is guaranteed to be safe for model modifications. |
| ModelSafeWorkerRegistrar* registrar_; |
| |
| // We use this to stuff extensions activity into CommitMessages so the server |
| // can correlate commit traffic with extension-related bookmark mutations. |
| ExtensionsActivityMonitor* extensions_activity_monitor_; |
| |
| // 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_; |
| |
| // Some routing info history to help us clean up types that get disabled |
| // by the user. |
| ModelSafeRoutingInfo previous_session_routing_info_; |
| |
| // Cache of last session snapshot information. |
| scoped_ptr<sessions::SyncSessionSnapshot> previous_session_snapshot_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SyncSessionContext); |
| }; |
| |
| // Installs a ConflictResolver to a given session context for the lifetime of |
| // the ScopedSessionContextConflictResolver. There should never be more than |
| // one ConflictResolver in the system, so it is an error to use this if the |
| // context already has a resolver. |
| class ScopedSessionContextConflictResolver { |
| public: |
| // Note: |context| and |resolver| should outlive |this|. |
| ScopedSessionContextConflictResolver(SyncSessionContext* context, |
| ConflictResolver* resolver) |
| : context_(context), resolver_(resolver) { |
| DCHECK(NULL == context->resolver_); |
| context->resolver_ = resolver; |
| } |
| ~ScopedSessionContextConflictResolver() { |
| context_->resolver_ = NULL; |
| } |
| private: |
| SyncSessionContext* context_; |
| ConflictResolver* resolver_; |
| DISALLOW_COPY_AND_ASSIGN(ScopedSessionContextConflictResolver); |
| }; |
| |
| } // namespace sessions |
| } // namespace browser_sync |
| |
| #endif // CHROME_BROWSER_SYNC_SESSIONS_SYNC_SESSION_CONTEXT_H_ |