1 // Copyright 2014 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/engine/model_thread_sync_entity.h"
6 #include "sync/syncable/syncable_util.h"
7
8 namespace syncer {
9
NewLocalItem(const std::string & client_tag,const sync_pb::EntitySpecifics & specifics,base::Time now)10 scoped_ptr<ModelThreadSyncEntity> ModelThreadSyncEntity::NewLocalItem(
11 const std::string& client_tag,
12 const sync_pb::EntitySpecifics& specifics,
13 base::Time now) {
14 return scoped_ptr<ModelThreadSyncEntity>(new ModelThreadSyncEntity(
15 1,
16 0,
17 0,
18 kUncommittedVersion,
19 true,
20 std::string(), // Sync thread will assign the initial ID.
21 syncable::GenerateSyncableHash(GetModelTypeFromSpecifics(specifics),
22 client_tag),
23 client_tag, // As non-unique name.
24 specifics,
25 false,
26 now,
27 now));
28 }
29
FromServerUpdate(const std::string & id,const std::string & client_tag_hash,const std::string & non_unique_name,int64 version,const sync_pb::EntitySpecifics & specifics,bool deleted,base::Time ctime,base::Time mtime)30 scoped_ptr<ModelThreadSyncEntity> ModelThreadSyncEntity::FromServerUpdate(
31 const std::string& id,
32 const std::string& client_tag_hash,
33 const std::string& non_unique_name,
34 int64 version,
35 const sync_pb::EntitySpecifics& specifics,
36 bool deleted,
37 base::Time ctime,
38 base::Time mtime) {
39 return scoped_ptr<ModelThreadSyncEntity>(
40 new ModelThreadSyncEntity(0,
41 0,
42 0,
43 version,
44 true,
45 id,
46 client_tag_hash,
47 non_unique_name,
48 specifics,
49 deleted,
50 ctime,
51 mtime));
52 }
53
ModelThreadSyncEntity(int64 sequence_number,int64 commit_requested_sequence_number,int64 acked_sequence_number,int64 base_version,bool is_dirty,const std::string & id,const std::string & client_tag_hash,const std::string & non_unique_name,const sync_pb::EntitySpecifics & specifics,bool deleted,base::Time ctime,base::Time mtime)54 ModelThreadSyncEntity::ModelThreadSyncEntity(
55 int64 sequence_number,
56 int64 commit_requested_sequence_number,
57 int64 acked_sequence_number,
58 int64 base_version,
59 bool is_dirty,
60 const std::string& id,
61 const std::string& client_tag_hash,
62 const std::string& non_unique_name,
63 const sync_pb::EntitySpecifics& specifics,
64 bool deleted,
65 base::Time ctime,
66 base::Time mtime)
67 : sequence_number_(sequence_number),
68 commit_requested_sequence_number_(commit_requested_sequence_number),
69 acked_sequence_number_(acked_sequence_number),
70 base_version_(base_version),
71 is_dirty_(is_dirty),
72 id_(id),
73 client_tag_hash_(client_tag_hash),
74 non_unique_name_(non_unique_name),
75 specifics_(specifics),
76 deleted_(deleted),
77 ctime_(ctime),
78 mtime_(mtime) {
79 }
80
~ModelThreadSyncEntity()81 ModelThreadSyncEntity::~ModelThreadSyncEntity() {
82 }
83
IsWriteRequired() const84 bool ModelThreadSyncEntity::IsWriteRequired() const {
85 return is_dirty_;
86 }
87
IsUnsynced() const88 bool ModelThreadSyncEntity::IsUnsynced() const {
89 return sequence_number_ > acked_sequence_number_;
90 }
91
RequiresCommitRequest() const92 bool ModelThreadSyncEntity::RequiresCommitRequest() const {
93 return sequence_number_ > commit_requested_sequence_number_;
94 }
95
UpdateIsReflection(int64 update_version) const96 bool ModelThreadSyncEntity::UpdateIsReflection(int64 update_version) const {
97 return base_version_ >= update_version;
98 }
99
UpdateIsInConflict(int64 update_version) const100 bool ModelThreadSyncEntity::UpdateIsInConflict(int64 update_version) const {
101 return IsUnsynced() && !UpdateIsReflection(update_version);
102 }
103
ApplyUpdateFromServer(int64 update_version,bool deleted,const sync_pb::EntitySpecifics & specifics,base::Time mtime)104 void ModelThreadSyncEntity::ApplyUpdateFromServer(
105 int64 update_version,
106 bool deleted,
107 const sync_pb::EntitySpecifics& specifics,
108 base::Time mtime) {
109 // There was a conflict and the server just won it.
110 // This implicitly acks all outstanding commits because a received update
111 // will clobber any pending commits on the sync thread.
112 acked_sequence_number_ = sequence_number_;
113 commit_requested_sequence_number_ = sequence_number_;
114
115 base_version_ = update_version;
116 specifics_ = specifics;
117 mtime_ = mtime;
118 }
119
MakeLocalChange(const sync_pb::EntitySpecifics & specifics)120 void ModelThreadSyncEntity::MakeLocalChange(
121 const sync_pb::EntitySpecifics& specifics) {
122 sequence_number_++;
123 specifics_ = specifics;
124 }
125
Delete()126 void ModelThreadSyncEntity::Delete() {
127 sequence_number_++;
128 specifics_.Clear();
129 deleted_ = true;
130 }
131
InitializeCommitRequestData(CommitRequestData * request) const132 void ModelThreadSyncEntity::InitializeCommitRequestData(
133 CommitRequestData* request) const {
134 request->id = id_;
135 request->client_tag_hash = client_tag_hash_;
136 request->sequence_number = sequence_number_;
137 request->base_version = base_version_;
138 request->ctime = ctime_;
139 request->mtime = mtime_;
140 request->non_unique_name = non_unique_name_;
141 request->deleted = deleted_;
142 request->specifics.CopyFrom(specifics_);
143 }
144
SetCommitRequestInProgress()145 void ModelThreadSyncEntity::SetCommitRequestInProgress() {
146 commit_requested_sequence_number_ = sequence_number_;
147 }
148
ReceiveCommitResponse(const std::string & id,int64 sequence_number,int64 response_version)149 void ModelThreadSyncEntity::ReceiveCommitResponse(const std::string& id,
150 int64 sequence_number,
151 int64 response_version) {
152 id_ = id; // The server can assign us a new ID in a commit response.
153 acked_sequence_number_ = sequence_number;
154 base_version_ = response_version;
155 }
156
157 } // namespace syncer
158