15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/sessions/sync_session_snapshot.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_writer.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "sync/protocol/proto_enum_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sessions {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncSessionSnapshot::SyncSessionSnapshot()
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : is_silenced_(false),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_encryption_conflicts_(0),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_hierarchy_conflicts_(0),
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_server_conflicts_(0),
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notifications_enabled_(false),
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_entries_(0),
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      num_entries_by_type_(MODEL_TYPE_COUNT, 0),
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      num_to_delete_entries_by_type_(MODEL_TYPE_COUNT, 0),
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_initialized_(false) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncSessionSnapshot::SyncSessionSnapshot(
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ModelNeutralState& model_neutral_state,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ProgressMarkerMap& download_progress_markers,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_silenced,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int num_encryption_conflicts,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int num_hierarchy_conflicts,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int num_server_conflicts,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool notifications_enabled,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t num_entries,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Time sync_start_time,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<int>& num_entries_by_type,
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const std::vector<int>& num_to_delete_entries_by_type,
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    sync_pb::GetUpdatesCallerInfo::GetUpdatesSource legacy_updates_source)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : model_neutral_state_(model_neutral_state),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      download_progress_markers_(download_progress_markers),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_silenced_(is_silenced),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_encryption_conflicts_(num_encryption_conflicts),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_hierarchy_conflicts_(num_hierarchy_conflicts),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_server_conflicts_(num_server_conflicts),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notifications_enabled_(notifications_enabled),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_entries_(num_entries),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sync_start_time_(sync_start_time),
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      num_entries_by_type_(num_entries_by_type),
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      num_to_delete_entries_by_type_(num_to_delete_entries_by_type),
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      legacy_updates_source_(legacy_updates_source),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_initialized_(true) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncSessionSnapshot::~SyncSessionSnapshot() {}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::DictionaryValue* SyncSessionSnapshot::ToValue() const {
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue());
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetInteger("numSuccessfulCommits",
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    model_neutral_state_.num_successful_commits);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetInteger("numSuccessfulBookmarkCommits",
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                model_neutral_state_.num_successful_bookmark_commits);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetInteger("numUpdatesDownloadedTotal",
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                model_neutral_state_.num_updates_downloaded_total);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetInteger("numTombstoneUpdatesDownloadedTotal",
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                model_neutral_state_.num_tombstone_updates_downloaded_total);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetInteger("numReflectedUpdatesDownloadedTotal",
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                model_neutral_state_.num_reflected_updates_downloaded_total);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetInteger("numLocalOverwrites",
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    model_neutral_state_.num_local_overwrites);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetInteger("numServerOverwrites",
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    model_neutral_state_.num_server_overwrites);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->Set("downloadProgressMarkers",
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             ProgressMarkerMapToValue(download_progress_markers_).release());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetBoolean("isSilenced", is_silenced_);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't care too much if we lose precision here, also.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetInteger("numEncryptionConflicts",
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    num_encryption_conflicts_);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetInteger("numHierarchyConflicts",
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    num_hierarchy_conflicts_);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetInteger("numServerConflicts",
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    num_server_conflicts_);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetInteger("numEntries", num_entries_);
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  value->SetString("legacySource",
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   GetUpdatesSourceString(legacy_updates_source_));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value->SetBoolean("notificationsEnabled", notifications_enabled_);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> counter_entries(
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new base::DictionaryValue());
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; i++) {
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<base::DictionaryValue> type_entries(new base::DictionaryValue());
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    type_entries->SetInteger("numEntries", num_entries_by_type_[i]);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    type_entries->SetInteger("numToDeleteEntries",
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             num_to_delete_entries_by_type_[i]);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string model_type = ModelTypeToString(static_cast<ModelType>(i));
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    counter_entries->Set(model_type, type_entries.release());
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  value->Set("counter_entries", counter_entries.release());
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return value.release();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SyncSessionSnapshot::ToString() const {
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::DictionaryValue> value(ToValue());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string json;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONWriter::WriteWithOptions(value.get(),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::JSONWriter::OPTIONS_PRETTY_PRINT,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &json);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return json;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ProgressMarkerMap&
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SyncSessionSnapshot::download_progress_markers() const {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return download_progress_markers_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncSessionSnapshot::is_silenced() const {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_silenced_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SyncSessionSnapshot::num_encryption_conflicts() const {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return num_encryption_conflicts_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SyncSessionSnapshot::num_hierarchy_conflicts() const {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return num_hierarchy_conflicts_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SyncSessionSnapshot::num_server_conflicts() const {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return num_server_conflicts_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncSessionSnapshot::notifications_enabled() const {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return notifications_enabled_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t SyncSessionSnapshot::num_entries() const {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return num_entries_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Time SyncSessionSnapshot::sync_start_time() const {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_start_time_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncSessionSnapshot::is_initialized() const {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return is_initialized_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::vector<int>& SyncSessionSnapshot::num_entries_by_type() const {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return num_entries_by_type_;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::vector<int>&
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SyncSessionSnapshot::num_to_delete_entries_by_type() const {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return num_to_delete_entries_by_type_;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)sync_pb::GetUpdatesCallerInfo::GetUpdatesSource
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SyncSessionSnapshot::legacy_updates_source() const {
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return legacy_updates_source_;
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace sessions
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
165