// Copyright 2014 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/engine/model_thread_sync_entity.h" #include "sync/syncable/syncable_util.h" namespace syncer { scoped_ptr<ModelThreadSyncEntity> ModelThreadSyncEntity::NewLocalItem( const std::string& client_tag, const sync_pb::EntitySpecifics& specifics, base::Time now) { return scoped_ptr<ModelThreadSyncEntity>(new ModelThreadSyncEntity( 1, 0, 0, kUncommittedVersion, true, std::string(), // Sync thread will assign the initial ID. syncable::GenerateSyncableHash(GetModelTypeFromSpecifics(specifics), client_tag), client_tag, // As non-unique name. specifics, false, now, now)); } scoped_ptr<ModelThreadSyncEntity> ModelThreadSyncEntity::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) { return scoped_ptr<ModelThreadSyncEntity>( new ModelThreadSyncEntity(0, 0, 0, version, true, id, client_tag_hash, non_unique_name, specifics, deleted, ctime, mtime)); } ModelThreadSyncEntity::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) : sequence_number_(sequence_number), commit_requested_sequence_number_(commit_requested_sequence_number), acked_sequence_number_(acked_sequence_number), base_version_(base_version), is_dirty_(is_dirty), id_(id), client_tag_hash_(client_tag_hash), non_unique_name_(non_unique_name), specifics_(specifics), deleted_(deleted), ctime_(ctime), mtime_(mtime) { } ModelThreadSyncEntity::~ModelThreadSyncEntity() { } bool ModelThreadSyncEntity::IsWriteRequired() const { return is_dirty_; } bool ModelThreadSyncEntity::IsUnsynced() const { return sequence_number_ > acked_sequence_number_; } bool ModelThreadSyncEntity::RequiresCommitRequest() const { return sequence_number_ > commit_requested_sequence_number_; } bool ModelThreadSyncEntity::UpdateIsReflection(int64 update_version) const { return base_version_ >= update_version; } bool ModelThreadSyncEntity::UpdateIsInConflict(int64 update_version) const { return IsUnsynced() && !UpdateIsReflection(update_version); } void ModelThreadSyncEntity::ApplyUpdateFromServer( int64 update_version, bool deleted, const sync_pb::EntitySpecifics& specifics, base::Time mtime) { // There was a conflict and the server just won it. // This implicitly acks all outstanding commits because a received update // will clobber any pending commits on the sync thread. acked_sequence_number_ = sequence_number_; commit_requested_sequence_number_ = sequence_number_; base_version_ = update_version; specifics_ = specifics; mtime_ = mtime; } void ModelThreadSyncEntity::MakeLocalChange( const sync_pb::EntitySpecifics& specifics) { sequence_number_++; specifics_ = specifics; } void ModelThreadSyncEntity::Delete() { sequence_number_++; specifics_.Clear(); deleted_ = true; } void ModelThreadSyncEntity::InitializeCommitRequestData( CommitRequestData* request) const { request->id = id_; request->client_tag_hash = client_tag_hash_; request->sequence_number = sequence_number_; request->base_version = base_version_; request->ctime = ctime_; request->mtime = mtime_; request->non_unique_name = non_unique_name_; request->deleted = deleted_; request->specifics.CopyFrom(specifics_); } void ModelThreadSyncEntity::SetCommitRequestInProgress() { commit_requested_sequence_number_ = sequence_number_; } void ModelThreadSyncEntity::ReceiveCommitResponse(const std::string& id, int64 sequence_number, int64 response_version) { id_ = id; // The server can assign us a new ID in a commit response. acked_sequence_number_ = sequence_number; base_version_ = response_version; } } // namespace syncer