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