| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" | 5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 largest_change_id_(0), | 62 largest_change_id_(0), |
| 63 weak_ptr_factory_(this) { | 63 weak_ptr_factory_(this) { |
| 64 DCHECK(sync_context); | 64 DCHECK(sync_context); |
| 65 } | 65 } |
| 66 | 66 |
| 67 SyncEngineInitializer::~SyncEngineInitializer() { | 67 SyncEngineInitializer::~SyncEngineInitializer() { |
| 68 if (!cancel_callback_.is_null()) | 68 if (!cancel_callback_.is_null()) |
| 69 cancel_callback_.Run(); | 69 cancel_callback_.Run(); |
| 70 } | 70 } |
| 71 | 71 |
| 72 void SyncEngineInitializer::RunPreflight(scoped_ptr<SyncTaskToken> token) { | 72 void SyncEngineInitializer::RunPreflight(std::unique_ptr<SyncTaskToken> token) { |
| 73 util::Log(logging::LOG_VERBOSE, FROM_HERE, "[Initialize] Start."); | 73 util::Log(logging::LOG_VERBOSE, FROM_HERE, "[Initialize] Start."); |
| 74 DCHECK(sync_context_); | 74 DCHECK(sync_context_); |
| 75 DCHECK(sync_context_->GetDriveService()); | 75 DCHECK(sync_context_->GetDriveService()); |
| 76 | 76 |
| 77 // The metadata seems to have been already initialized. Just return with OK. | 77 // The metadata seems to have been already initialized. Just return with OK. |
| 78 if (sync_context_->GetMetadataDatabase()) { | 78 if (sync_context_->GetMetadataDatabase()) { |
| 79 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 79 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 80 "[Initialize] Already initialized."); | 80 "[Initialize] Already initialized."); |
| 81 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_OK); | 81 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_OK); |
| 82 return; | 82 return; |
| 83 } | 83 } |
| 84 | 84 |
| 85 SyncStatusCode status = SYNC_STATUS_FAILED; | 85 SyncStatusCode status = SYNC_STATUS_FAILED; |
| 86 scoped_ptr<MetadataDatabase> metadata_database = | 86 std::unique_ptr<MetadataDatabase> metadata_database = |
| 87 MetadataDatabase::Create(database_path_, env_override_, &status); | 87 MetadataDatabase::Create(database_path_, env_override_, &status); |
| 88 | 88 |
| 89 if (status != SYNC_STATUS_OK) { | 89 if (status != SYNC_STATUS_OK) { |
| 90 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 90 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 91 "[Initialize] Failed to initialize MetadataDatabase."); | 91 "[Initialize] Failed to initialize MetadataDatabase."); |
| 92 SyncTaskManager::NotifyTaskDone(std::move(token), status); | 92 SyncTaskManager::NotifyTaskDone(std::move(token), status); |
| 93 return; | 93 return; |
| 94 } | 94 } |
| 95 | 95 |
| 96 DCHECK(metadata_database); | 96 DCHECK(metadata_database); |
| 97 metadata_database_ = std::move(metadata_database); | 97 metadata_database_ = std::move(metadata_database); |
| 98 if (metadata_database_->HasSyncRoot() && | 98 if (metadata_database_->HasSyncRoot() && |
| 99 !metadata_database_->NeedsSyncRootRevalidation()) { | 99 !metadata_database_->NeedsSyncRootRevalidation()) { |
| 100 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 100 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 101 "[Initialize] Found local cache of sync-root."); | 101 "[Initialize] Found local cache of sync-root."); |
| 102 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_OK); | 102 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_OK); |
| 103 return; | 103 return; |
| 104 } | 104 } |
| 105 | 105 |
| 106 GetAboutResource(std::move(token)); | 106 GetAboutResource(std::move(token)); |
| 107 } | 107 } |
| 108 | 108 |
| 109 scoped_ptr<MetadataDatabase> SyncEngineInitializer::PassMetadataDatabase() { | 109 std::unique_ptr<MetadataDatabase> |
| 110 SyncEngineInitializer::PassMetadataDatabase() { |
| 110 return std::move(metadata_database_); | 111 return std::move(metadata_database_); |
| 111 } | 112 } |
| 112 | 113 |
| 113 void SyncEngineInitializer::GetAboutResource( | 114 void SyncEngineInitializer::GetAboutResource( |
| 114 scoped_ptr<SyncTaskToken> token) { | 115 std::unique_ptr<SyncTaskToken> token) { |
| 115 set_used_network(true); | 116 set_used_network(true); |
| 116 sync_context_->GetDriveService()->GetAboutResource( | 117 sync_context_->GetDriveService()->GetAboutResource( |
| 117 base::Bind(&SyncEngineInitializer::DidGetAboutResource, | 118 base::Bind(&SyncEngineInitializer::DidGetAboutResource, |
| 118 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | 119 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 119 } | 120 } |
| 120 | 121 |
| 121 void SyncEngineInitializer::DidGetAboutResource( | 122 void SyncEngineInitializer::DidGetAboutResource( |
| 122 scoped_ptr<SyncTaskToken> token, | 123 std::unique_ptr<SyncTaskToken> token, |
| 123 google_apis::DriveApiErrorCode error, | 124 google_apis::DriveApiErrorCode error, |
| 124 scoped_ptr<google_apis::AboutResource> about_resource) { | 125 std::unique_ptr<google_apis::AboutResource> about_resource) { |
| 125 cancel_callback_.Reset(); | 126 cancel_callback_.Reset(); |
| 126 | 127 |
| 127 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); | 128 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); |
| 128 if (status != SYNC_STATUS_OK) { | 129 if (status != SYNC_STATUS_OK) { |
| 129 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 130 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 130 "[Initialize] Failed to get AboutResource."); | 131 "[Initialize] Failed to get AboutResource."); |
| 131 SyncTaskManager::NotifyTaskDone(std::move(token), status); | 132 SyncTaskManager::NotifyTaskDone(std::move(token), status); |
| 132 return; | 133 return; |
| 133 } | 134 } |
| 134 | 135 |
| 135 DCHECK(about_resource); | 136 DCHECK(about_resource); |
| 136 root_folder_id_ = about_resource->root_folder_id(); | 137 root_folder_id_ = about_resource->root_folder_id(); |
| 137 largest_change_id_ = about_resource->largest_change_id(); | 138 largest_change_id_ = about_resource->largest_change_id(); |
| 138 | 139 |
| 139 DCHECK(!root_folder_id_.empty()); | 140 DCHECK(!root_folder_id_.empty()); |
| 140 FindSyncRoot(std::move(token)); | 141 FindSyncRoot(std::move(token)); |
| 141 } | 142 } |
| 142 | 143 |
| 143 void SyncEngineInitializer::FindSyncRoot(scoped_ptr<SyncTaskToken> token) { | 144 void SyncEngineInitializer::FindSyncRoot(std::unique_ptr<SyncTaskToken> token) { |
| 144 if (find_sync_root_retry_count_++ >= kMaxRetry) { | 145 if (find_sync_root_retry_count_++ >= kMaxRetry) { |
| 145 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 146 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 146 "[Initialize] Reached max retry count."); | 147 "[Initialize] Reached max retry count."); |
| 147 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_FAILED); | 148 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_FAILED); |
| 148 return; | 149 return; |
| 149 } | 150 } |
| 150 | 151 |
| 151 set_used_network(true); | 152 set_used_network(true); |
| 152 cancel_callback_ = sync_context_->GetDriveService()->SearchByTitle( | 153 cancel_callback_ = sync_context_->GetDriveService()->SearchByTitle( |
| 153 kSyncRootFolderTitle, | 154 kSyncRootFolderTitle, |
| 154 std::string(), // parent_folder_id | 155 std::string(), // parent_folder_id |
| 155 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, | 156 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, |
| 156 weak_ptr_factory_.GetWeakPtr(), | 157 weak_ptr_factory_.GetWeakPtr(), |
| 157 base::Passed(&token))); | 158 base::Passed(&token))); |
| 158 } | 159 } |
| 159 | 160 |
| 160 void SyncEngineInitializer::DidFindSyncRoot( | 161 void SyncEngineInitializer::DidFindSyncRoot( |
| 161 scoped_ptr<SyncTaskToken> token, | 162 std::unique_ptr<SyncTaskToken> token, |
| 162 google_apis::DriveApiErrorCode error, | 163 google_apis::DriveApiErrorCode error, |
| 163 scoped_ptr<google_apis::FileList> file_list) { | 164 std::unique_ptr<google_apis::FileList> file_list) { |
| 164 cancel_callback_.Reset(); | 165 cancel_callback_.Reset(); |
| 165 | 166 |
| 166 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); | 167 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); |
| 167 if (status != SYNC_STATUS_OK) { | 168 if (status != SYNC_STATUS_OK) { |
| 168 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 169 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 169 "[Initialize] Failed to find sync root."); | 170 "[Initialize] Failed to find sync root."); |
| 170 SyncTaskManager::NotifyTaskDone(std::move(token), status); | 171 SyncTaskManager::NotifyTaskDone(std::move(token), status); |
| 171 return; | 172 return; |
| 172 } | 173 } |
| 173 | 174 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 } | 221 } |
| 221 | 222 |
| 222 if (!HasNoParents(*sync_root_folder_)) { | 223 if (!HasNoParents(*sync_root_folder_)) { |
| 223 DetachSyncRoot(std::move(token)); | 224 DetachSyncRoot(std::move(token)); |
| 224 return; | 225 return; |
| 225 } | 226 } |
| 226 | 227 |
| 227 ListAppRootFolders(std::move(token)); | 228 ListAppRootFolders(std::move(token)); |
| 228 } | 229 } |
| 229 | 230 |
| 230 void SyncEngineInitializer::CreateSyncRoot(scoped_ptr<SyncTaskToken> token) { | 231 void SyncEngineInitializer::CreateSyncRoot( |
| 232 std::unique_ptr<SyncTaskToken> token) { |
| 231 DCHECK(!sync_root_folder_); | 233 DCHECK(!sync_root_folder_); |
| 232 set_used_network(true); | 234 set_used_network(true); |
| 233 drive::AddNewDirectoryOptions options; | 235 drive::AddNewDirectoryOptions options; |
| 234 options.visibility = google_apis::drive::FILE_VISIBILITY_PRIVATE; | 236 options.visibility = google_apis::drive::FILE_VISIBILITY_PRIVATE; |
| 235 cancel_callback_ = sync_context_->GetDriveService()->AddNewDirectory( | 237 cancel_callback_ = sync_context_->GetDriveService()->AddNewDirectory( |
| 236 root_folder_id_, kSyncRootFolderTitle, options, | 238 root_folder_id_, kSyncRootFolderTitle, options, |
| 237 base::Bind(&SyncEngineInitializer::DidCreateSyncRoot, | 239 base::Bind(&SyncEngineInitializer::DidCreateSyncRoot, |
| 238 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | 240 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 239 } | 241 } |
| 240 | 242 |
| 241 void SyncEngineInitializer::DidCreateSyncRoot( | 243 void SyncEngineInitializer::DidCreateSyncRoot( |
| 242 scoped_ptr<SyncTaskToken> token, | 244 std::unique_ptr<SyncTaskToken> token, |
| 243 google_apis::DriveApiErrorCode error, | 245 google_apis::DriveApiErrorCode error, |
| 244 scoped_ptr<google_apis::FileResource> entry) { | 246 std::unique_ptr<google_apis::FileResource> entry) { |
| 245 DCHECK(!sync_root_folder_); | 247 DCHECK(!sync_root_folder_); |
| 246 cancel_callback_.Reset(); | 248 cancel_callback_.Reset(); |
| 247 | 249 |
| 248 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); | 250 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); |
| 249 if (status != SYNC_STATUS_OK) { | 251 if (status != SYNC_STATUS_OK) { |
| 250 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 252 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 251 "[Initialize] Failed to create sync root."); | 253 "[Initialize] Failed to create sync root."); |
| 252 SyncTaskManager::NotifyTaskDone(std::move(token), status); | 254 SyncTaskManager::NotifyTaskDone(std::move(token), status); |
| 253 return; | 255 return; |
| 254 } | 256 } |
| 255 | 257 |
| 256 FindSyncRoot(std::move(token)); | 258 FindSyncRoot(std::move(token)); |
| 257 } | 259 } |
| 258 | 260 |
| 259 void SyncEngineInitializer::DetachSyncRoot(scoped_ptr<SyncTaskToken> token) { | 261 void SyncEngineInitializer::DetachSyncRoot( |
| 262 std::unique_ptr<SyncTaskToken> token) { |
| 260 DCHECK(sync_root_folder_); | 263 DCHECK(sync_root_folder_); |
| 261 set_used_network(true); | 264 set_used_network(true); |
| 262 cancel_callback_ = | 265 cancel_callback_ = |
| 263 sync_context_->GetDriveService()->RemoveResourceFromDirectory( | 266 sync_context_->GetDriveService()->RemoveResourceFromDirectory( |
| 264 root_folder_id_, | 267 root_folder_id_, |
| 265 sync_root_folder_->file_id(), | 268 sync_root_folder_->file_id(), |
| 266 base::Bind(&SyncEngineInitializer::DidDetachSyncRoot, | 269 base::Bind(&SyncEngineInitializer::DidDetachSyncRoot, |
| 267 weak_ptr_factory_.GetWeakPtr(), | 270 weak_ptr_factory_.GetWeakPtr(), |
| 268 base::Passed(&token))); | 271 base::Passed(&token))); |
| 269 } | 272 } |
| 270 | 273 |
| 271 void SyncEngineInitializer::DidDetachSyncRoot( | 274 void SyncEngineInitializer::DidDetachSyncRoot( |
| 272 scoped_ptr<SyncTaskToken> token, | 275 std::unique_ptr<SyncTaskToken> token, |
| 273 google_apis::DriveApiErrorCode error) { | 276 google_apis::DriveApiErrorCode error) { |
| 274 cancel_callback_.Reset(); | 277 cancel_callback_.Reset(); |
| 275 | 278 |
| 276 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); | 279 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); |
| 277 if (status != SYNC_STATUS_OK) { | 280 if (status != SYNC_STATUS_OK) { |
| 278 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 281 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 279 "[Initialize] Failed to detach sync root."); | 282 "[Initialize] Failed to detach sync root."); |
| 280 SyncTaskManager::NotifyTaskDone(std::move(token), status); | 283 SyncTaskManager::NotifyTaskDone(std::move(token), status); |
| 281 return; | 284 return; |
| 282 } | 285 } |
| 283 | 286 |
| 284 ListAppRootFolders(std::move(token)); | 287 ListAppRootFolders(std::move(token)); |
| 285 } | 288 } |
| 286 | 289 |
| 287 void SyncEngineInitializer::ListAppRootFolders( | 290 void SyncEngineInitializer::ListAppRootFolders( |
| 288 scoped_ptr<SyncTaskToken> token) { | 291 std::unique_ptr<SyncTaskToken> token) { |
| 289 DCHECK(sync_root_folder_); | 292 DCHECK(sync_root_folder_); |
| 290 set_used_network(true); | 293 set_used_network(true); |
| 291 cancel_callback_ = | 294 cancel_callback_ = |
| 292 sync_context_->GetDriveService()->GetFileListInDirectory( | 295 sync_context_->GetDriveService()->GetFileListInDirectory( |
| 293 sync_root_folder_->file_id(), | 296 sync_root_folder_->file_id(), |
| 294 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, | 297 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, |
| 295 weak_ptr_factory_.GetWeakPtr(), | 298 weak_ptr_factory_.GetWeakPtr(), |
| 296 base::Passed(&token))); | 299 base::Passed(&token))); |
| 297 } | 300 } |
| 298 | 301 |
| 299 void SyncEngineInitializer::DidListAppRootFolders( | 302 void SyncEngineInitializer::DidListAppRootFolders( |
| 300 scoped_ptr<SyncTaskToken> token, | 303 std::unique_ptr<SyncTaskToken> token, |
| 301 google_apis::DriveApiErrorCode error, | 304 google_apis::DriveApiErrorCode error, |
| 302 scoped_ptr<google_apis::FileList> file_list) { | 305 std::unique_ptr<google_apis::FileList> file_list) { |
| 303 cancel_callback_.Reset(); | 306 cancel_callback_.Reset(); |
| 304 | 307 |
| 305 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); | 308 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); |
| 306 if (status != SYNC_STATUS_OK) { | 309 if (status != SYNC_STATUS_OK) { |
| 307 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 310 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 308 "[Initialize] Failed to get initial app-root folders."); | 311 "[Initialize] Failed to get initial app-root folders."); |
| 309 SyncTaskManager::NotifyTaskDone(std::move(token), status); | 312 SyncTaskManager::NotifyTaskDone(std::move(token), status); |
| 310 return; | 313 return; |
| 311 } | 314 } |
| 312 | 315 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 331 file_list->next_link(), | 334 file_list->next_link(), |
| 332 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, | 335 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, |
| 333 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | 336 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 334 return; | 337 return; |
| 335 } | 338 } |
| 336 | 339 |
| 337 PopulateDatabase(std::move(token)); | 340 PopulateDatabase(std::move(token)); |
| 338 } | 341 } |
| 339 | 342 |
| 340 void SyncEngineInitializer::PopulateDatabase( | 343 void SyncEngineInitializer::PopulateDatabase( |
| 341 scoped_ptr<SyncTaskToken> token) { | 344 std::unique_ptr<SyncTaskToken> token) { |
| 342 DCHECK(sync_root_folder_); | 345 DCHECK(sync_root_folder_); |
| 343 SyncStatusCode status = metadata_database_->PopulateInitialData( | 346 SyncStatusCode status = metadata_database_->PopulateInitialData( |
| 344 largest_change_id_, *sync_root_folder_, app_root_folders_); | 347 largest_change_id_, *sync_root_folder_, app_root_folders_); |
| 345 if (status != SYNC_STATUS_OK) { | 348 if (status != SYNC_STATUS_OK) { |
| 346 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 349 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 347 "[Initialize] Failed to populate initial data" | 350 "[Initialize] Failed to populate initial data" |
| 348 " to MetadataDatabase."); | 351 " to MetadataDatabase."); |
| 349 SyncTaskManager::NotifyTaskDone(std::move(token), status); | 352 SyncTaskManager::NotifyTaskDone(std::move(token), status); |
| 350 return; | 353 return; |
| 351 } | 354 } |
| 352 | 355 |
| 353 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 356 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 354 "[Initialize] Completed successfully."); | 357 "[Initialize] Completed successfully."); |
| 355 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_OK); | 358 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_OK); |
| 356 } | 359 } |
| 357 | 360 |
| 358 } // namespace drive_backend | 361 } // namespace drive_backend |
| 359 } // namespace sync_file_system | 362 } // namespace sync_file_system |
| OLD | NEW |