| // Copyright (c) 2012 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. |
| |
| #include "sync/api/sync_data.h" |
| |
| #include <ostream> |
| |
| #include "base/json/json_writer.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/values.h" |
| #include "sync/internal_api/public/base/model_type.h" |
| #include "sync/internal_api/public/base_node.h" |
| #include "sync/protocol/proto_value_conversions.h" |
| #include "sync/protocol/sync.pb.h" |
| |
| namespace syncer { |
| |
| void SyncData::ImmutableSyncEntityTraits::InitializeWrapper( |
| Wrapper* wrapper) { |
| *wrapper = new sync_pb::SyncEntity(); |
| } |
| |
| void SyncData::ImmutableSyncEntityTraits::DestroyWrapper( |
| Wrapper* wrapper) { |
| delete *wrapper; |
| } |
| |
| const sync_pb::SyncEntity& SyncData::ImmutableSyncEntityTraits::Unwrap( |
| const Wrapper& wrapper) { |
| return *wrapper; |
| } |
| |
| sync_pb::SyncEntity* SyncData::ImmutableSyncEntityTraits::UnwrapMutable( |
| Wrapper* wrapper) { |
| return *wrapper; |
| } |
| |
| void SyncData::ImmutableSyncEntityTraits::Swap(sync_pb::SyncEntity* t1, |
| sync_pb::SyncEntity* t2) { |
| t1->Swap(t2); |
| } |
| |
| SyncData::SyncData() |
| : is_valid_(false), |
| id_(kInvalidId) {} |
| |
| SyncData::SyncData(int64 id, |
| sync_pb::SyncEntity* entity, |
| const base::Time& remote_modification_time) |
| : is_valid_(true), |
| id_(id), |
| remote_modification_time_(remote_modification_time), |
| immutable_entity_(entity) {} |
| |
| SyncData::~SyncData() {} |
| |
| // Static. |
| SyncData SyncData::CreateLocalDelete( |
| const std::string& sync_tag, |
| ModelType datatype) { |
| sync_pb::EntitySpecifics specifics; |
| AddDefaultFieldValue(datatype, &specifics); |
| return CreateLocalData(sync_tag, std::string(), specifics); |
| } |
| |
| // Static. |
| SyncData SyncData::CreateLocalData( |
| const std::string& sync_tag, |
| const std::string& non_unique_title, |
| const sync_pb::EntitySpecifics& specifics) { |
| sync_pb::SyncEntity entity; |
| entity.set_client_defined_unique_tag(sync_tag); |
| entity.set_non_unique_name(non_unique_title); |
| entity.mutable_specifics()->CopyFrom(specifics); |
| return SyncData(kInvalidId, &entity, base::Time()); |
| } |
| |
| // Static. |
| SyncData SyncData::CreateRemoteData( |
| int64 id, const sync_pb::EntitySpecifics& specifics, |
| const base::Time& modification_time) { |
| DCHECK_NE(id, kInvalidId); |
| sync_pb::SyncEntity entity; |
| entity.mutable_specifics()->CopyFrom(specifics); |
| return SyncData(id, &entity, modification_time); |
| } |
| |
| bool SyncData::IsValid() const { |
| return is_valid_; |
| } |
| |
| const sync_pb::EntitySpecifics& SyncData::GetSpecifics() const { |
| return immutable_entity_.Get().specifics(); |
| } |
| |
| ModelType SyncData::GetDataType() const { |
| return GetModelTypeFromSpecifics(GetSpecifics()); |
| } |
| |
| const std::string& SyncData::GetTag() const { |
| DCHECK(IsLocal()); |
| return immutable_entity_.Get().client_defined_unique_tag(); |
| } |
| |
| const std::string& SyncData::GetTitle() const { |
| // TODO(zea): set this for data coming from the syncer too. |
| DCHECK(immutable_entity_.Get().has_non_unique_name()); |
| return immutable_entity_.Get().non_unique_name(); |
| } |
| |
| const base::Time& SyncData::GetRemoteModifiedTime() const { |
| DCHECK(!IsLocal()); |
| return remote_modification_time_; |
| } |
| |
| int64 SyncData::GetRemoteId() const { |
| DCHECK(!IsLocal()); |
| return id_; |
| } |
| |
| bool SyncData::IsLocal() const { |
| return id_ == kInvalidId; |
| } |
| |
| std::string SyncData::ToString() const { |
| if (!IsValid()) |
| return "<Invalid SyncData>"; |
| |
| std::string type = ModelTypeToString(GetDataType()); |
| std::string specifics; |
| scoped_ptr<base::DictionaryValue> value( |
| EntitySpecificsToValue(GetSpecifics())); |
| base::JSONWriter::WriteWithOptions(value.get(), |
| base::JSONWriter::OPTIONS_PRETTY_PRINT, |
| &specifics); |
| |
| if (IsLocal()) { |
| return "{ isLocal: true, type: " + type + ", tag: " + GetTag() + |
| ", title: " + GetTitle() + ", specifics: " + specifics + "}"; |
| } |
| |
| std::string id = base::Int64ToString(GetRemoteId()); |
| return "{ isLocal: false, type: " + type + ", specifics: " + specifics + |
| ", id: " + id + "}"; |
| } |
| |
| void PrintTo(const SyncData& sync_data, std::ostream* os) { |
| *os << sync_data.ToString(); |
| } |
| |
| } // namespace syncer |