OLD | NEW |
(Empty) | |
| 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/internal_components_factory.h" |
| 9 #include "sync/internal_api/public/read_node.h" |
| 10 #include "sync/internal_api/public/read_transaction.h" |
| 11 #include "sync/internal_api/public/util/syncer_error.h" |
| 12 #include "sync/internal_api/public/write_transaction.h" |
| 13 #include "sync/syncable/directory_backing_store.h" |
| 14 #include "sync/syncable/mutable_entry.h" |
| 15 |
| 16 namespace { |
| 17 |
| 18 // Permanent bookmark folders as defined in bookmark_model_associator.cc. |
| 19 const char kBookmarkBarTag[] = "bookmark_bar"; |
| 20 const char kMobileBookmarksTag[] = "synced_bookmarks"; |
| 21 const char kOtherBookmarksTag[] = "other_bookmarks"; |
| 22 |
| 23 } // anonymous namespace |
| 24 |
| 25 namespace syncer { |
| 26 |
| 27 SyncRollbackManagerBase::SyncRollbackManagerBase() |
| 28 : report_unrecoverable_error_function_(NULL), |
| 29 weak_ptr_factory_(this) { |
| 30 } |
| 31 |
| 32 SyncRollbackManagerBase::~SyncRollbackManagerBase() { |
| 33 } |
| 34 |
| 35 void SyncRollbackManagerBase::Init( |
| 36 const base::FilePath& database_location, |
| 37 const WeakHandle<JsEventHandler>& event_handler, |
| 38 const std::string& sync_server_and_path, |
| 39 int sync_server_port, |
| 40 bool use_ssl, |
| 41 scoped_ptr<HttpPostProviderFactory> post_factory, |
| 42 const std::vector<scoped_refptr<ModelSafeWorker> >& workers, |
| 43 ExtensionsActivity* extensions_activity, |
| 44 SyncManager::ChangeDelegate* change_delegate, |
| 45 const SyncCredentials& credentials, |
| 46 const std::string& invalidator_client_id, |
| 47 const std::string& restored_key_for_bootstrapping, |
| 48 const std::string& restored_keystore_key_for_bootstrapping, |
| 49 InternalComponentsFactory* internal_components_factory, |
| 50 Encryptor* encryptor, |
| 51 scoped_ptr<UnrecoverableErrorHandler> unrecoverable_error_handler, |
| 52 ReportUnrecoverableErrorFunction |
| 53 report_unrecoverable_error_function, |
| 54 CancelationSignal* cancelation_signal) { |
| 55 unrecoverable_error_handler_ = unrecoverable_error_handler.Pass(); |
| 56 report_unrecoverable_error_function_ = report_unrecoverable_error_function; |
| 57 |
| 58 if (!InitBackupDB(database_location, internal_components_factory)) { |
| 59 NotifyInitializationFailure(); |
| 60 return; |
| 61 } |
| 62 |
| 63 NotifyInitializationSuccess(); |
| 64 } |
| 65 |
| 66 void SyncRollbackManagerBase::ThrowUnrecoverableError() { |
| 67 NOTREACHED(); |
| 68 } |
| 69 |
| 70 ModelTypeSet SyncRollbackManagerBase::InitialSyncEndedTypes() { |
| 71 return share_.directory->InitialSyncEndedTypes(); |
| 72 } |
| 73 |
| 74 ModelTypeSet SyncRollbackManagerBase::GetTypesWithEmptyProgressMarkerToken( |
| 75 ModelTypeSet types) { |
| 76 ModelTypeSet inited_types = share_.directory->InitialSyncEndedTypes(); |
| 77 types.RemoveAll(inited_types); |
| 78 return types; |
| 79 } |
| 80 |
| 81 bool SyncRollbackManagerBase::PurgePartiallySyncedTypes() { |
| 82 NOTREACHED(); |
| 83 return true; |
| 84 } |
| 85 |
| 86 void SyncRollbackManagerBase::UpdateCredentials( |
| 87 const SyncCredentials& credentials) { |
| 88 NOTREACHED(); |
| 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 DCHECK(to_purge.Empty()); |
| 105 DCHECK(to_journal.Empty()); |
| 106 DCHECK(to_unapply.Empty()); |
| 107 for (ModelTypeSet::Iterator type = to_download.First(); |
| 108 type.Good(); type.Inc()) { |
| 109 if (InitTypeRootNode(type.Get())) { |
| 110 if (type.Get() == BOOKMARKS) { |
| 111 InitBookmarkFolder(kBookmarkBarTag); |
| 112 InitBookmarkFolder(kMobileBookmarksTag); |
| 113 InitBookmarkFolder(kOtherBookmarksTag); |
| 114 } |
| 115 } |
| 116 } |
| 117 |
| 118 ready_task.Run(); |
| 119 } |
| 120 |
| 121 void SyncRollbackManagerBase::OnInvalidatorStateChange(InvalidatorState state) { |
| 122 } |
| 123 |
| 124 void SyncRollbackManagerBase::OnIncomingInvalidation( |
| 125 const ObjectIdInvalidationMap& invalidation_map) { |
| 126 NOTREACHED(); |
| 127 } |
| 128 |
| 129 void SyncRollbackManagerBase::AddObserver(SyncManager::Observer* observer) { |
| 130 observers_.AddObserver(observer); |
| 131 } |
| 132 |
| 133 void SyncRollbackManagerBase::RemoveObserver(SyncManager::Observer* observer) { |
| 134 observers_.RemoveObserver(observer); |
| 135 } |
| 136 |
| 137 SyncStatus SyncRollbackManagerBase::GetDetailedStatus() const { |
| 138 return SyncStatus(); |
| 139 } |
| 140 |
| 141 void SyncRollbackManagerBase::SaveChanges() { |
| 142 } |
| 143 |
| 144 void SyncRollbackManagerBase::ShutdownOnSyncThread() { |
| 145 if (share_.directory) { |
| 146 SaveChanges(); |
| 147 share_.directory->Close(); |
| 148 share_.directory.reset(); |
| 149 } |
| 150 } |
| 151 |
| 152 UserShare* SyncRollbackManagerBase::GetUserShare() { |
| 153 return &share_; |
| 154 } |
| 155 |
| 156 const std::string SyncRollbackManagerBase::cache_guid() { |
| 157 return share_.directory->cache_guid(); |
| 158 } |
| 159 |
| 160 bool SyncRollbackManagerBase::ReceivedExperiment(Experiments* experiments) { |
| 161 return false; |
| 162 } |
| 163 |
| 164 bool SyncRollbackManagerBase::HasUnsyncedItems() { |
| 165 ReadTransaction trans(FROM_HERE, &share_); |
| 166 syncable::Directory::Metahandles unsynced; |
| 167 share_.directory->GetUnsyncedMetaHandles(trans.GetWrappedTrans(), &unsynced); |
| 168 return !unsynced.empty(); |
| 169 } |
| 170 |
| 171 SyncEncryptionHandler* SyncRollbackManagerBase::GetEncryptionHandler() { |
| 172 return NULL; |
| 173 } |
| 174 |
| 175 void SyncRollbackManagerBase::RefreshTypes(ModelTypeSet types) { |
| 176 |
| 177 } |
| 178 |
| 179 void SyncRollbackManagerBase::HandleTransactionCompleteChangeEvent( |
| 180 ModelTypeSet models_with_changes) { |
| 181 } |
| 182 |
| 183 ModelTypeSet SyncRollbackManagerBase::HandleTransactionEndingChangeEvent( |
| 184 const syncable::ImmutableWriteTransactionInfo& write_transaction_info, |
| 185 syncable::BaseTransaction* trans) { |
| 186 return ModelTypeSet(); |
| 187 } |
| 188 |
| 189 void SyncRollbackManagerBase::HandleCalculateChangesChangeEventFromSyncApi( |
| 190 const syncable::ImmutableWriteTransactionInfo& write_transaction_info, |
| 191 syncable::BaseTransaction* trans, |
| 192 std::vector<int64>* entries_changed) { |
| 193 } |
| 194 |
| 195 void SyncRollbackManagerBase::HandleCalculateChangesChangeEventFromSyncer( |
| 196 const syncable::ImmutableWriteTransactionInfo& write_transaction_info, |
| 197 syncable::BaseTransaction* trans, |
| 198 std::vector<int64>* entries_changed) { |
| 199 } |
| 200 |
| 201 void SyncRollbackManagerBase::OnTransactionWrite( |
| 202 const syncable::ImmutableWriteTransactionInfo& write_transaction_info, |
| 203 ModelTypeSet models_with_changes) { |
| 204 } |
| 205 |
| 206 void SyncRollbackManagerBase::NotifyInitializationSuccess() { |
| 207 FOR_EACH_OBSERVER( |
| 208 SyncManager::Observer, observers_, |
| 209 OnInitializationComplete( |
| 210 MakeWeakHandle(base::WeakPtr<JsBackend>()), |
| 211 MakeWeakHandle(base::WeakPtr<DataTypeDebugInfoListener>()), |
| 212 true, InitialSyncEndedTypes())); |
| 213 } |
| 214 |
| 215 void SyncRollbackManagerBase::NotifyInitializationFailure() { |
| 216 FOR_EACH_OBSERVER( |
| 217 SyncManager::Observer, observers_, |
| 218 OnInitializationComplete( |
| 219 MakeWeakHandle(base::WeakPtr<JsBackend>()), |
| 220 MakeWeakHandle(base::WeakPtr<DataTypeDebugInfoListener>()), |
| 221 false, InitialSyncEndedTypes())); |
| 222 } |
| 223 |
| 224 std::string SyncRollbackManagerBase::GetOwnerName() const { |
| 225 return ""; |
| 226 } |
| 227 |
| 228 syncer::SyncCoreProxy* SyncRollbackManagerBase::GetSyncCoreProxy() { |
| 229 return NULL; |
| 230 } |
| 231 |
| 232 ScopedVector<syncer::ProtocolEvent> |
| 233 SyncRollbackManagerBase::GetBufferedProtocolEvents() { |
| 234 return ScopedVector<syncer::ProtocolEvent>().Pass(); |
| 235 } |
| 236 |
| 237 scoped_ptr<base::ListValue> SyncRollbackManagerBase::GetAllNodesForType( |
| 238 syncer::ModelType type) { |
| 239 ReadTransaction trans(FROM_HERE, GetUserShare()); |
| 240 scoped_ptr<base::ListValue> nodes( |
| 241 trans.GetDirectory()->GetNodeDetailsForType(trans.GetWrappedTrans(), |
| 242 type)); |
| 243 return nodes.Pass(); |
| 244 } |
| 245 |
| 246 bool SyncRollbackManagerBase::InitBackupDB( |
| 247 const base::FilePath& sync_folder, |
| 248 InternalComponentsFactory* internal_components_factory) { |
| 249 base::FilePath backup_db_path = sync_folder.Append( |
| 250 syncable::Directory::kSyncDatabaseFilename); |
| 251 scoped_ptr<syncable::DirectoryBackingStore> backing_store = |
| 252 internal_components_factory->BuildDirectoryBackingStore( |
| 253 "backup", backup_db_path).Pass(); |
| 254 |
| 255 DCHECK(backing_store.get()); |
| 256 share_.directory.reset( |
| 257 new syncable::Directory( |
| 258 backing_store.release(), |
| 259 unrecoverable_error_handler_.get(), |
| 260 report_unrecoverable_error_function_, |
| 261 NULL, |
| 262 NULL)); |
| 263 return syncable::OPENED == |
| 264 share_.directory->Open( |
| 265 "backup", this, |
| 266 MakeWeakHandle(weak_ptr_factory_.GetWeakPtr())); |
| 267 } |
| 268 |
| 269 bool SyncRollbackManagerBase::InitTypeRootNode(ModelType type) { |
| 270 WriteTransaction trans(FROM_HERE, &share_); |
| 271 ReadNode root(&trans); |
| 272 if (BaseNode::INIT_OK == root.InitByTagLookup(ModelTypeToRootTag(type))) |
| 273 return true; |
| 274 |
| 275 syncable::MutableEntry entry(trans.GetWrappedWriteTrans(), |
| 276 syncable::CREATE_NEW_UPDATE_ITEM, |
| 277 syncable::Id::CreateFromServerId( |
| 278 ModelTypeToString(type))); |
| 279 if (!entry.good()) |
| 280 return false; |
| 281 |
| 282 entry.PutParentId(syncable::Id()); |
| 283 entry.PutBaseVersion(1); |
| 284 entry.PutUniqueServerTag(ModelTypeToRootTag(type)); |
| 285 entry.PutNonUniqueName(ModelTypeToString(type)); |
| 286 entry.PutIsDel(false); |
| 287 entry.PutIsDir(true); |
| 288 |
| 289 sync_pb::EntitySpecifics specifics; |
| 290 AddDefaultFieldValue(type, &specifics); |
| 291 entry.PutSpecifics(specifics); |
| 292 |
| 293 return true; |
| 294 } |
| 295 |
| 296 void SyncRollbackManagerBase::InitBookmarkFolder(const std::string& folder) { |
| 297 WriteTransaction trans(FROM_HERE, &share_); |
| 298 syncable::Entry bookmark_root(trans.GetWrappedTrans(), |
| 299 syncable::GET_BY_SERVER_TAG, |
| 300 ModelTypeToRootTag(BOOKMARKS)); |
| 301 if (!bookmark_root.good()) |
| 302 return; |
| 303 |
| 304 syncable::MutableEntry entry(trans.GetWrappedWriteTrans(), |
| 305 syncable::CREATE_NEW_UPDATE_ITEM, |
| 306 syncable::Id::CreateFromServerId(folder)); |
| 307 if (!entry.good()) |
| 308 return; |
| 309 |
| 310 entry.PutParentId(bookmark_root.GetId()); |
| 311 entry.PutBaseVersion(1); |
| 312 entry.PutUniqueServerTag(folder); |
| 313 entry.PutNonUniqueName(folder); |
| 314 entry.PutIsDel(false); |
| 315 entry.PutIsDir(true); |
| 316 |
| 317 sync_pb::EntitySpecifics specifics; |
| 318 AddDefaultFieldValue(BOOKMARKS, &specifics); |
| 319 entry.PutSpecifics(specifics); |
| 320 } |
| 321 |
| 322 } // namespace syncer |
OLD | NEW |