| Index: sync/engine/build_commit_command.cc
|
| diff --git a/sync/engine/build_commit_command.cc b/sync/engine/build_commit_command.cc
|
| deleted file mode 100644
|
| index 65f1cdfb9cf7616692547406ae3f13a5a07579a6..0000000000000000000000000000000000000000
|
| --- a/sync/engine/build_commit_command.cc
|
| +++ /dev/null
|
| @@ -1,225 +0,0 @@
|
| -// Copyright 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/engine/build_commit_command.h"
|
| -
|
| -#include <limits>
|
| -#include <set>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/strings/string_util.h"
|
| -#include "sync/engine/syncer_proto_util.h"
|
| -#include "sync/internal_api/public/base/unique_position.h"
|
| -#include "sync/protocol/bookmark_specifics.pb.h"
|
| -#include "sync/protocol/sync.pb.h"
|
| -#include "sync/sessions/ordered_commit_set.h"
|
| -#include "sync/sessions/sync_session.h"
|
| -#include "sync/syncable/directory.h"
|
| -#include "sync/syncable/entry.h"
|
| -#include "sync/syncable/syncable_base_transaction.h"
|
| -#include "sync/syncable/syncable_changes_version.h"
|
| -#include "sync/syncable/syncable_proto_util.h"
|
| -#include "sync/util/time.h"
|
| -
|
| -using std::set;
|
| -using std::string;
|
| -using std::vector;
|
| -
|
| -namespace syncer {
|
| -
|
| -using sessions::SyncSession;
|
| -using syncable::Entry;
|
| -using syncable::IS_DEL;
|
| -using syncable::IS_UNAPPLIED_UPDATE;
|
| -using syncable::IS_UNSYNCED;
|
| -using syncable::Id;
|
| -using syncable::SPECIFICS;
|
| -using syncable::UNIQUE_POSITION;
|
| -
|
| -BuildCommitCommand::BuildCommitCommand(
|
| - syncable::BaseTransaction* trans,
|
| - const sessions::OrderedCommitSet& batch_commit_set,
|
| - sync_pb::ClientToServerMessage* commit_message,
|
| - ExtensionsActivity::Records* extensions_activity_buffer)
|
| - : trans_(trans),
|
| - batch_commit_set_(batch_commit_set),
|
| - commit_message_(commit_message),
|
| - extensions_activity_buffer_(extensions_activity_buffer) {
|
| -}
|
| -
|
| -BuildCommitCommand::~BuildCommitCommand() {}
|
| -
|
| -void BuildCommitCommand::AddExtensionsActivityToMessage(
|
| - SyncSession* session, sync_pb::CommitMessage* message) {
|
| - // We only send ExtensionsActivity to the server if bookmarks are being
|
| - // committed.
|
| - ExtensionsActivity* activity = session->context()->extensions_activity();
|
| - if (batch_commit_set_.HasBookmarkCommitId()) {
|
| - // This isn't perfect, since the set of extensions activity may not
|
| - // correlate exactly with the items being committed. That's OK as
|
| - // long as we're looking for a rough estimate of extensions activity,
|
| - // not an precise mapping of which commits were triggered by which
|
| - // extension.
|
| - //
|
| - // We will push this list of extensions activity back into the
|
| - // ExtensionsActivityMonitor if this commit fails. That's why we must keep
|
| - // a copy of these records in the session.
|
| - activity->GetAndClearRecords(extensions_activity_buffer_);
|
| -
|
| - const ExtensionsActivity::Records& records =
|
| - *extensions_activity_buffer_;
|
| - for (ExtensionsActivity::Records::const_iterator it =
|
| - records.begin();
|
| - it != records.end(); ++it) {
|
| - sync_pb::ChromiumExtensionsActivity* activity_message =
|
| - message->add_extensions_activity();
|
| - activity_message->set_extension_id(it->second.extension_id);
|
| - activity_message->set_bookmark_writes_since_last_commit(
|
| - it->second.bookmark_write_count);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void BuildCommitCommand::AddClientConfigParamsToMessage(
|
| - SyncSession* session, sync_pb::CommitMessage* message) {
|
| - const ModelSafeRoutingInfo& routing_info = session->context()->routing_info();
|
| - sync_pb::ClientConfigParams* config_params = message->mutable_config_params();
|
| - for (std::map<ModelType, ModelSafeGroup>::const_iterator iter =
|
| - routing_info.begin(); iter != routing_info.end(); ++iter) {
|
| - if (ProxyTypes().Has(iter->first))
|
| - continue;
|
| - int field_number = GetSpecificsFieldNumberFromModelType(iter->first);
|
| - config_params->mutable_enabled_type_ids()->Add(field_number);
|
| - }
|
| - config_params->set_tabs_datatype_enabled(
|
| - routing_info.count(syncer::PROXY_TABS) > 0);
|
| -}
|
| -
|
| -namespace {
|
| -void SetEntrySpecifics(const Entry& meta_entry,
|
| - sync_pb::SyncEntity* sync_entry) {
|
| - // Add the new style extension and the folder bit.
|
| - sync_entry->mutable_specifics()->CopyFrom(meta_entry.GetSpecifics());
|
| - sync_entry->set_folder(meta_entry.GetIsDir());
|
| -
|
| - CHECK(!sync_entry->specifics().password().has_client_only_encrypted_data());
|
| - DCHECK_EQ(meta_entry.GetModelType(), GetModelType(*sync_entry));
|
| -}
|
| -} // namespace
|
| -
|
| -SyncerError BuildCommitCommand::ExecuteImpl(SyncSession* session) {
|
| - commit_message_->set_share(session->context()->account_name());
|
| - commit_message_->set_message_contents(sync_pb::ClientToServerMessage::COMMIT);
|
| -
|
| - sync_pb::CommitMessage* commit_message = commit_message_->mutable_commit();
|
| - commit_message->set_cache_guid(trans_->directory()->cache_guid());
|
| - AddExtensionsActivityToMessage(session, commit_message);
|
| - AddClientConfigParamsToMessage(session, commit_message);
|
| -
|
| - for (size_t i = 0; i < batch_commit_set_.Size(); i++) {
|
| - int64 handle = batch_commit_set_.GetCommitHandleAt(i);
|
| - sync_pb::SyncEntity* sync_entry = commit_message->add_entries();
|
| -
|
| - Entry meta_entry(trans_, syncable::GET_BY_HANDLE, handle);
|
| - CHECK(meta_entry.good());
|
| -
|
| - DCHECK_NE(0UL,
|
| - session->context()->routing_info().count(
|
| - meta_entry.GetModelType()))
|
| - << "Committing change to datatype that's not actively enabled.";
|
| -
|
| - BuildCommitItem(meta_entry, sync_entry);
|
| - }
|
| -
|
| -
|
| - return SYNCER_OK;
|
| -}
|
| -
|
| -// static.
|
| -void BuildCommitCommand::BuildCommitItem(
|
| - const syncable::Entry& meta_entry,
|
| - sync_pb::SyncEntity* sync_entry) {
|
| - syncable::Id id = meta_entry.GetId();
|
| - sync_entry->set_id_string(SyncableIdToProto(id));
|
| -
|
| - string name = meta_entry.GetNonUniqueName();
|
| - CHECK(!name.empty()); // Make sure this isn't an update.
|
| - // Note: Truncation is also performed in WriteNode::SetTitle(..). But this
|
| - // call is still necessary to handle any title changes that might originate
|
| - // elsewhere, or already be persisted in the directory.
|
| - TruncateUTF8ToByteSize(name, 255, &name);
|
| - sync_entry->set_name(name);
|
| -
|
| - // Set the non_unique_name. If we do, the server ignores
|
| - // the |name| value (using |non_unique_name| instead), and will return
|
| - // in the CommitResponse a unique name if one is generated.
|
| - // We send both because it may aid in logging.
|
| - sync_entry->set_non_unique_name(name);
|
| -
|
| - if (!meta_entry.GetUniqueClientTag().empty()) {
|
| - sync_entry->set_client_defined_unique_tag(
|
| - meta_entry.GetUniqueClientTag());
|
| - }
|
| -
|
| - // Deleted items with server-unknown parent ids can be a problem so we set
|
| - // the parent to 0. (TODO(sync): Still true in protocol?).
|
| - Id new_parent_id;
|
| - if (meta_entry.GetIsDel() &&
|
| - !meta_entry.GetParentId().ServerKnows()) {
|
| - new_parent_id = syncable::BaseTransaction::root_id();
|
| - } else {
|
| - new_parent_id = meta_entry.GetParentId();
|
| - }
|
| - sync_entry->set_parent_id_string(SyncableIdToProto(new_parent_id));
|
| -
|
| - // If our parent has changed, send up the old one so the server
|
| - // can correctly deal with multiple parents.
|
| - // TODO(nick): With the server keeping track of the primary sync parent,
|
| - // it should not be necessary to provide the old_parent_id: the version
|
| - // number should suffice.
|
| - if (new_parent_id != meta_entry.GetServerParentId() &&
|
| - 0 != meta_entry.GetBaseVersion() &&
|
| - syncable::CHANGES_VERSION != meta_entry.GetBaseVersion()) {
|
| - sync_entry->set_old_parent_id(
|
| - SyncableIdToProto(meta_entry.GetServerParentId()));
|
| - }
|
| -
|
| - int64 version = meta_entry.GetBaseVersion();
|
| - if (syncable::CHANGES_VERSION == version || 0 == version) {
|
| - // Undeletions are only supported for items that have a client tag.
|
| - DCHECK(!id.ServerKnows() ||
|
| - !meta_entry.GetUniqueClientTag().empty())
|
| - << meta_entry;
|
| -
|
| - // Version 0 means to create or undelete an object.
|
| - sync_entry->set_version(0);
|
| - } else {
|
| - DCHECK(id.ServerKnows()) << meta_entry;
|
| - sync_entry->set_version(meta_entry.GetBaseVersion());
|
| - }
|
| - sync_entry->set_ctime(TimeToProtoTime(meta_entry.GetCtime()));
|
| - sync_entry->set_mtime(TimeToProtoTime(meta_entry.GetMtime()));
|
| -
|
| - // Deletion is final on the server, let's move things and then delete them.
|
| - if (meta_entry.GetIsDel()) {
|
| - sync_entry->set_deleted(true);
|
| - } else {
|
| - if (meta_entry.GetSpecifics().has_bookmark()) {
|
| - // Both insert_after_item_id and position_in_parent fields are set only
|
| - // for legacy reasons. See comments in sync.proto for more information.
|
| - const Id& prev_id = meta_entry.GetPredecessorId();
|
| - string prev_id_string =
|
| - prev_id.IsRoot() ? string() : prev_id.GetServerId();
|
| - sync_entry->set_insert_after_item_id(prev_id_string);
|
| - sync_entry->set_position_in_parent(
|
| - meta_entry.GetUniquePosition().ToInt64());
|
| - meta_entry.GetUniquePosition().ToProto(
|
| - sync_entry->mutable_unique_position());
|
| - }
|
| - SetEntrySpecifics(meta_entry, sync_entry);
|
| - }
|
| -}
|
| -
|
| -} // namespace syncer
|
|
|