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