sync_data.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "sync/api/sync_data.h"
6
7#include <ostream>
8
9#include "base/json/json_writer.h"
10#include "base/memory/scoped_ptr.h"
11#include "base/strings/string_number_conversions.h"
12#include "base/values.h"
13#include "sync/internal_api/public/base/model_type.h"
14#include "sync/internal_api/public/base_node.h"
15#include "sync/protocol/proto_value_conversions.h"
16#include "sync/protocol/sync.pb.h"
17
18namespace syncer {
19
20void SyncData::ImmutableSyncEntityTraits::InitializeWrapper(
21    Wrapper* wrapper) {
22  *wrapper = new sync_pb::SyncEntity();
23}
24
25void SyncData::ImmutableSyncEntityTraits::DestroyWrapper(
26    Wrapper* wrapper) {
27  delete *wrapper;
28}
29
30const sync_pb::SyncEntity& SyncData::ImmutableSyncEntityTraits::Unwrap(
31    const Wrapper& wrapper) {
32  return *wrapper;
33}
34
35sync_pb::SyncEntity* SyncData::ImmutableSyncEntityTraits::UnwrapMutable(
36    Wrapper* wrapper) {
37  return *wrapper;
38}
39
40void SyncData::ImmutableSyncEntityTraits::Swap(sync_pb::SyncEntity* t1,
41                                               sync_pb::SyncEntity* t2) {
42  t1->Swap(t2);
43}
44
45SyncData::SyncData()
46    : is_valid_(false),
47      id_(kInvalidId) {}
48
49SyncData::SyncData(int64 id,
50                   sync_pb::SyncEntity* entity,
51                   const base::Time& remote_modification_time)
52    : is_valid_(true),
53      id_(id),
54      remote_modification_time_(remote_modification_time),
55      immutable_entity_(entity) {}
56
57SyncData::~SyncData() {}
58
59// Static.
60SyncData SyncData::CreateLocalDelete(
61    const std::string& sync_tag,
62    ModelType datatype) {
63  sync_pb::EntitySpecifics specifics;
64  AddDefaultFieldValue(datatype, &specifics);
65  return CreateLocalData(sync_tag, std::string(), specifics);
66}
67
68// Static.
69SyncData SyncData::CreateLocalData(
70    const std::string& sync_tag,
71    const std::string& non_unique_title,
72    const sync_pb::EntitySpecifics& specifics) {
73  sync_pb::SyncEntity entity;
74  entity.set_client_defined_unique_tag(sync_tag);
75  entity.set_non_unique_name(non_unique_title);
76  entity.mutable_specifics()->CopyFrom(specifics);
77  return SyncData(kInvalidId, &entity, base::Time());
78}
79
80// Static.
81SyncData SyncData::CreateRemoteData(
82    int64 id, const sync_pb::EntitySpecifics& specifics,
83    const base::Time& modification_time) {
84  DCHECK_NE(id, kInvalidId);
85  sync_pb::SyncEntity entity;
86  entity.mutable_specifics()->CopyFrom(specifics);
87  return SyncData(id, &entity, modification_time);
88}
89
90bool SyncData::IsValid() const {
91  return is_valid_;
92}
93
94const sync_pb::EntitySpecifics& SyncData::GetSpecifics() const {
95  return immutable_entity_.Get().specifics();
96}
97
98ModelType SyncData::GetDataType() const {
99  return GetModelTypeFromSpecifics(GetSpecifics());
100}
101
102const std::string& SyncData::GetTag() const {
103  DCHECK(IsLocal());
104  return immutable_entity_.Get().client_defined_unique_tag();
105}
106
107const std::string& SyncData::GetTitle() const {
108  // TODO(zea): set this for data coming from the syncer too.
109  DCHECK(immutable_entity_.Get().has_non_unique_name());
110  return immutable_entity_.Get().non_unique_name();
111}
112
113const base::Time& SyncData::GetRemoteModifiedTime() const {
114  DCHECK(!IsLocal());
115  return remote_modification_time_;
116}
117
118int64 SyncData::GetRemoteId() const {
119  DCHECK(!IsLocal());
120  return id_;
121}
122
123bool SyncData::IsLocal() const {
124  return id_ == kInvalidId;
125}
126
127std::string SyncData::ToString() const {
128  if (!IsValid())
129    return "<Invalid SyncData>";
130
131  std::string type = ModelTypeToString(GetDataType());
132  std::string specifics;
133  scoped_ptr<base::DictionaryValue> value(
134      EntitySpecificsToValue(GetSpecifics()));
135  base::JSONWriter::WriteWithOptions(value.get(),
136                                     base::JSONWriter::OPTIONS_PRETTY_PRINT,
137                                     &specifics);
138
139  if (IsLocal()) {
140    return "{ isLocal: true, type: " + type + ", tag: " + GetTag() +
141        ", title: " + GetTitle() + ", specifics: " + specifics + "}";
142  }
143
144  std::string id = base::Int64ToString(GetRemoteId());
145  return "{ isLocal: false, type: " + type + ", specifics: " + specifics +
146      ", id: " + id + "}";
147}
148
149void PrintTo(const SyncData& sync_data, std::ostream* os) {
150  *os << sync_data.ToString();
151}
152
153}  // namespace syncer
154