summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/engine/sync_cycle_state.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/engine/sync_cycle_state.h')
-rw-r--r--chrome/browser/sync/engine/sync_cycle_state.h253
1 files changed, 253 insertions, 0 deletions
diff --git a/chrome/browser/sync/engine/sync_cycle_state.h b/chrome/browser/sync/engine/sync_cycle_state.h
new file mode 100644
index 0000000..7d38670c
--- /dev/null
+++ b/chrome/browser/sync/engine/sync_cycle_state.h
@@ -0,0 +1,253 @@
+// Copyright (c) 2006-2009 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.
+
+//
+// The sync process consists of a sequence of sync cycles, each of which
+// (hopefully) moves the client into closer synchronization with the server.
+// This class holds state that is pertinent to a single sync cycle.
+//
+// THIS CLASS PROVIDES NO SYNCHRONIZATION GUARANTEES.
+
+#ifndef CHROME_BROWSER_SYNC_ENGINE_SYNC_CYCLE_STATE_H_
+#define CHROME_BROWSER_SYNC_ENGINE_SYNC_CYCLE_STATE_H_
+
+#include <utility>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "chrome/browser/sync/engine/syncer_types.h"
+#include "chrome/browser/sync/engine/syncproto.h"
+#include "chrome/browser/sync/util/event_sys.h"
+#include "chrome/browser/sync/util/pthread_helpers.h"
+
+namespace syncable {
+class WriteTransaction;
+class Id;
+} // namespace syncable
+
+namespace browser_sync {
+
+typedef std::pair<VerifyResult, sync_pb::SyncEntity> VerifiedUpdate;
+typedef std::pair<UpdateAttemptResponse, syncable::Id> AppliedUpdate;
+
+// This is the type declaration for the eventsys channel that the syncer
+// uses to send events to other system components.
+struct SyncerEvent;
+
+// SyncCycleState holds the entire state of a single sync cycle;
+// GetUpdates, Commit, and Conflict Resolution. After said cycle, the
+// State may contain items that were unable to be processed because of
+// errors.
+class SyncCycleState {
+ public:
+ SyncCycleState()
+ : write_transaction_(NULL),
+ conflict_sets_built_(false),
+ conflicts_resolved_(false),
+ items_committed_(false),
+ over_quota_(false),
+ dirty_(true),
+ timestamp_dirty_(false) {}
+
+ void set_update_response(const ClientToServerResponse& update_response) {
+ update_response_.CopyFrom(update_response);
+ }
+
+ const ClientToServerResponse& update_response() const {
+ return update_response_;
+ }
+
+ void set_commit_response(const ClientToServerResponse& commit_response) {
+ commit_response_.CopyFrom(commit_response);
+ }
+
+ const ClientToServerResponse& commit_response() const {
+ return commit_response_;
+ }
+
+ void AddVerifyResult(const VerifyResult& verify_result,
+ const sync_pb::SyncEntity& entity) {
+ verified_updates_.push_back(std::make_pair(verify_result, entity));
+ }
+
+ bool HasVerifiedUpdates() const {
+ return !verified_updates_.empty();
+ }
+
+ // Log a successful or failing update attempt.
+ void AddAppliedUpdate(const UpdateAttemptResponse& response,
+ const syncable::Id& id) {
+ applied_updates_.push_back(std::make_pair(response, id));
+ }
+
+ bool HasAppliedUpdates() const {
+ return !applied_updates_.empty();
+ }
+
+ std::vector<AppliedUpdate>::iterator AppliedUpdatesBegin() {
+ return applied_updates_.begin();
+ }
+
+ std::vector<VerifiedUpdate>::iterator VerifiedUpdatesBegin() {
+ return verified_updates_.begin();
+ }
+
+ std::vector<AppliedUpdate>::iterator AppliedUpdatesEnd() {
+ return applied_updates_.end();
+ }
+
+ std::vector<VerifiedUpdate>::iterator VerifiedUpdatesEnd() {
+ return verified_updates_.end();
+ }
+
+ // Returns the number of update application attempts. This includes
+ // both failures and successes.
+ int AppliedUpdatesSize() const {
+ return applied_updates_.size();
+ }
+
+ // Count the number of successful update applications that have happend
+ // this cycle. Note that if an item is successfully applied twice,
+ // it will be double counted here.
+ int SuccessfullyAppliedUpdateCount() const {
+ int count = 0;
+ for (std::vector<AppliedUpdate>::const_iterator it =
+ applied_updates_.begin();
+ it != applied_updates_.end();
+ ++it) {
+ if (it->first == SUCCESS)
+ count++;
+ }
+ return count;
+ }
+
+ int VerifiedUpdatesSize() const {
+ return verified_updates_.size();
+ }
+
+ const std::vector<int64>& unsynced_handles() const {
+ return unsynced_handles_;
+ }
+
+ void set_unsynced_handles(const std::vector<int64>& unsynced_handles) {
+ UpdateDirty(unsynced_handles != unsynced_handles_);
+ unsynced_handles_ = unsynced_handles;
+ }
+
+ int64 unsynced_count() const { return unsynced_handles_.size(); }
+
+ const std::vector<syncable::Id>& commit_ids() const { return commit_ids_; }
+
+ void set_commit_ids(const std::vector<syncable::Id>& commit_ids) {
+ commit_ids_ = commit_ids;
+ }
+
+ bool commit_ids_empty() const { return commit_ids_.empty(); }
+
+ // The write transaction must be deleted by the caller of this function.
+ void set_write_transaction(syncable::WriteTransaction* write_transaction) {
+ DCHECK(!write_transaction_) << "Forgot to clear the write transaction.";
+ write_transaction_ = write_transaction;
+ }
+
+ syncable::WriteTransaction* write_transaction() const {
+ return write_transaction_;
+ }
+
+ bool has_open_write_transaction() { return write_transaction_ != NULL; }
+
+ // sets the write transaction to null, but doesn't free the memory.
+ void ClearWriteTransaction() { write_transaction_ = NULL; }
+
+ ClientToServerMessage* commit_message() { return &commit_message_; }
+
+ void set_commit_message(ClientToServerMessage message) {
+ commit_message_ = message;
+ }
+
+ void set_conflict_sets_built(bool b) {
+ conflict_sets_built_ = b;
+ }
+
+ bool conflict_sets_built() const {
+ return conflict_sets_built_;
+ }
+
+ void set_conflicts_resolved(bool b) {
+ conflicts_resolved_ = b;
+ }
+
+ bool conflicts_resolved() const {
+ return conflicts_resolved_;
+ }
+
+ void set_over_quota(bool b) {
+ UpdateDirty(b != over_quota_);
+ over_quota_ = b;
+ }
+
+ bool over_quota() const {
+ return over_quota_;
+ }
+
+ void set_items_committed(bool b) { items_committed_ = b; }
+
+ void set_item_committed() { items_committed_ |= true; }
+
+ bool items_committed() const { return items_committed_; }
+
+
+ // Returns true if this object has been modified since last SetClean() call
+ bool IsDirty() const { return dirty_; }
+
+ // Call to tell this status object that its new state has been seen
+ void SetClean() { dirty_ = false; }
+
+ // Indicate that we've made a change to directory timestamp.
+ void set_timestamp_dirty() {
+ timestamp_dirty_ = true;
+ }
+
+ bool is_timestamp_dirty() const {
+ return timestamp_dirty_;
+ }
+
+
+ private:
+ void UpdateDirty(bool new_info) { dirty_ |= new_info; }
+
+ // download updates supplies:
+ ClientToServerResponse update_response_;
+ ClientToServerResponse commit_response_;
+ ClientToServerMessage commit_message_;
+
+ syncable::WriteTransaction* write_transaction_;
+ std::vector<int64> unsynced_handles_;
+ std::vector<syncable::Id> commit_ids_;
+
+ // At a certain point during the sync process we'll want to build the
+ // conflict sets. This variable tracks whether or not that has happened.
+ bool conflict_sets_built_;
+ bool conflicts_resolved_;
+ bool items_committed_;
+ bool over_quota_;
+
+ // If we've set the timestamp to a new value during this cycle.
+ bool timestamp_dirty_;
+
+ bool dirty_;
+
+ // some container for updates that failed verification
+ std::vector<VerifiedUpdate> verified_updates_;
+
+ // Stores the result of the various ApplyUpdate attempts we've made.
+ // May contain duplicate entries.
+ std::vector<AppliedUpdate> applied_updates_;
+
+ DISALLOW_COPY_AND_ASSIGN(SyncCycleState);
+};
+
+} // namespace browser_sync
+
+#endif // CHROME_BROWSER_SYNC_ENGINE_SYNC_CYCLE_STATE_H_