Chromium Code Reviews| Index: chrome/browser/sync/engine/build_commit_command.cc |
| =================================================================== |
| --- chrome/browser/sync/engine/build_commit_command.cc (revision 0) |
| +++ chrome/browser/sync/engine/build_commit_command.cc (revision 0) |
| @@ -0,0 +1,143 @@ |
| +// Copyright (c) 2006-2009 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 <set> |
| +#include <string> |
| +#include <vector> |
| + |
| +#include "chrome/browser/sync/engine/syncer_proto_util.h" |
| +#include "chrome/browser/sync/engine/syncer_session.h" |
| +#include "chrome/browser/sync/engine/syncer_util.h" |
| +#include "chrome/browser/sync/engine/syncproto.h" |
| +#include "chrome/browser/sync/syncable/syncable.h" |
| +#include "chrome/browser/sync/syncable/syncable_changes_version.h" |
| +#include "chrome/browser/sync/util/character_set_converters.h" |
| +#include "chrome/browser/sync/util/sync_types.h" |
| + |
| +using std::set; |
| +using std::string; |
| +using std::vector; |
| +using syncable::ExtendedAttribute; |
| +using syncable::Id; |
| +using syncable::MutableEntry; |
| +using syncable::Name; |
| + |
| +namespace browser_sync { |
| + |
| +BuildCommitCommand::BuildCommitCommand() {} |
| +BuildCommitCommand::~BuildCommitCommand() {} |
| + |
| +void BuildCommitCommand::ExecuteImpl(SyncerSession *session) { |
|
idana
2009/09/10 05:44:37
nit: "SyncerSession *session" -> "SyncerSession* s
|
| + ClientToServerMessage message; |
| + message.set_share(ToUTF8(session->account_name()).get_string()); |
| + message.set_message_contents(ClientToServerMessage::COMMIT); |
| + |
| + CommitMessage* commit_message = message.mutable_commit(); |
| + commit_message->set_cache_guid( |
| + session->write_transaction()->directory()->cache_guid()); |
| + |
| + const vector<Id>& commit_ids = session->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); |
| + |
| + Name name = meta_entry.GetName(); |
| + CHECK(!name.value().empty()); // Make sure this isn't an update. |
| + sync_entry->set_name(ToUTF8(name.value()).get_string()); |
| + // Set the non_unique_name if we have one. 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. Even though |
| + // we could get away with only sending |name|, we send both because it |
| + // may aid in logging. |
| + if (name.value() != name.non_unique_value()) { |
| + sync_entry->set_non_unique_name( |
| + ToUTF8(name.non_unique_value()).get_string()); |
| + } |
| + // deleted items with negative parent ids can be a problem so we set the |
|
idana
2009/09/10 05:44:37
"deleted" -> "Deleted"
|
| + // parent to 0. (TODO(sync): Still true in protocol? |
|
idana
2009/09/10 05:44:37
Missing ")." at the end of this sentence.
|
| + 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); |
| + // TODO(sync): Investigate all places that think transactional commits |
| + // actually exist. |
| + // |
| + // This is the only logic we'll need when transactional commits are |
| + // moved to the server. |
| + // If our parent has changes, send up the old one so the server can |
| + // correctly deal with multiple parents. |
| + 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) { |
| + // If this CHECK triggers during unit testing, check that we haven't |
| + // altered an item that's an unapplied update. |
| + CHECK(!id.ServerKnows()) << meta_entry; |
| + sync_entry->set_version(0); |
| + } else { |
| + CHECK(id.ServerKnows()) << meta_entry; |
| + sync_entry->set_version(meta_entry.Get(syncable::BASE_VERSION)); |
| + } |
| + sync_entry->set_ctime(ClientTimeToServerTime( |
| + meta_entry.Get(syncable::CTIME))); |
| + sync_entry->set_mtime(ClientTimeToServerTime( |
| + meta_entry.Get(syncable::MTIME))); |
| + |
| + set<ExtendedAttribute> extended_attributes; |
| + meta_entry.GetAllExtendedAttributes( |
| + session->write_transaction(), &extended_attributes); |
| + set<ExtendedAttribute>::iterator iter; |
| + sync_pb::ExtendedAttributes* mutable_extended_attributes = |
| + sync_entry->mutable_extended_attributes(); |
| + for (iter = extended_attributes.begin(); iter != extended_attributes.end(); |
| + ++iter) { |
| + sync_pb::ExtendedAttributes_ExtendedAttribute *extended_attribute = |
| + mutable_extended_attributes->add_extendedattribute(); |
| + extended_attribute->set_key(ToUTF8(iter->key()).get_string()); |
| + SyncerProtoUtil::CopyBlobIntoProtoBytes(iter->value(), |
| + extended_attribute->mutable_value()); |
| + } |
| + |
| + // Deletion is final on the server, let's move things and then delete them. |
| + if (meta_entry.Get(syncable::IS_DEL)) { |
| + sync_entry->set_deleted(true); |
| + } else if (meta_entry.Get(syncable::IS_BOOKMARK_OBJECT)) { |
| + sync_pb::SyncEntity_BookmarkData* bookmark = |
| + sync_entry->mutable_bookmarkdata(); |
| + bookmark->set_bookmark_folder(meta_entry.Get(syncable::IS_DIR)); |
| + const Id& prev_id = meta_entry.Get(syncable::PREV_ID); |
| + string prev_string = prev_id.IsRoot() ? string() : prev_id.GetServerId(); |
| + sync_entry->set_insert_after_item_id(prev_string); |
| + |
| + if (!meta_entry.Get(syncable::IS_DIR)) { |
| + string bookmark_url = ToUTF8(meta_entry.Get(syncable::BOOKMARK_URL)); |
| + bookmark->set_bookmark_url(bookmark_url); |
| + SyncerProtoUtil::CopyBlobIntoProtoBytes( |
| + meta_entry.Get(syncable::BOOKMARK_FAVICON), |
| + bookmark->mutable_bookmark_favicon()); |
| + } |
| + } |
| + } |
| + session->set_commit_message(message); |
| +} |
| + |
| +} // namespace browser_sync |
| Property changes on: chrome\browser\sync\engine\build_commit_command.cc |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |