Home | History | Annotate | Download | only in internal_api
      1 // Copyright 2014 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/sync_rollback_manager_base.h"
      6 
      7 #include "sync/internal_api/public/base/model_type.h"
      8 #include "sync/internal_api/public/read_node.h"
      9 #include "sync/internal_api/public/read_transaction.h"
     10 #include "sync/internal_api/public/write_transaction.h"
     11 #include "sync/syncable/directory_backing_store.h"
     12 #include "sync/syncable/mutable_entry.h"
     13 
     14 namespace {
     15 
     16 // Permanent bookmark folders as defined in bookmark_model_associator.cc.
     17 // No mobile bookmarks because they only exists with sync enabled.
     18 const char kBookmarkBarTag[] = "bookmark_bar";
     19 const char kOtherBookmarksTag[] = "other_bookmarks";
     20 
     21 class DummyEntryptionHandler : public syncer::SyncEncryptionHandler {
     22   virtual void AddObserver(Observer* observer) OVERRIDE {}
     23   virtual void RemoveObserver(Observer* observer) OVERRIDE {}
     24   virtual void Init() OVERRIDE {}
     25   virtual void SetEncryptionPassphrase(const std::string& passphrase,
     26                                        bool is_explicit) OVERRIDE {}
     27   virtual void SetDecryptionPassphrase(const std::string& passphrase)
     28       OVERRIDE {}
     29   virtual void EnableEncryptEverything() OVERRIDE {}
     30   virtual bool EncryptEverythingEnabled() const OVERRIDE {
     31     return false;
     32   }
     33   virtual syncer::PassphraseType GetPassphraseType() const OVERRIDE {
     34     return syncer::KEYSTORE_PASSPHRASE;
     35   }
     36 };
     37 
     38 }  // anonymous namespace
     39 
     40 namespace syncer {
     41 
     42 SyncRollbackManagerBase::SyncRollbackManagerBase()
     43     : report_unrecoverable_error_function_(NULL),
     44       dummy_handler_(new DummyEntryptionHandler),
     45       initialized_(false),
     46       weak_ptr_factory_(this) {
     47 }
     48 
     49 SyncRollbackManagerBase::~SyncRollbackManagerBase() {
     50 }
     51 
     52 bool SyncRollbackManagerBase::InitInternal(
     53     const base::FilePath& database_location,
     54     InternalComponentsFactory* internal_components_factory,
     55     InternalComponentsFactory::StorageOption storage,
     56     scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler,
     57     ReportUnrecoverableErrorFunction report_unrecoverable_error_function) {
     58   unrecoverable_error_handler_ = unrecoverable_error_handler.Pass();
     59   report_unrecoverable_error_function_ = report_unrecoverable_error_function;
     60 
     61   if (!InitBackupDB(database_location, internal_components_factory, storage)) {
     62     NotifyInitializationFailure();
     63     return false;
     64   }
     65 
     66   initialized_ = true;
     67   NotifyInitializationSuccess();
     68   return true;
     69 }
     70 
     71 ModelTypeSet SyncRollbackManagerBase::InitialSyncEndedTypes() {
     72   return share_.directory->InitialSyncEndedTypes();
     73 }
     74 
     75 ModelTypeSet SyncRollbackManagerBase::GetTypesWithEmptyProgressMarkerToken(
     76       ModelTypeSet types) {
     77   ModelTypeSet inited_types = share_.directory->InitialSyncEndedTypes();
     78   types.RemoveAll(inited_types);
     79   return types;
     80 }
     81 
     82 bool SyncRollbackManagerBase::PurgePartiallySyncedTypes() {
     83   NOTREACHED();
     84   return true;
     85 }
     86 
     87 void SyncRollbackManagerBase::UpdateCredentials(
     88     const SyncCredentials& credentials) {
     89 }
     90 
     91 void SyncRollbackManagerBase::StartSyncingNormally(
     92     const ModelSafeRoutingInfo& routing_info){
     93 }
     94 
     95 void SyncRollbackManagerBase::ConfigureSyncer(
     96       ConfigureReason reason,
     97       ModelTypeSet to_download,
     98       ModelTypeSet to_purge,
     99       ModelTypeSet to_journal,
    100       ModelTypeSet to_unapply,
    101       const ModelSafeRoutingInfo& new_routing_info,
    102       const base::Closure& ready_task,
    103       const base::Closure& retry_task) {
    104   for (ModelTypeSet::Iterator type = to_download.First();
    105       type.Good(); type.Inc()) {
    106     if (InitTypeRootNode(type.Get())) {
    107       if (type.Get() == BOOKMARKS) {
    108         InitBookmarkFolder(kBookmarkBarTag);
    109         InitBookmarkFolder(kOtherBookmarksTag);
    110       }
    111     }
    112   }
    113 
    114   ready_task.Run();
    115 }
    116 
    117 void SyncRollbackManagerBase::SetInvalidatorEnabled(bool invalidator_enabled) {
    118 }
    119 
    120 void SyncRollbackManagerBase::OnIncomingInvalidation(
    121     syncer::ModelType type,
    122     scoped_ptr<InvalidationInterface> invalidation) {
    123   NOTREACHED();
    124 }
    125 
    126 void SyncRollbackManagerBase::AddObserver(SyncManager::Observer* observer) {
    127   observers_.AddObserver(observer);
    128 }
    129 
    130 void SyncRollbackManagerBase::RemoveObserver(SyncManager::Observer* observer) {
    131   observers_.RemoveObserver(observer);
    132 }
    133 
    134 SyncStatus SyncRollbackManagerBase::GetDetailedStatus() const {
    135   return SyncStatus();
    136 }
    137 
    138 void SyncRollbackManagerBase::SaveChanges() {
    139 }
    140 
    141 void SyncRollbackManagerBase::ShutdownOnSyncThread(ShutdownReason reason) {
    142   if (initialized_) {
    143     share_.directory->Close();
    144     share_.directory.reset();
    145     initialized_ = false;
    146   }
    147 }
    148 
    149 UserShare* SyncRollbackManagerBase::GetUserShare() {
    150   return &share_;
    151 }
    152 
    153 const std::string SyncRollbackManagerBase::cache_guid() {
    154   return share_.directory->cache_guid();
    155 }
    156 
    157 bool SyncRollbackManagerBase::ReceivedExperiment(Experiments* experiments) {
    158   return false;
    159 }
    160 
    161 bool SyncRollbackManagerBase::HasUnsyncedItems() {
    162   ReadTransaction trans(FROM_HERE, &share_);
    163   syncable::Directory::Metahandles unsynced;
    164   share_.directory->GetUnsyncedMetaHandles(trans.GetWrappedTrans(), &unsynced);
    165   return !unsynced.empty();
    166 }
    167 
    168 SyncEncryptionHandler* SyncRollbackManagerBase::GetEncryptionHandler() {
    169   return dummy_handler_.get();
    170 }
    171 
    172 void SyncRollbackManagerBase::RefreshTypes(ModelTypeSet types) {
    173 
    174 }
    175 
    176 void SyncRollbackManagerBase::HandleTransactionCompleteChangeEvent(
    177     ModelTypeSet models_with_changes) {
    178 }
    179 
    180 ModelTypeSet SyncRollbackManagerBase::HandleTransactionEndingChangeEvent(
    181       const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
    182       syncable::BaseTransaction* trans) {
    183   return ModelTypeSet();
    184 }
    185 
    186 void SyncRollbackManagerBase::HandleCalculateChangesChangeEventFromSyncApi(
    187       const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
    188       syncable::BaseTransaction* trans,
    189       std::vector<int64>* entries_changed) {
    190 }
    191 
    192 void SyncRollbackManagerBase::HandleCalculateChangesChangeEventFromSyncer(
    193       const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
    194       syncable::BaseTransaction* trans,
    195       std::vector<int64>* entries_changed) {
    196 }
    197 
    198 void SyncRollbackManagerBase::OnTransactionWrite(
    199     const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
    200     ModelTypeSet models_with_changes) {
    201 }
    202 
    203 void SyncRollbackManagerBase::NotifyInitializationSuccess() {
    204   FOR_EACH_OBSERVER(
    205       SyncManager::Observer, observers_,
    206       OnInitializationComplete(
    207           MakeWeakHandle(base::WeakPtr<JsBackend>()),
    208           MakeWeakHandle(base::WeakPtr<DataTypeDebugInfoListener>()),
    209           true, InitialSyncEndedTypes()));
    210 }
    211 
    212 void SyncRollbackManagerBase::NotifyInitializationFailure() {
    213   FOR_EACH_OBSERVER(
    214       SyncManager::Observer, observers_,
    215       OnInitializationComplete(
    216           MakeWeakHandle(base::WeakPtr<JsBackend>()),
    217           MakeWeakHandle(base::WeakPtr<DataTypeDebugInfoListener>()),
    218           false, ModelTypeSet()));
    219 }
    220 
    221 syncer::SyncContextProxy* SyncRollbackManagerBase::GetSyncContextProxy() {
    222   return NULL;
    223 }
    224 
    225 ScopedVector<syncer::ProtocolEvent>
    226 SyncRollbackManagerBase::GetBufferedProtocolEvents() {
    227   return ScopedVector<syncer::ProtocolEvent>().Pass();
    228 }
    229 
    230 scoped_ptr<base::ListValue> SyncRollbackManagerBase::GetAllNodesForType(
    231     syncer::ModelType type) {
    232   ReadTransaction trans(FROM_HERE, GetUserShare());
    233   scoped_ptr<base::ListValue> nodes(
    234       trans.GetDirectory()->GetNodeDetailsForType(trans.GetWrappedTrans(),
    235                                                   type));
    236   return nodes.Pass();
    237 }
    238 
    239 bool SyncRollbackManagerBase::InitBackupDB(
    240     const base::FilePath& sync_folder,
    241     InternalComponentsFactory* internal_components_factory,
    242     InternalComponentsFactory::StorageOption storage) {
    243   base::FilePath backup_db_path = sync_folder.Append(
    244       syncable::Directory::kSyncDatabaseFilename);
    245   scoped_ptr<syncable::DirectoryBackingStore> backing_store =
    246       internal_components_factory->BuildDirectoryBackingStore(
    247           storage, "backup", backup_db_path).Pass();
    248 
    249   DCHECK(backing_store.get());
    250   share_.directory.reset(
    251       new syncable::Directory(
    252           backing_store.release(),
    253           unrecoverable_error_handler_.get(),
    254           report_unrecoverable_error_function_,
    255           NULL,
    256           NULL));
    257   return syncable::OPENED ==
    258       share_.directory->Open(
    259           "backup", this,
    260           MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()));
    261 }
    262 
    263 bool SyncRollbackManagerBase::InitTypeRootNode(ModelType type) {
    264   WriteTransaction trans(FROM_HERE, &share_);
    265   ReadNode root(&trans);
    266   if (BaseNode::INIT_OK == root.InitTypeRoot(type))
    267     return true;
    268 
    269   syncable::MutableEntry entry(trans.GetWrappedWriteTrans(),
    270                                syncable::CREATE_NEW_UPDATE_ITEM,
    271                                syncable::Id::CreateFromServerId(
    272                                    ModelTypeToString(type)));
    273   if (!entry.good())
    274     return false;
    275 
    276   entry.PutParentId(syncable::Id());
    277   entry.PutBaseVersion(1);
    278   entry.PutUniqueServerTag(ModelTypeToRootTag(type));
    279   entry.PutNonUniqueName(ModelTypeToString(type));
    280   entry.PutIsDel(false);
    281   entry.PutIsDir(true);
    282 
    283   sync_pb::EntitySpecifics specifics;
    284   AddDefaultFieldValue(type, &specifics);
    285   entry.PutSpecifics(specifics);
    286 
    287   return true;
    288 }
    289 
    290 void SyncRollbackManagerBase::InitBookmarkFolder(const std::string& folder) {
    291   WriteTransaction trans(FROM_HERE, &share_);
    292   syncable::Entry bookmark_root(trans.GetWrappedTrans(),
    293                                 syncable::GET_TYPE_ROOT,
    294                                 BOOKMARKS);
    295   if (!bookmark_root.good())
    296     return;
    297 
    298   syncable::MutableEntry entry(trans.GetWrappedWriteTrans(),
    299                                syncable::CREATE_NEW_UPDATE_ITEM,
    300                                syncable::Id::CreateFromServerId(folder));
    301   if (!entry.good())
    302     return;
    303 
    304   entry.PutParentId(bookmark_root.GetId());
    305   entry.PutBaseVersion(1);
    306   entry.PutUniqueServerTag(folder);
    307   entry.PutNonUniqueName(folder);
    308   entry.PutIsDel(false);
    309   entry.PutIsDir(true);
    310 
    311   sync_pb::EntitySpecifics specifics;
    312   AddDefaultFieldValue(BOOKMARKS, &specifics);
    313   entry.PutSpecifics(specifics);
    314 }
    315 
    316 ObserverList<SyncManager::Observer>* SyncRollbackManagerBase::GetObservers() {
    317   return &observers_;
    318 }
    319 
    320 void SyncRollbackManagerBase::RegisterDirectoryTypeDebugInfoObserver(
    321     syncer::TypeDebugInfoObserver* observer) {}
    322 
    323 void SyncRollbackManagerBase::UnregisterDirectoryTypeDebugInfoObserver(
    324     syncer::TypeDebugInfoObserver* observer) {}
    325 
    326 bool SyncRollbackManagerBase::HasDirectoryTypeDebugInfoObserver(
    327     syncer::TypeDebugInfoObserver* observer) { return false; }
    328 
    329 void SyncRollbackManagerBase::RequestEmitDebugInfo() {}
    330 
    331 }  // namespace syncer
    332