• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {
AddObserver(Observer * observer)22   virtual void AddObserver(Observer* observer) OVERRIDE {}
RemoveObserver(Observer * observer)23   virtual void RemoveObserver(Observer* observer) OVERRIDE {}
Init()24   virtual void Init() OVERRIDE {}
SetEncryptionPassphrase(const std::string & passphrase,bool is_explicit)25   virtual void SetEncryptionPassphrase(const std::string& passphrase,
26                                        bool is_explicit) OVERRIDE {}
SetDecryptionPassphrase(const std::string & passphrase)27   virtual void SetDecryptionPassphrase(const std::string& passphrase)
28       OVERRIDE {}
EnableEncryptEverything()29   virtual void EnableEncryptEverything() OVERRIDE {}
EncryptEverythingEnabled() const30   virtual bool EncryptEverythingEnabled() const OVERRIDE {
31     return false;
32   }
GetPassphraseType() const33   virtual syncer::PassphraseType GetPassphraseType() const OVERRIDE {
34     return syncer::KEYSTORE_PASSPHRASE;
35   }
36 };
37 
38 }  // anonymous namespace
39 
40 namespace syncer {
41 
SyncRollbackManagerBase()42 SyncRollbackManagerBase::SyncRollbackManagerBase()
43     : report_unrecoverable_error_function_(NULL),
44       dummy_handler_(new DummyEntryptionHandler),
45       initialized_(false),
46       weak_ptr_factory_(this) {
47 }
48 
~SyncRollbackManagerBase()49 SyncRollbackManagerBase::~SyncRollbackManagerBase() {
50 }
51 
InitInternal(const base::FilePath & database_location,InternalComponentsFactory * internal_components_factory,InternalComponentsFactory::StorageOption storage,scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler,ReportUnrecoverableErrorFunction report_unrecoverable_error_function)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 
InitialSyncEndedTypes()71 ModelTypeSet SyncRollbackManagerBase::InitialSyncEndedTypes() {
72   return share_.directory->InitialSyncEndedTypes();
73 }
74 
GetTypesWithEmptyProgressMarkerToken(ModelTypeSet types)75 ModelTypeSet SyncRollbackManagerBase::GetTypesWithEmptyProgressMarkerToken(
76       ModelTypeSet types) {
77   ModelTypeSet inited_types = share_.directory->InitialSyncEndedTypes();
78   types.RemoveAll(inited_types);
79   return types;
80 }
81 
PurgePartiallySyncedTypes()82 bool SyncRollbackManagerBase::PurgePartiallySyncedTypes() {
83   NOTREACHED();
84   return true;
85 }
86 
UpdateCredentials(const SyncCredentials & credentials)87 void SyncRollbackManagerBase::UpdateCredentials(
88     const SyncCredentials& credentials) {
89 }
90 
StartSyncingNormally(const ModelSafeRoutingInfo & routing_info)91 void SyncRollbackManagerBase::StartSyncingNormally(
92     const ModelSafeRoutingInfo& routing_info){
93 }
94 
ConfigureSyncer(ConfigureReason reason,ModelTypeSet to_download,ModelTypeSet to_purge,ModelTypeSet to_journal,ModelTypeSet to_unapply,const ModelSafeRoutingInfo & new_routing_info,const base::Closure & ready_task,const base::Closure & retry_task)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 
SetInvalidatorEnabled(bool invalidator_enabled)117 void SyncRollbackManagerBase::SetInvalidatorEnabled(bool invalidator_enabled) {
118 }
119 
OnIncomingInvalidation(syncer::ModelType type,scoped_ptr<InvalidationInterface> invalidation)120 void SyncRollbackManagerBase::OnIncomingInvalidation(
121     syncer::ModelType type,
122     scoped_ptr<InvalidationInterface> invalidation) {
123   NOTREACHED();
124 }
125 
AddObserver(SyncManager::Observer * observer)126 void SyncRollbackManagerBase::AddObserver(SyncManager::Observer* observer) {
127   observers_.AddObserver(observer);
128 }
129 
RemoveObserver(SyncManager::Observer * observer)130 void SyncRollbackManagerBase::RemoveObserver(SyncManager::Observer* observer) {
131   observers_.RemoveObserver(observer);
132 }
133 
GetDetailedStatus() const134 SyncStatus SyncRollbackManagerBase::GetDetailedStatus() const {
135   return SyncStatus();
136 }
137 
SaveChanges()138 void SyncRollbackManagerBase::SaveChanges() {
139 }
140 
ShutdownOnSyncThread(ShutdownReason reason)141 void SyncRollbackManagerBase::ShutdownOnSyncThread(ShutdownReason reason) {
142   if (initialized_) {
143     share_.directory->Close();
144     share_.directory.reset();
145     initialized_ = false;
146   }
147 }
148 
GetUserShare()149 UserShare* SyncRollbackManagerBase::GetUserShare() {
150   return &share_;
151 }
152 
cache_guid()153 const std::string SyncRollbackManagerBase::cache_guid() {
154   return share_.directory->cache_guid();
155 }
156 
ReceivedExperiment(Experiments * experiments)157 bool SyncRollbackManagerBase::ReceivedExperiment(Experiments* experiments) {
158   return false;
159 }
160 
HasUnsyncedItems()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 
GetEncryptionHandler()168 SyncEncryptionHandler* SyncRollbackManagerBase::GetEncryptionHandler() {
169   return dummy_handler_.get();
170 }
171 
RefreshTypes(ModelTypeSet types)172 void SyncRollbackManagerBase::RefreshTypes(ModelTypeSet types) {
173 
174 }
175 
HandleTransactionCompleteChangeEvent(ModelTypeSet models_with_changes)176 void SyncRollbackManagerBase::HandleTransactionCompleteChangeEvent(
177     ModelTypeSet models_with_changes) {
178 }
179 
HandleTransactionEndingChangeEvent(const syncable::ImmutableWriteTransactionInfo & write_transaction_info,syncable::BaseTransaction * trans)180 ModelTypeSet SyncRollbackManagerBase::HandleTransactionEndingChangeEvent(
181       const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
182       syncable::BaseTransaction* trans) {
183   return ModelTypeSet();
184 }
185 
HandleCalculateChangesChangeEventFromSyncApi(const syncable::ImmutableWriteTransactionInfo & write_transaction_info,syncable::BaseTransaction * trans,std::vector<int64> * entries_changed)186 void SyncRollbackManagerBase::HandleCalculateChangesChangeEventFromSyncApi(
187       const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
188       syncable::BaseTransaction* trans,
189       std::vector<int64>* entries_changed) {
190 }
191 
HandleCalculateChangesChangeEventFromSyncer(const syncable::ImmutableWriteTransactionInfo & write_transaction_info,syncable::BaseTransaction * trans,std::vector<int64> * entries_changed)192 void SyncRollbackManagerBase::HandleCalculateChangesChangeEventFromSyncer(
193       const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
194       syncable::BaseTransaction* trans,
195       std::vector<int64>* entries_changed) {
196 }
197 
OnTransactionWrite(const syncable::ImmutableWriteTransactionInfo & write_transaction_info,ModelTypeSet models_with_changes)198 void SyncRollbackManagerBase::OnTransactionWrite(
199     const syncable::ImmutableWriteTransactionInfo& write_transaction_info,
200     ModelTypeSet models_with_changes) {
201 }
202 
NotifyInitializationSuccess()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 
NotifyInitializationFailure()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 
GetSyncContextProxy()221 syncer::SyncContextProxy* SyncRollbackManagerBase::GetSyncContextProxy() {
222   return NULL;
223 }
224 
225 ScopedVector<syncer::ProtocolEvent>
GetBufferedProtocolEvents()226 SyncRollbackManagerBase::GetBufferedProtocolEvents() {
227   return ScopedVector<syncer::ProtocolEvent>().Pass();
228 }
229 
GetAllNodesForType(syncer::ModelType type)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 
InitBackupDB(const base::FilePath & sync_folder,InternalComponentsFactory * internal_components_factory,InternalComponentsFactory::StorageOption storage)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 
InitTypeRootNode(ModelType type)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 
InitBookmarkFolder(const std::string & folder)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 
GetObservers()316 ObserverList<SyncManager::Observer>* SyncRollbackManagerBase::GetObservers() {
317   return &observers_;
318 }
319 
RegisterDirectoryTypeDebugInfoObserver(syncer::TypeDebugInfoObserver * observer)320 void SyncRollbackManagerBase::RegisterDirectoryTypeDebugInfoObserver(
321     syncer::TypeDebugInfoObserver* observer) {}
322 
UnregisterDirectoryTypeDebugInfoObserver(syncer::TypeDebugInfoObserver * observer)323 void SyncRollbackManagerBase::UnregisterDirectoryTypeDebugInfoObserver(
324     syncer::TypeDebugInfoObserver* observer) {}
325 
HasDirectoryTypeDebugInfoObserver(syncer::TypeDebugInfoObserver * observer)326 bool SyncRollbackManagerBase::HasDirectoryTypeDebugInfoObserver(
327     syncer::TypeDebugInfoObserver* observer) { return false; }
328 
RequestEmitDebugInfo()329 void SyncRollbackManagerBase::RequestEmitDebugInfo() {}
330 
331 }  // namespace syncer
332