Index: chrome/browser/sync/engine/build_commit_command.cc |
diff --git a/chrome/browser/sync/engine/build_commit_command.cc b/chrome/browser/sync/engine/build_commit_command.cc |
deleted file mode 100644 |
index c2a40f1f466335878a2dd2be710dc930b11cfab3..0000000000000000000000000000000000000000 |
--- a/chrome/browser/sync/engine/build_commit_command.cc |
+++ /dev/null |
@@ -1,255 +0,0 @@ |
-// 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 "chrome/browser/sync/engine/build_commit_command.h" |
- |
-#include <limits> |
-#include <set> |
-#include <string> |
-#include <vector> |
- |
-#include "base/string_util.h" |
-#include "chrome/browser/sync/engine/syncer_proto_util.h" |
-#include "chrome/browser/sync/sessions/sync_session.h" |
-#include "chrome/browser/sync/syncable/syncable.h" |
-#include "chrome/browser/sync/syncable/syncable_changes_version.h" |
-#include "chrome/browser/sync/util/time.h" |
-#include "sync/protocol/bookmark_specifics.pb.h" |
- |
-using std::set; |
-using std::string; |
-using std::vector; |
-using syncable::Entry; |
-using syncable::IS_DEL; |
-using syncable::SERVER_POSITION_IN_PARENT; |
-using syncable::IS_UNAPPLIED_UPDATE; |
-using syncable::IS_UNSYNCED; |
-using syncable::Id; |
-using syncable::MutableEntry; |
-using syncable::SPECIFICS; |
-using syncable::UNSPECIFIED; |
- |
-namespace browser_sync { |
- |
-using sessions::SyncSession; |
- |
-// static |
-int64 BuildCommitCommand::GetFirstPosition() { |
- return std::numeric_limits<int64>::min(); |
-} |
- |
-// static |
-int64 BuildCommitCommand::GetLastPosition() { |
- return std::numeric_limits<int64>::max(); |
-} |
- |
-// static |
-int64 BuildCommitCommand::GetGap() { |
- return 1LL << 20; |
-} |
- |
-BuildCommitCommand::BuildCommitCommand() {} |
-BuildCommitCommand::~BuildCommitCommand() {} |
- |
-void BuildCommitCommand::AddExtensionsActivityToMessage( |
- SyncSession* session, CommitMessage* message) { |
- // We only send ExtensionsActivity to the server if bookmarks are being |
- // committed. |
- ExtensionsActivityMonitor* monitor = session->context()->extensions_monitor(); |
- if (!session->status_controller().HasBookmarkCommitActivity()) { |
- // Return the records to the activity monitor. |
- monitor->PutRecords(session->extensions_activity()); |
- session->mutable_extensions_activity()->clear(); |
- return; |
- } |
- const ExtensionsActivityMonitor::Records& records = |
- session->extensions_activity(); |
- for (ExtensionsActivityMonitor::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); |
- } |
-} |
- |
-namespace { |
-void SetEntrySpecifics(MutableEntry* meta_entry, SyncEntity* sync_entry) { |
- // Add the new style extension and the folder bit. |
- sync_entry->mutable_specifics()->CopyFrom(meta_entry->Get(SPECIFICS)); |
- sync_entry->set_folder(meta_entry->Get(syncable::IS_DIR)); |
- |
- DCHECK(meta_entry->GetModelType() == sync_entry->GetModelType()); |
-} |
-} // namespace |
- |
-SyncerError BuildCommitCommand::ExecuteImpl(SyncSession* session) { |
- ClientToServerMessage message; |
- message.set_share(session->context()->account_name()); |
- message.set_message_contents(ClientToServerMessage::COMMIT); |
- |
- CommitMessage* commit_message = message.mutable_commit(); |
- commit_message->set_cache_guid( |
- session->write_transaction()->directory()->cache_guid()); |
- AddExtensionsActivityToMessage(session, commit_message); |
- SyncerProtoUtil::AddRequestBirthday( |
- session->write_transaction()->directory(), &message); |
- |
- // Cache previously computed position values. Because |commit_ids| |
- // is already in sibling order, we should always hit this map after |
- // the first sibling in a consecutive run of commit items. The |
- // entries in this map are (low, high) values describing the |
- // space of positions that are immediate successors of the item |
- // whose ID is the map's key. |
- std::map<Id, std::pair<int64, int64> > position_map; |
- |
- const vector<Id>& commit_ids = session->status_controller().commit_ids(); |
- for (size_t i = 0; i < commit_ids.size(); i++) { |
- Id id = commit_ids[i]; |
- SyncEntity* sync_entry = |
- static_cast<SyncEntity*>(commit_message->add_entries()); |
- sync_entry->set_id(id); |
- MutableEntry meta_entry(session->write_transaction(), |
- syncable::GET_BY_ID, |
- id); |
- CHECK(meta_entry.good()); |
- // This is the only change we make to the entry in this function. |
- meta_entry.Put(syncable::SYNCING, true); |
- |
- DCHECK(0 != session->routing_info().count(meta_entry.GetModelType())) |
- << "Committing change to datatype that's not actively enabled."; |
- |
- string name = meta_entry.Get(syncable::NON_UNIQUE_NAME); |
- CHECK(!name.empty()); // Make sure this isn't an update. |
- 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.Get(syncable::UNIQUE_CLIENT_TAG).empty()) { |
- sync_entry->set_client_defined_unique_tag( |
- meta_entry.Get(syncable::UNIQUE_CLIENT_TAG)); |
- } |
- |
- // 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.Get(syncable::IS_DEL) && |
- !meta_entry.Get(syncable::PARENT_ID).ServerKnows()) { |
- new_parent_id = session->write_transaction()->root_id(); |
- } else { |
- new_parent_id = meta_entry.Get(syncable::PARENT_ID); |
- } |
- sync_entry->set_parent_id(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.Get(syncable::SERVER_PARENT_ID) && |
- 0 != meta_entry.Get(syncable::BASE_VERSION) && |
- syncable::CHANGES_VERSION != meta_entry.Get(syncable::BASE_VERSION)) { |
- sync_entry->set_old_parent_id(meta_entry.Get(syncable::SERVER_PARENT_ID)); |
- } |
- |
- int64 version = meta_entry.Get(syncable::BASE_VERSION); |
- if (syncable::CHANGES_VERSION == version || 0 == version) { |
- // Undeletions are only supported for items that have a client tag. |
- DCHECK(!id.ServerKnows() || |
- !meta_entry.Get(syncable::UNIQUE_CLIENT_TAG).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.Get(syncable::BASE_VERSION)); |
- } |
- sync_entry->set_ctime(TimeToProtoTime(meta_entry.Get(syncable::CTIME))); |
- sync_entry->set_mtime(TimeToProtoTime(meta_entry.Get(syncable::MTIME))); |
- |
- // Deletion is final on the server, let's move things and then delete them. |
- if (meta_entry.Get(IS_DEL)) { |
- sync_entry->set_deleted(true); |
- } else { |
- if (meta_entry.Get(SPECIFICS).has_bookmark()) { |
- // Common data in both new and old protocol. |
- const Id& prev_id = meta_entry.Get(syncable::PREV_ID); |
- string prev_id_string = |
- prev_id.IsRoot() ? string() : prev_id.GetServerId(); |
- sync_entry->set_insert_after_item_id(prev_id_string); |
- |
- // Compute a numeric position based on what we know locally. |
- std::pair<int64, int64> position_block( |
- GetFirstPosition(), GetLastPosition()); |
- std::map<Id, std::pair<int64, int64> >::iterator prev_pos = |
- position_map.find(prev_id); |
- if (prev_pos != position_map.end()) { |
- position_block = prev_pos->second; |
- position_map.erase(prev_pos); |
- } else { |
- position_block = std::make_pair( |
- FindAnchorPosition(syncable::PREV_ID, meta_entry), |
- FindAnchorPosition(syncable::NEXT_ID, meta_entry)); |
- } |
- position_block.first = InterpolatePosition(position_block.first, |
- position_block.second); |
- |
- position_map[id] = position_block; |
- sync_entry->set_position_in_parent(position_block.first); |
- } |
- SetEntrySpecifics(&meta_entry, sync_entry); |
- } |
- } |
- session->mutable_status_controller()-> |
- mutable_commit_message()->CopyFrom(message); |
- |
- return SYNCER_OK; |
-} |
- |
-int64 BuildCommitCommand::FindAnchorPosition(syncable::IdField direction, |
- const syncable::Entry& entry) { |
- Id next_id = entry.Get(direction); |
- while (!next_id.IsRoot()) { |
- Entry next_entry(entry.trans(), |
- syncable::GET_BY_ID, |
- next_id); |
- if (!next_entry.Get(IS_UNSYNCED) && !next_entry.Get(IS_UNAPPLIED_UPDATE)) { |
- return next_entry.Get(SERVER_POSITION_IN_PARENT); |
- } |
- next_id = next_entry.Get(direction); |
- } |
- return |
- direction == syncable::PREV_ID ? |
- GetFirstPosition() : GetLastPosition(); |
-} |
- |
-int64 BuildCommitCommand::InterpolatePosition(const int64 lo, |
- const int64 hi) { |
- DCHECK_LE(lo, hi); |
- |
- // The first item to be added under a parent gets a position of zero. |
- if (lo == GetFirstPosition() && hi == GetLastPosition()) |
- return 0; |
- |
- // For small gaps, we do linear interpolation. For larger gaps, |
- // we use an additive offset of |GetGap()|. We are careful to avoid |
- // signed integer overflow. |
- uint64 delta = static_cast<uint64>(hi) - static_cast<uint64>(lo); |
- if (delta <= static_cast<uint64>(GetGap()*2)) |
- return lo + (static_cast<int64>(delta) + 7) / 8; // Interpolate. |
- else if (lo == GetFirstPosition()) |
- return hi - GetGap(); // Extend range just before successor. |
- else |
- return lo + GetGap(); // Use or extend range just after predecessor. |
-} |
- |
- |
-} // namespace browser_sync |