Index: sync/internal_api/delete_journal.cc |
diff --git a/sync/internal_api/delete_journal.cc b/sync/internal_api/delete_journal.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ebeb5a761268ace27fa7ce2281211dd633109edd |
--- /dev/null |
+++ b/sync/internal_api/delete_journal.cc |
@@ -0,0 +1,58 @@ |
+// 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 "sync/internal_api/public/delete_journal.h" |
+ |
+#include "sync/internal_api/public/base_transaction.h" |
+#include "sync/syncable/directory.h" |
+#include "sync/syncable/syncable_base_transaction.h" |
+ |
+namespace syncer { |
+ |
+// static |
+void DeleteJournal::GetBookmarkDeleteJournals( |
+ BaseTransaction* trans, BookmarkDeleteJournalList *delete_journal_list) { |
+ syncer::syncable::EntryKernelSet deleted_entries; |
+ trans->GetDirectory()->delete_journal()->GetDeleteJournals( |
+ trans->GetWrappedTrans(), BOOKMARKS, &deleted_entries); |
+ std::set<int64> undecryptable_journal; |
+ for (syncer::syncable::EntryKernelSet::const_iterator i = |
+ deleted_entries.begin(); i != deleted_entries.end(); ++i) { |
+ delete_journal_list->push_back(BookmarkDeleteJournal()); |
+ delete_journal_list->back().id = (*i)->ref(syncer::syncable::META_HANDLE); |
+ delete_journal_list->back().is_folder = (*i)->ref(syncer::syncable::IS_DIR); |
+ |
+ const sync_pb::EntitySpecifics& specifics = (*i)->ref( |
+ syncer::syncable::SPECIFICS); |
+ if (!specifics.has_encrypted()) { |
+ delete_journal_list->back().specifics = specifics; |
+ } else { |
+ std::string plaintext_data = trans->GetCryptographer()->DecryptToString( |
+ specifics.encrypted()); |
+ sync_pb::EntitySpecifics unencrypted_data; |
+ if (plaintext_data.length() == 0 || |
+ !unencrypted_data.ParseFromString(plaintext_data)) { |
+ // Fail to decrypt, Add this delete journal to purge. |
+ undecryptable_journal.insert(delete_journal_list->back().id); |
+ delete_journal_list->pop_back(); |
+ } else { |
+ delete_journal_list->back().specifics = unencrypted_data; |
+ } |
+ } |
+ } |
+ |
+ if (!undecryptable_journal.empty()) { |
+ trans->GetDirectory()->delete_journal()->PurgeDeleteJournals( |
+ trans->GetWrappedTrans(), undecryptable_journal); |
+ } |
+} |
+ |
+// static |
+void DeleteJournal::PurgeDeleteJournals(BaseTransaction* trans, |
+ const std::set<int64>& ids) { |
+ trans->GetDirectory()->delete_journal()->PurgeDeleteJournals( |
+ trans->GetWrappedTrans(), ids); |
+} |
+ |
+} // namespace syncer |