Home | History | Annotate | Download | only in internal_api
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "sync/internal_api/public/delete_journal.h"
      6 
      7 #include "sync/internal_api/public/base_transaction.h"
      8 #include "sync/syncable/directory.h"
      9 #include "sync/syncable/syncable_base_transaction.h"
     10 
     11 namespace syncer {
     12 
     13 // static
     14 void DeleteJournal::GetBookmarkDeleteJournals(
     15     BaseTransaction* trans, BookmarkDeleteJournalList *delete_journal_list) {
     16   syncer::syncable::EntryKernelSet deleted_entries;
     17   trans->GetDirectory()->delete_journal()->GetDeleteJournals(
     18       trans->GetWrappedTrans(), BOOKMARKS, &deleted_entries);
     19   std::set<int64> undecryptable_journal;
     20   for (syncer::syncable::EntryKernelSet::const_iterator i =
     21       deleted_entries.begin(); i != deleted_entries.end(); ++i) {
     22     delete_journal_list->push_back(BookmarkDeleteJournal());
     23     delete_journal_list->back().id = (*i)->ref(syncer::syncable::META_HANDLE);
     24     delete_journal_list->back().is_folder = (*i)->ref(syncer::syncable::IS_DIR);
     25 
     26     const sync_pb::EntitySpecifics& specifics = (*i)->ref(
     27         syncer::syncable::SPECIFICS);
     28     if (!specifics.has_encrypted()) {
     29       delete_journal_list->back().specifics = specifics;
     30     } else {
     31       std::string plaintext_data = trans->GetCryptographer()->DecryptToString(
     32           specifics.encrypted());
     33       sync_pb::EntitySpecifics unencrypted_data;
     34       if (plaintext_data.length() == 0 ||
     35           !unencrypted_data.ParseFromString(plaintext_data)) {
     36         // Fail to decrypt, Add this delete journal to purge.
     37         undecryptable_journal.insert(delete_journal_list->back().id);
     38         delete_journal_list->pop_back();
     39       } else {
     40         delete_journal_list->back().specifics = unencrypted_data;
     41       }
     42     }
     43   }
     44 
     45   if (!undecryptable_journal.empty()) {
     46     trans->GetDirectory()->delete_journal()->PurgeDeleteJournals(
     47         trans->GetWrappedTrans(), undecryptable_journal);
     48   }
     49 }
     50 
     51 // static
     52 void DeleteJournal::PurgeDeleteJournals(BaseTransaction* trans,
     53                                         const std::set<int64>& ids) {
     54   trans->GetDirectory()->delete_journal()->PurgeDeleteJournals(
     55       trans->GetWrappedTrans(), ids);
     56 }
     57 
     58 }  // namespace syncer
     59