summaryrefslogtreecommitdiffstats
path: root/sync/sessions/sync_session.h
diff options
context:
space:
mode:
authorakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-15 09:35:42 +0000
committerakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-15 09:35:42 +0000
commitc1c32c85357f14756247b04b8b5ae41b05bf2e16 (patch)
tree58f25f64e1fa592e8daf276ef69901cd2218f929 /sync/sessions/sync_session.h
parent63ee33bde2ec8471a70f0f0ec6a1962dd07fc8ab (diff)
downloadchromium_src-c1c32c85357f14756247b04b8b5ae41b05bf2e16.zip
chromium_src-c1c32c85357f14756247b04b8b5ae41b05bf2e16.tar.gz
chromium_src-c1c32c85357f14756247b04b8b5ae41b05bf2e16.tar.bz2
[Sync] Move 'sync' target to sync/
Also move related test files. Move WriteNode::UpdateEntryWithEncryption to nigori_util.h. Clean up defines and dependencies. In particular, get rid of SYNC_ENGINE_VERSION_STRING and hard-code the string in the single place it's used. Rename data_encryption.* to data_encryption_win.* and add a pragma for crypt32.lib. Clean up exit-time constructor warnings in sync{able,er}_unittest.cc. Remove some unused files. BUG=117585 TEST= TBR=jhawkins@chromium.org Review URL: https://chromiumcodereview.appspot.com/9699057 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@126872 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sync/sessions/sync_session.h')
-rw-r--r--sync/sessions/sync_session.h240
1 files changed, 240 insertions, 0 deletions
diff --git a/sync/sessions/sync_session.h b/sync/sessions/sync_session.h
new file mode 100644
index 0000000..1dfe78c
--- /dev/null
+++ b/sync/sessions/sync_session.h
@@ -0,0 +1,240 @@
+// Copyright (c) 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.
+
+// A class representing an attempt to synchronize the local syncable data
+// store with a sync server. A SyncSession instance is passed as a stateful
+// bundle to and from various SyncerCommands with the goal of converging the
+// client view of data with that of the server. The commands twiddle with
+// session status in response to events and hiccups along the way, set and
+// query session progress with regards to conflict resolution and applying
+// server updates, and access the SyncSessionContext for the current session
+// via SyncSession instances.
+
+#ifndef SYNC_SESSIONS_SYNC_SESSION_H_
+#define SYNC_SESSIONS_SYNC_SESSION_H_
+#pragma once
+
+#include <map>
+#include <set>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/time.h"
+#include "sync/engine/model_safe_worker.h"
+#include "sync/sessions/ordered_commit_set.h"
+#include "sync/sessions/session_state.h"
+#include "sync/sessions/status_controller.h"
+#include "sync/sessions/sync_session_context.h"
+#include "sync/syncable/model_type.h"
+#include "sync/util/extensions_activity_monitor.h"
+
+namespace syncable {
+class WriteTransaction;
+}
+
+namespace browser_sync {
+class ModelSafeWorker;
+
+namespace sessions {
+
+class SyncSession {
+ public:
+ // The Delegate services events that occur during the session requiring an
+ // explicit (and session-global) action, as opposed to events that are simply
+ // recorded in per-session state.
+ class Delegate {
+ public:
+ // The client was throttled and should cease-and-desist syncing activity
+ // until the specified time.
+ virtual void OnSilencedUntil(const base::TimeTicks& silenced_until) = 0;
+
+ // Silenced intervals can be out of phase with individual sessions, so the
+ // delegate is the only thing that can give an authoritative answer for
+ // "is syncing silenced right now". This shouldn't be necessary very often
+ // as the delegate ensures no session is started if syncing is silenced.
+ // ** Note ** This will return true if silencing commenced during this
+ // session and the interval has not yet elapsed, but the contract here is
+ // solely based on absolute time values. So, this cannot be used to infer
+ // that any given session _instance_ is silenced. An example of reasonable
+ // use is for UI reporting.
+ virtual bool IsSyncingCurrentlySilenced() = 0;
+
+ // The client has been instructed to change its short poll interval.
+ virtual void OnReceivedShortPollIntervalUpdate(
+ const base::TimeDelta& new_interval) = 0;
+
+ // The client has been instructed to change its long poll interval.
+ virtual void OnReceivedLongPollIntervalUpdate(
+ const base::TimeDelta& new_interval) = 0;
+
+ // The client has been instructed to change its sessions commit
+ // delay.
+ virtual void OnReceivedSessionsCommitDelay(
+ const base::TimeDelta& new_delay) = 0;
+
+ // The client needs to cease and desist syncing at once. This occurs when
+ // the Syncer detects that the backend store has fundamentally changed or
+ // is a different instance altogether (e.g. swapping from a test instance
+ // to production, or a global stop syncing operation has wiped the store).
+ // TODO(lipalani) : Replace this function with the one below. This function
+ // stops the current sync cycle and purges the client. In the new model
+ // the former would be done by the |SyncProtocolError| and
+ // the latter(which is an action) would be done in ProfileSyncService
+ // along with the rest of the actions.
+ virtual void OnShouldStopSyncingPermanently() = 0;
+
+ // Called for the syncer to respond to the error sent by the server.
+ virtual void OnSyncProtocolError(
+ const sessions::SyncSessionSnapshot& snapshot) = 0;
+
+ protected:
+ virtual ~Delegate() {}
+ };
+
+ SyncSession(SyncSessionContext* context,
+ Delegate* delegate,
+ const SyncSourceInfo& source,
+ const ModelSafeRoutingInfo& routing_info,
+ const std::vector<ModelSafeWorker*>& workers);
+ ~SyncSession();
+
+ // Builds a thread-safe and read-only copy of the current session state.
+ SyncSessionSnapshot TakeSnapshot() const;
+
+ // Builds and sends a snapshot to the session context's listeners.
+ void SendEventNotification(SyncEngineEvent::EventCause cause);
+
+ // Returns true if this session contains data that should go through the sync
+ // engine again.
+ bool HasMoreToSync() const;
+
+ // Returns true if there we did not detect any errors in this session.
+ //
+ // There are many errors that could prevent a sync cycle from succeeding.
+ // These include invalid local state, inability to contact the server,
+ // inability to authenticate with the server, and server errors. What they
+ // have in common is that the we either need to take some action and then
+ // retry the sync cycle or, in the case of transient errors, retry after some
+ // backoff timer has expired. Most importantly, the SyncScheduler should not
+ // assume that the original action that triggered the sync cycle (ie. a nudge
+ // or a notification) has been properly serviced.
+ //
+ // This function also returns false if SyncShare has not been called on this
+ // session yet, or if ResetTransientState() has been called on this session
+ // since the last call to SyncShare.
+ bool Succeeded() const;
+
+ // Collects all state pertaining to how and why |s| originated and unions it
+ // with corresponding state in |this|, leaving |s| unchanged. Allows |this|
+ // to take on the responsibilities |s| had (e.g. certain data types) in the
+ // next SyncShare operation using |this|, rather than needed two separate
+ // sessions.
+ void Coalesce(const SyncSession& session);
+
+ // Compares the routing_info_, workers and payload map with the passed in
+ // session. Purges types from the above 3 which are not in session. Useful
+ // to update the sync session when the user has disabled some types from
+ // syncing.
+ void RebaseRoutingInfoWithLatest(const SyncSession& session);
+
+ // Should be called any time |this| is being re-used in a new call to
+ // SyncShare (e.g., HasMoreToSync returned true).
+ void PrepareForAnotherSyncCycle();
+
+ // TODO(akalin): Split this into context() and mutable_context().
+ SyncSessionContext* context() const { return context_; }
+ Delegate* delegate() const { return delegate_; }
+ syncable::WriteTransaction* write_transaction() { return write_transaction_; }
+ const StatusController& status_controller() const {
+ return *status_controller_.get();
+ }
+ StatusController* mutable_status_controller() {
+ return status_controller_.get();
+ }
+
+ const ExtensionsActivityMonitor::Records& extensions_activity() const {
+ return extensions_activity_;
+ }
+ ExtensionsActivityMonitor::Records* mutable_extensions_activity() {
+ return &extensions_activity_;
+ }
+
+ const std::vector<ModelSafeWorker*>& workers() const { return workers_; }
+ const ModelSafeRoutingInfo& routing_info() const { return routing_info_; }
+ const SyncSourceInfo& source() const { return source_; }
+
+ // Returns the set of groups which have enabled types.
+ const std::set<ModelSafeGroup>& GetEnabledGroups() const;
+
+ // Returns the set of enabled groups that have conflicts.
+ std::set<ModelSafeGroup> GetEnabledGroupsWithConflicts() const;
+
+ // Returns the set of enabled groups that have verified updates.
+ std::set<ModelSafeGroup> GetEnabledGroupsWithVerifiedUpdates() const;
+
+ private:
+ // Extend the encapsulation boundary to utilities for internal member
+ // assignments. This way, the scope of these actions is explicit, they can't
+ // be overridden, and assigning is always accompanied by unassigning.
+ friend class ScopedSetSessionWriteTransaction;
+
+ // The context for this session, guaranteed to outlive |this|.
+ SyncSessionContext* const context_;
+
+ // The source for initiating this sync session.
+ SyncSourceInfo source_;
+
+ // Information about extensions activity since the last successful commit.
+ ExtensionsActivityMonitor::Records extensions_activity_;
+
+ // Used to allow various steps to share a transaction. Can be NULL.
+ syncable::WriteTransaction* write_transaction_;
+
+ // The delegate for this session, must never be NULL.
+ Delegate* const delegate_;
+
+ // Our controller for various status and error counters.
+ scoped_ptr<StatusController> status_controller_;
+
+ // The set of active ModelSafeWorkers for the duration of this session.
+ // This can change if this session is Coalesce()'d with another.
+ std::vector<ModelSafeWorker*> workers_;
+
+ // The routing info for the duration of this session, dictating which
+ // datatypes should be synced and which workers should be used when working
+ // on those datatypes.
+ ModelSafeRoutingInfo routing_info_;
+
+ // The set of groups with enabled types. Computed from
+ // |routing_info_|.
+ std::set<ModelSafeGroup> enabled_groups_;
+
+ DISALLOW_COPY_AND_ASSIGN(SyncSession);
+};
+
+// Installs a WriteTransaction to a given session and later clears it when the
+// utility falls out of scope. Transactions are not nestable, so it is an error
+// to try and use one of these if the session already has a transaction.
+class ScopedSetSessionWriteTransaction {
+ public:
+ ScopedSetSessionWriteTransaction(SyncSession* session,
+ syncable::WriteTransaction* trans)
+ : session_(session) {
+ DCHECK(!session_->write_transaction_);
+ session_->write_transaction_ = trans;
+ }
+ ~ScopedSetSessionWriteTransaction() { session_->write_transaction_ = NULL; }
+
+ private:
+ SyncSession* session_;
+ DISALLOW_COPY_AND_ASSIGN(ScopedSetSessionWriteTransaction);
+};
+
+} // namespace sessions
+} // namespace browser_sync
+
+#endif // SYNC_SESSIONS_SYNC_SESSION_H_