1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/sessions/session_state.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <map>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set>
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <string>
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <utility>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/base64.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/proto_enum_conversions.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing std::set;
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing std::vector;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace browser_sync {
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace sessions {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSyncSourceInfo::SyncSourceInfo()
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : updates_source(sync_pb::GetUpdatesCallerInfo::UNKNOWN) {}
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSyncSourceInfo::SyncSourceInfo(
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const syncable::ModelTypePayloadMap& t)
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : updates_source(sync_pb::GetUpdatesCallerInfo::UNKNOWN), types(t) {}
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
30dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenSyncSourceInfo::SyncSourceInfo(
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::GetUpdatesCallerInfo::GetUpdatesSource& u,
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const syncable::ModelTypePayloadMap& t)
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : updates_source(u), types(t) {}
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSyncSourceInfo::~SyncSourceInfo() {}
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* SyncSourceInfo::ToValue() const {
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetString("updatesSource",
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                   GetUpdatesSourceString(updates_source));
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  value->Set("types", syncable::ModelTypePayloadMapToValue(types));
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSyncerStatus::SyncerStatus()
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : invalid_store(false),
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      syncer_stuck(false),
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      syncing(false),
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      num_successful_commits(0),
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      num_successful_bookmark_commits(0),
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      num_updates_downloaded_total(0),
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      num_tombstone_updates_downloaded_total(0) {
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSyncerStatus::~SyncerStatus() {
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* SyncerStatus::ToValue() const {
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetBoolean("invalidStore", invalid_store);
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetBoolean("syncerStuck", syncer_stuck);
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetBoolean("syncing", syncing);
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetInteger("numSuccessfulCommits", num_successful_commits);
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetInteger("numSuccessfulBookmarkCommits",
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                num_successful_bookmark_commits);
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetInteger("numUpdatesDownloadedTotal",
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                num_updates_downloaded_total);
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetInteger("numTombstoneUpdatesDownloadedTotal",
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                num_tombstone_updates_downloaded_total);
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* DownloadProgressMarkersToValue(
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        (&download_progress_markers)[syncable::MODEL_TYPE_COUNT]) {
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (int i = syncable::FIRST_REAL_MODEL_TYPE;
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen       i < syncable::MODEL_TYPE_COUNT; ++i) {
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // TODO(akalin): Unpack the value into a protobuf.
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::string base64_marker;
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool encoded =
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        base::Base64Encode(download_progress_markers[i], &base64_marker);
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(encoded);
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    value->SetString(
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        syncable::ModelTypeToString(syncable::ModelTypeFromInt(i)),
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        base64_marker);
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenErrorCounters::ErrorCounters()
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : num_conflicting_commits(0),
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      consecutive_transient_error_commits(0),
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      consecutive_errors(0) {
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* ErrorCounters::ToValue() const {
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetInteger("numConflictingCommits", num_conflicting_commits);
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetInteger("consecutiveTransientErrorCommits",
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                consecutive_transient_error_commits);
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetInteger("consecutiveErrors", consecutive_errors);
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
106731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSyncSessionSnapshot::SyncSessionSnapshot(
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const SyncerStatus& syncer_status,
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const ErrorCounters& errors,
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int64 num_server_changes_remaining,
110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    bool is_share_usable,
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const syncable::ModelTypeBitSet& initial_sync_ended,
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        (&download_progress_markers)[syncable::MODEL_TYPE_COUNT],
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    bool more_to_sync,
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    bool is_silenced,
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int64 unsynced_count,
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int num_conflicting_updates,
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool did_commit_items,
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const SyncSourceInfo& source)
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : syncer_status(syncer_status),
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      errors(errors),
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      num_server_changes_remaining(num_server_changes_remaining),
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_share_usable(is_share_usable),
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      initial_sync_ended(initial_sync_ended),
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      download_progress_markers(),
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      has_more_to_sync(more_to_sync),
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      is_silenced(is_silenced),
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      unsynced_count(unsynced_count),
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      num_conflicting_updates(num_conflicting_updates),
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      did_commit_items(did_commit_items),
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      source(source) {
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (int i = syncable::FIRST_REAL_MODEL_TYPE;
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen       i < syncable::MODEL_TYPE_COUNT; ++i) {
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const_cast<std::string&>(this->download_progress_markers[i]).assign(
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        download_progress_markers[i]);
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
139731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSyncSessionSnapshot::~SyncSessionSnapshot() {}
140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* SyncSessionSnapshot::ToValue() const {
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->Set("syncerStatus", syncer_status.ToValue());
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->Set("errors", errors.ToValue());
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We don't care too much if we lose precision here.
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetInteger("numServerChangesRemaining",
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    static_cast<int>(num_server_changes_remaining));
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetBoolean("isShareUsable", is_share_usable);
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->Set("initialSyncEnded",
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             syncable::ModelTypeBitSetToValue(initial_sync_ended));
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->Set("downloadProgressMarkers",
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             DownloadProgressMarkersToValue(download_progress_markers));
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetBoolean("hasMoreToSync", has_more_to_sync);
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetBoolean("isSilenced", is_silenced);
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We don't care too much if we lose precision here, also.
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetInteger("unsyncedCount",
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    static_cast<int>(unsynced_count));
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetInteger("numConflictingUpdates", num_conflicting_updates);
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetBoolean("didCommitItems", did_commit_items);
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->Set("source", source.ToValue());
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
164731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickConflictProgress::ConflictProgress(bool* dirty_flag) : dirty_(dirty_flag) {}
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
166731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickConflictProgress::~ConflictProgress() {
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  CleanupSets();
168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIdToConflictSetMap::const_iterator ConflictProgress::IdToConflictSetFind(
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const syncable::Id& the_id) const {
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return id_to_conflict_set_.find(the_id);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIdToConflictSetMap::const_iterator
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochConflictProgress::IdToConflictSetBegin() const {
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return id_to_conflict_set_.begin();
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIdToConflictSetMap::const_iterator
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochConflictProgress::IdToConflictSetEnd() const {
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return id_to_conflict_set_.end();
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIdToConflictSetMap::size_type ConflictProgress::IdToConflictSetSize() const {
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return id_to_conflict_set_.size();
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst ConflictSet* ConflictProgress::IdToConflictSetGet(
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const syncable::Id& the_id) {
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return id_to_conflict_set_[the_id];
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::set<ConflictSet*>::const_iterator
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochConflictProgress::ConflictSetsBegin() const {
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return conflict_sets_.begin();
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::set<ConflictSet*>::const_iterator
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochConflictProgress::ConflictSetsEnd() const {
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return conflict_sets_.end();
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::set<ConflictSet*>::size_type
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochConflictProgress::ConflictSetsSize() const {
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return conflict_sets_.size();
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::set<syncable::Id>::iterator
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochConflictProgress::ConflictingItemsBegin() {
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return conflicting_item_ids_.begin();
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::set<syncable::Id>::const_iterator
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochConflictProgress::ConflictingItemsBeginConst() const {
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return conflicting_item_ids_.begin();
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::set<syncable::Id>::const_iterator
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochConflictProgress::ConflictingItemsEnd() const {
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return conflicting_item_ids_.end();
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ConflictProgress::AddConflictingItemById(const syncable::Id& the_id) {
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::pair<std::set<syncable::Id>::iterator, bool> ret =
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    conflicting_item_ids_.insert(the_id);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (ret.second)
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *dirty_ = true;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ConflictProgress::EraseConflictingItemById(const syncable::Id& the_id) {
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int items_erased = conflicting_item_ids_.erase(the_id);
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (items_erased != 0)
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *dirty_ = true;
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ConflictProgress::MergeSets(const syncable::Id& id1,
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const syncable::Id& id2) {
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // There are no single item sets, we just leave those entries == 0
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  vector<syncable::Id>* set1 = id_to_conflict_set_[id1];
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  vector<syncable::Id>* set2 = id_to_conflict_set_[id2];
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  vector<syncable::Id>* rv = 0;
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (0 == set1 && 0 == set2) {
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Neither item currently has a set so we build one.
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv = new vector<syncable::Id>();
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv->push_back(id1);
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (id1 != id2) {
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      rv->push_back(id2);
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(WARNING) << "[BUG] Attempting to merge two identical conflict ids.";
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    conflict_sets_.insert(rv);
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (0 == set1) {
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Add the item to the existing set.
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv = set2;
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv->push_back(id1);
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (0 == set2) {
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Add the item to the existing set.
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv = set1;
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv->push_back(id2);
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (set1 == set2) {
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // It's the same set already.
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Merge the two sets.
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv = set1;
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Point all the second sets id's back to the first.
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    vector<syncable::Id>::iterator i;
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (i = set2->begin() ; i != set2->end() ; ++i) {
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      id_to_conflict_set_[*i] = rv;
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Copy the second set to the first.
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    rv->insert(rv->end(), set2->begin(), set2->end());
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    conflict_sets_.erase(set2);
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete set2;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  id_to_conflict_set_[id1] = id_to_conflict_set_[id2] = rv;
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ConflictProgress::CleanupSets() {
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Clean up all the sets.
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  set<ConflictSet*>::iterator i;
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (i = conflict_sets_.begin(); i != conflict_sets_.end(); i++) {
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete *i;
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  conflict_sets_.clear();
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  id_to_conflict_set_.clear();
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
288731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickUpdateProgress::UpdateProgress() {}
289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
290731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickUpdateProgress::~UpdateProgress() {}
291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UpdateProgress::AddVerifyResult(const VerifyResult& verify_result,
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     const sync_pb::SyncEntity& entity) {
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  verified_updates_.push_back(std::make_pair(verify_result, entity));
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UpdateProgress::AddAppliedUpdate(const UpdateAttemptResponse& response,
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const syncable::Id& id) {
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  applied_updates_.push_back(std::make_pair(response, id));
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::vector<AppliedUpdate>::iterator UpdateProgress::AppliedUpdatesBegin() {
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return applied_updates_.begin();
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::vector<VerifiedUpdate>::const_iterator
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochUpdateProgress::VerifiedUpdatesBegin() const {
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return verified_updates_.begin();
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::vector<AppliedUpdate>::const_iterator
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochUpdateProgress::AppliedUpdatesEnd() const {
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return applied_updates_.end();
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::vector<VerifiedUpdate>::const_iterator
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochUpdateProgress::VerifiedUpdatesEnd() const {
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return verified_updates_.end();
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint UpdateProgress::SuccessfullyAppliedUpdateCount() const {
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int count = 0;
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (std::vector<AppliedUpdate>::const_iterator it =
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       applied_updates_.begin();
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       it != applied_updates_.end();
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       ++it) {
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (it->first == SUCCESS)
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      count++;
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return count;
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns true if at least one update application failed due to a conflict
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// during this sync cycle.
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool UpdateProgress::HasConflictingUpdates() const {
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<AppliedUpdate>::const_iterator it;
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (it = applied_updates_.begin(); it != applied_updates_.end(); ++it) {
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (it->first == CONFLICT) {
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
345731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAllModelTypeState::AllModelTypeState(bool* dirty_flag)
346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : unsynced_handles(dirty_flag),
347731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      syncer_status(dirty_flag),
348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      error_counters(dirty_flag),
349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      num_server_changes_remaining(dirty_flag, 0),
350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      commit_set(ModelSafeRoutingInfo()) {
351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
353731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAllModelTypeState::~AllModelTypeState() {}
354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
355731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickPerModelSafeGroupState::PerModelSafeGroupState(bool* dirty_flag)
356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : conflict_progress(dirty_flag) {
357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
359731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickPerModelSafeGroupState::~PerModelSafeGroupState() {
360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace sessions
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace browser_sync
364