| 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/local_to_remote_syncer.h
" | 5 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h
" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #include "components/drive/service/drive_service_interface.h" | 30 #include "components/drive/service/drive_service_interface.h" |
| 31 #include "google_apis/drive/drive_api_parser.h" | 31 #include "google_apis/drive/drive_api_parser.h" |
| 32 #include "net/base/mime_util.h" | 32 #include "net/base/mime_util.h" |
| 33 #include "storage/common/fileapi/file_system_util.h" | 33 #include "storage/common/fileapi/file_system_util.h" |
| 34 | 34 |
| 35 namespace sync_file_system { | 35 namespace sync_file_system { |
| 36 namespace drive_backend { | 36 namespace drive_backend { |
| 37 | 37 |
| 38 namespace { | 38 namespace { |
| 39 | 39 |
| 40 scoped_ptr<FileTracker> FindTrackerByID(MetadataDatabase* metadata_database, | 40 std::unique_ptr<FileTracker> FindTrackerByID( |
| 41 int64_t tracker_id) { | 41 MetadataDatabase* metadata_database, |
| 42 scoped_ptr<FileTracker> tracker(new FileTracker); | 42 int64_t tracker_id) { |
| 43 std::unique_ptr<FileTracker> tracker(new FileTracker); |
| 43 if (metadata_database->FindTrackerByTrackerID(tracker_id, tracker.get())) | 44 if (metadata_database->FindTrackerByTrackerID(tracker_id, tracker.get())) |
| 44 return tracker; | 45 return tracker; |
| 45 return scoped_ptr<FileTracker>(); | 46 return std::unique_ptr<FileTracker>(); |
| 46 } | 47 } |
| 47 | 48 |
| 48 bool GetKnownChangeID(MetadataDatabase* metadata_database, | 49 bool GetKnownChangeID(MetadataDatabase* metadata_database, |
| 49 const std::string& file_id, | 50 const std::string& file_id, |
| 50 int64_t* change_id) { | 51 int64_t* change_id) { |
| 51 FileMetadata remote_file_metadata; | 52 FileMetadata remote_file_metadata; |
| 52 if (!metadata_database->FindFileByFileID(file_id, &remote_file_metadata)) | 53 if (!metadata_database->FindFileByFileID(file_id, &remote_file_metadata)) |
| 53 return false; | 54 return false; |
| 54 *change_id = remote_file_metadata.details().change_id(); | 55 *change_id = remote_file_metadata.details().change_id(); |
| 55 return true; | 56 return true; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 needs_remote_change_listing_(false), | 90 needs_remote_change_listing_(false), |
| 90 weak_ptr_factory_(this) { | 91 weak_ptr_factory_(this) { |
| 91 DCHECK(local_is_missing_ || | 92 DCHECK(local_is_missing_ || |
| 92 local_change.file_type() == local_metadata.file_type) | 93 local_change.file_type() == local_metadata.file_type) |
| 93 << local_change.DebugString() << " metadata:" << local_metadata.file_type; | 94 << local_change.DebugString() << " metadata:" << local_metadata.file_type; |
| 94 } | 95 } |
| 95 | 96 |
| 96 LocalToRemoteSyncer::~LocalToRemoteSyncer() { | 97 LocalToRemoteSyncer::~LocalToRemoteSyncer() { |
| 97 } | 98 } |
| 98 | 99 |
| 99 void LocalToRemoteSyncer::RunPreflight(scoped_ptr<SyncTaskToken> token) { | 100 void LocalToRemoteSyncer::RunPreflight(std::unique_ptr<SyncTaskToken> token) { |
| 100 token->InitializeTaskLog("Local -> Remote"); | 101 token->InitializeTaskLog("Local -> Remote"); |
| 101 | 102 |
| 102 if (!IsContextReady()) { | 103 if (!IsContextReady()) { |
| 103 token->RecordLog("Context not ready."); | 104 token->RecordLog("Context not ready."); |
| 104 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_FAILED); | 105 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_FAILED); |
| 105 return; | 106 return; |
| 106 } | 107 } |
| 107 | 108 |
| 108 token->RecordLog(base::StringPrintf( | 109 token->RecordLog(base::StringPrintf( |
| 109 "Start: %s on %s@%s %s", | 110 "Start: %s on %s@%s %s", |
| 110 local_change_.DebugString().c_str(), | 111 local_change_.DebugString().c_str(), |
| 111 url_.path().AsUTF8Unsafe().c_str(), | 112 url_.path().AsUTF8Unsafe().c_str(), |
| 112 url_.origin().host().c_str(), | 113 url_.origin().host().c_str(), |
| 113 local_is_missing_ ? "(missing)" : "")); | 114 local_is_missing_ ? "(missing)" : "")); |
| 114 | 115 |
| 115 if (local_is_missing_ && !local_change_.IsDelete()) { | 116 if (local_is_missing_ && !local_change_.IsDelete()) { |
| 116 // Stray file, we can just return. | 117 // Stray file, we can just return. |
| 117 token->RecordLog("Missing file for non-delete change."); | 118 token->RecordLog("Missing file for non-delete change."); |
| 118 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_OK); | 119 SyncTaskManager::NotifyTaskDone(std::move(token), SYNC_STATUS_OK); |
| 119 return; | 120 return; |
| 120 } | 121 } |
| 121 | 122 |
| 122 std::string app_id = url_.origin().host(); | 123 std::string app_id = url_.origin().host(); |
| 123 base::FilePath path = url_.path(); | 124 base::FilePath path = url_.path(); |
| 124 | 125 |
| 125 scoped_ptr<FileTracker> active_ancestor_tracker(new FileTracker); | 126 std::unique_ptr<FileTracker> active_ancestor_tracker(new FileTracker); |
| 126 base::FilePath active_ancestor_path; | 127 base::FilePath active_ancestor_path; |
| 127 if (!metadata_database()->FindNearestActiveAncestor( | 128 if (!metadata_database()->FindNearestActiveAncestor( |
| 128 app_id, path, | 129 app_id, path, |
| 129 active_ancestor_tracker.get(), &active_ancestor_path)) { | 130 active_ancestor_tracker.get(), &active_ancestor_path)) { |
| 130 // The app is disabled or not registered. | 131 // The app is disabled or not registered. |
| 131 token->RecordLog("App is disabled or not registered"); | 132 token->RecordLog("App is disabled or not registered"); |
| 132 SyncTaskManager::NotifyTaskDone(std::move(token), | 133 SyncTaskManager::NotifyTaskDone(std::move(token), |
| 133 SYNC_STATUS_UNKNOWN_ORIGIN); | 134 SYNC_STATUS_UNKNOWN_ORIGIN); |
| 134 return; | 135 return; |
| 135 } | 136 } |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 std::move(token)); | 244 std::move(token)); |
| 244 return; | 245 return; |
| 245 } | 246 } |
| 246 | 247 |
| 247 token->RecordLog("Detected a new folder."); | 248 token->RecordLog("Detected a new folder."); |
| 248 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder, | 249 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder, |
| 249 weak_ptr_factory_.GetWeakPtr()), | 250 weak_ptr_factory_.GetWeakPtr()), |
| 250 std::move(token)); | 251 std::move(token)); |
| 251 } | 252 } |
| 252 | 253 |
| 253 void LocalToRemoteSyncer::MoveToBackground(const Continuation& continuation, | 254 void LocalToRemoteSyncer::MoveToBackground( |
| 254 scoped_ptr<SyncTaskToken> token) { | 255 const Continuation& continuation, |
| 255 scoped_ptr<TaskBlocker> blocker(new TaskBlocker); | 256 std::unique_ptr<SyncTaskToken> token) { |
| 257 std::unique_ptr<TaskBlocker> blocker(new TaskBlocker); |
| 256 blocker->app_id = url_.origin().host(); | 258 blocker->app_id = url_.origin().host(); |
| 257 blocker->paths.push_back(target_path_); | 259 blocker->paths.push_back(target_path_); |
| 258 | 260 |
| 259 if (remote_file_tracker_) { | 261 if (remote_file_tracker_) { |
| 260 if (!GetKnownChangeID(metadata_database(), | 262 if (!GetKnownChangeID(metadata_database(), |
| 261 remote_file_tracker_->file_id(), | 263 remote_file_tracker_->file_id(), |
| 262 &remote_file_change_id_)) { | 264 &remote_file_change_id_)) { |
| 263 NOTREACHED(); | 265 NOTREACHED(); |
| 264 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); | 266 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); |
| 265 return; | 267 return; |
| 266 } | 268 } |
| 267 | 269 |
| 268 blocker->tracker_ids.push_back(remote_file_tracker_->tracker_id()); | 270 blocker->tracker_ids.push_back(remote_file_tracker_->tracker_id()); |
| 269 blocker->file_ids.push_back(remote_file_tracker_->file_id()); | 271 blocker->file_ids.push_back(remote_file_tracker_->file_id()); |
| 270 } | 272 } |
| 271 | 273 |
| 272 // Run current task as a background task with |blocker|. | 274 // Run current task as a background task with |blocker|. |
| 273 // After the invocation of ContinueAsBackgroundTask | 275 // After the invocation of ContinueAsBackgroundTask |
| 274 SyncTaskManager::UpdateTaskBlocker( | 276 SyncTaskManager::UpdateTaskBlocker( |
| 275 std::move(token), std::move(blocker), | 277 std::move(token), std::move(blocker), |
| 276 base::Bind(&LocalToRemoteSyncer::ContinueAsBackgroundTask, | 278 base::Bind(&LocalToRemoteSyncer::ContinueAsBackgroundTask, |
| 277 weak_ptr_factory_.GetWeakPtr(), continuation)); | 279 weak_ptr_factory_.GetWeakPtr(), continuation)); |
| 278 } | 280 } |
| 279 | 281 |
| 280 void LocalToRemoteSyncer::ContinueAsBackgroundTask( | 282 void LocalToRemoteSyncer::ContinueAsBackgroundTask( |
| 281 const Continuation& continuation, | 283 const Continuation& continuation, |
| 282 scoped_ptr<SyncTaskToken> token) { | 284 std::unique_ptr<SyncTaskToken> token) { |
| 283 // The SyncTask runs as a background task beyond this point. | 285 // The SyncTask runs as a background task beyond this point. |
| 284 // Note that any task can run between MoveToBackground() and | 286 // Note that any task can run between MoveToBackground() and |
| 285 // ContinueAsBackgroundTask(), so we need to make sure other tasks didn't | 287 // ContinueAsBackgroundTask(), so we need to make sure other tasks didn't |
| 286 // affect to the current LocalToRemoteSyncer task. | 288 // affect to the current LocalToRemoteSyncer task. |
| 287 // | 289 // |
| 288 // - For RemoteToLocalSyncer, it doesn't actually run beyond | 290 // - For RemoteToLocalSyncer, it doesn't actually run beyond |
| 289 // PrepareForProcessRemoteChange() since it should be blocked in | 291 // PrepareForProcessRemoteChange() since it should be blocked in |
| 290 // LocalFileSyncService. | 292 // LocalFileSyncService. |
| 291 // - For ListChangesTask, it may update FileMetatada together with |change_id| | 293 // - For ListChangesTask, it may update FileMetatada together with |change_id| |
| 292 // and may delete FileTracker. So, ensure |change_id| is not changed and | 294 // and may delete FileTracker. So, ensure |change_id| is not changed and |
| (...skipping 15 matching lines...) Expand all Loading... |
| 308 if (!metadata_database()->FindTrackerByTrackerID( | 310 if (!metadata_database()->FindTrackerByTrackerID( |
| 309 remote_file_tracker_->tracker_id(), nullptr)) { | 311 remote_file_tracker_->tracker_id(), nullptr)) { |
| 310 SyncCompleted(std::move(token), SYNC_STATUS_RETRY); | 312 SyncCompleted(std::move(token), SYNC_STATUS_RETRY); |
| 311 return; | 313 return; |
| 312 } | 314 } |
| 313 } | 315 } |
| 314 | 316 |
| 315 continuation.Run(std::move(token)); | 317 continuation.Run(std::move(token)); |
| 316 } | 318 } |
| 317 | 319 |
| 318 void LocalToRemoteSyncer::SyncCompleted(scoped_ptr<SyncTaskToken> token, | 320 void LocalToRemoteSyncer::SyncCompleted(std::unique_ptr<SyncTaskToken> token, |
| 319 SyncStatusCode status) { | 321 SyncStatusCode status) { |
| 320 if (status == SYNC_STATUS_OK && retry_on_success_) | 322 if (status == SYNC_STATUS_OK && retry_on_success_) |
| 321 status = SYNC_STATUS_RETRY; | 323 status = SYNC_STATUS_RETRY; |
| 322 | 324 |
| 323 if (needs_remote_change_listing_) | 325 if (needs_remote_change_listing_) |
| 324 status = SYNC_STATUS_FILE_BUSY; | 326 status = SYNC_STATUS_FILE_BUSY; |
| 325 | 327 |
| 326 token->RecordLog(base::StringPrintf( | 328 token->RecordLog(base::StringPrintf( |
| 327 "Finished: action=%s, status=%s for %s@%s", | 329 "Finished: action=%s, status=%s for %s@%s", |
| 328 SyncActionToString(sync_action_), | 330 SyncActionToString(sync_action_), |
| 329 SyncStatusCodeToString(status), | 331 SyncStatusCodeToString(status), |
| 330 target_path_.AsUTF8Unsafe().c_str(), | 332 target_path_.AsUTF8Unsafe().c_str(), |
| 331 url_.origin().host().c_str())); | 333 url_.origin().host().c_str())); |
| 332 | 334 |
| 333 SyncTaskManager::NotifyTaskDone(std::move(token), status); | 335 SyncTaskManager::NotifyTaskDone(std::move(token), status); |
| 334 } | 336 } |
| 335 | 337 |
| 336 void LocalToRemoteSyncer::HandleConflict(scoped_ptr<SyncTaskToken> token) { | 338 void LocalToRemoteSyncer::HandleConflict(std::unique_ptr<SyncTaskToken> token) { |
| 337 DCHECK(remote_file_tracker_); | 339 DCHECK(remote_file_tracker_); |
| 338 DCHECK(remote_file_tracker_->has_synced_details()); | 340 DCHECK(remote_file_tracker_->has_synced_details()); |
| 339 DCHECK(remote_file_tracker_->active()); | 341 DCHECK(remote_file_tracker_->active()); |
| 340 DCHECK(remote_file_tracker_->dirty()); | 342 DCHECK(remote_file_tracker_->dirty()); |
| 341 | 343 |
| 342 if (local_is_missing_) { | 344 if (local_is_missing_) { |
| 343 SyncCompleted(std::move(token), SYNC_STATUS_OK); | 345 SyncCompleted(std::move(token), SYNC_STATUS_OK); |
| 344 return; | 346 return; |
| 345 } | 347 } |
| 346 | 348 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 return; | 381 return; |
| 380 } | 382 } |
| 381 | 383 |
| 382 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder, | 384 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder, |
| 383 weak_ptr_factory_.GetWeakPtr()), | 385 weak_ptr_factory_.GetWeakPtr()), |
| 384 std::move(token)); | 386 std::move(token)); |
| 385 } | 387 } |
| 386 | 388 |
| 387 void LocalToRemoteSyncer::UpdateTrackerForReusedFolder( | 389 void LocalToRemoteSyncer::UpdateTrackerForReusedFolder( |
| 388 const FileDetails& details, | 390 const FileDetails& details, |
| 389 scoped_ptr<SyncTaskToken> token) { | 391 std::unique_ptr<SyncTaskToken> token) { |
| 390 SyncStatusCode status = metadata_database()->UpdateTracker( | 392 SyncStatusCode status = metadata_database()->UpdateTracker( |
| 391 remote_file_tracker_->tracker_id(), details); | 393 remote_file_tracker_->tracker_id(), details); |
| 392 SyncCompleted(std::move(token), status); | 394 SyncCompleted(std::move(token), status); |
| 393 } | 395 } |
| 394 | 396 |
| 395 void LocalToRemoteSyncer::HandleExistingRemoteFile( | 397 void LocalToRemoteSyncer::HandleExistingRemoteFile( |
| 396 scoped_ptr<SyncTaskToken> token) { | 398 std::unique_ptr<SyncTaskToken> token) { |
| 397 DCHECK(remote_file_tracker_); | 399 DCHECK(remote_file_tracker_); |
| 398 DCHECK(!remote_file_tracker_->dirty()); | 400 DCHECK(!remote_file_tracker_->dirty()); |
| 399 DCHECK(remote_file_tracker_->active()); | 401 DCHECK(remote_file_tracker_->active()); |
| 400 DCHECK(remote_file_tracker_->has_synced_details()); | 402 DCHECK(remote_file_tracker_->has_synced_details()); |
| 401 | 403 |
| 402 if (local_is_missing_) { | 404 if (local_is_missing_) { |
| 403 // Local file deletion for existing remote file. | 405 // Local file deletion for existing remote file. |
| 404 MoveToBackground(base::Bind(&LocalToRemoteSyncer::DeleteRemoteFile, | 406 MoveToBackground(base::Bind(&LocalToRemoteSyncer::DeleteRemoteFile, |
| 405 weak_ptr_factory_.GetWeakPtr()), | 407 weak_ptr_factory_.GetWeakPtr()), |
| 406 std::move(token)); | 408 std::move(token)); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 weak_ptr_factory_.GetWeakPtr()), | 445 weak_ptr_factory_.GetWeakPtr()), |
| 444 std::move(token)); | 446 std::move(token)); |
| 445 return; | 447 return; |
| 446 } | 448 } |
| 447 | 449 |
| 448 // Non-conflicting local folder creation to existing remote folder. | 450 // Non-conflicting local folder creation to existing remote folder. |
| 449 DCHECK_EQ(FILE_KIND_FOLDER, synced_details.file_kind()); | 451 DCHECK_EQ(FILE_KIND_FOLDER, synced_details.file_kind()); |
| 450 SyncCompleted(std::move(token), SYNC_STATUS_OK); | 452 SyncCompleted(std::move(token), SYNC_STATUS_OK); |
| 451 } | 453 } |
| 452 | 454 |
| 453 void LocalToRemoteSyncer::DeleteRemoteFile(scoped_ptr<SyncTaskToken> token) { | 455 void LocalToRemoteSyncer::DeleteRemoteFile( |
| 456 std::unique_ptr<SyncTaskToken> token) { |
| 454 DCHECK(remote_file_tracker_); | 457 DCHECK(remote_file_tracker_); |
| 455 DCHECK(remote_file_tracker_->has_synced_details()); | 458 DCHECK(remote_file_tracker_->has_synced_details()); |
| 456 | 459 |
| 457 switch (remote_file_tracker_->synced_details().file_kind()) { | 460 switch (remote_file_tracker_->synced_details().file_kind()) { |
| 458 case FILE_KIND_UNSUPPORTED: | 461 case FILE_KIND_UNSUPPORTED: |
| 459 NOTREACHED(); | 462 NOTREACHED(); |
| 460 file_type_ = SYNC_FILE_TYPE_UNKNOWN; | 463 file_type_ = SYNC_FILE_TYPE_UNKNOWN; |
| 461 break; | 464 break; |
| 462 case FILE_KIND_FILE: | 465 case FILE_KIND_FILE: |
| 463 file_type_ = SYNC_FILE_TYPE_FILE; | 466 file_type_ = SYNC_FILE_TYPE_FILE; |
| 464 break; | 467 break; |
| 465 case FILE_KIND_FOLDER: | 468 case FILE_KIND_FOLDER: |
| 466 file_type_ = SYNC_FILE_TYPE_DIRECTORY; | 469 file_type_ = SYNC_FILE_TYPE_DIRECTORY; |
| 467 break; | 470 break; |
| 468 } | 471 } |
| 469 sync_action_ = SYNC_ACTION_DELETED; | 472 sync_action_ = SYNC_ACTION_DELETED; |
| 470 drive_service()->DeleteResource( | 473 drive_service()->DeleteResource( |
| 471 remote_file_tracker_->file_id(), | 474 remote_file_tracker_->file_id(), |
| 472 remote_file_tracker_->synced_details().etag(), | 475 remote_file_tracker_->synced_details().etag(), |
| 473 base::Bind(&LocalToRemoteSyncer::DidDeleteRemoteFile, | 476 base::Bind(&LocalToRemoteSyncer::DidDeleteRemoteFile, |
| 474 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | 477 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 475 } | 478 } |
| 476 | 479 |
| 477 void LocalToRemoteSyncer::DidDeleteRemoteFile( | 480 void LocalToRemoteSyncer::DidDeleteRemoteFile( |
| 478 scoped_ptr<SyncTaskToken> token, | 481 std::unique_ptr<SyncTaskToken> token, |
| 479 google_apis::DriveApiErrorCode error) { | 482 google_apis::DriveApiErrorCode error) { |
| 480 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); | 483 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); |
| 481 if (status != SYNC_STATUS_OK && | 484 if (status != SYNC_STATUS_OK && |
| 482 error != google_apis::HTTP_NOT_FOUND && | 485 error != google_apis::HTTP_NOT_FOUND && |
| 483 error != google_apis::HTTP_PRECONDITION && | 486 error != google_apis::HTTP_PRECONDITION && |
| 484 error != google_apis::HTTP_CONFLICT) { | 487 error != google_apis::HTTP_CONFLICT) { |
| 485 SyncCompleted(std::move(token), status); | 488 SyncCompleted(std::move(token), status); |
| 486 return; | 489 return; |
| 487 } | 490 } |
| 488 | 491 |
| 489 // Handle NOT_FOUND case as SUCCESS case. | 492 // Handle NOT_FOUND case as SUCCESS case. |
| 490 // For PRECONDITION / CONFLICT case, the remote file is modified since the | 493 // For PRECONDITION / CONFLICT case, the remote file is modified since the |
| 491 // last sync completed. As our policy for deletion-modification conflict | 494 // last sync completed. As our policy for deletion-modification conflict |
| 492 // resolution, ignore the local deletion. | 495 // resolution, ignore the local deletion. |
| 493 if (status == SYNC_STATUS_OK || | 496 if (status == SYNC_STATUS_OK || |
| 494 error == google_apis::HTTP_NOT_FOUND) { | 497 error == google_apis::HTTP_NOT_FOUND) { |
| 495 SyncStatusCode status = metadata_database()->UpdateByDeletedRemoteFile( | 498 SyncStatusCode status = metadata_database()->UpdateByDeletedRemoteFile( |
| 496 remote_file_tracker_->file_id()); | 499 remote_file_tracker_->file_id()); |
| 497 SyncCompleted(std::move(token), status); | 500 SyncCompleted(std::move(token), status); |
| 498 return; | 501 return; |
| 499 } | 502 } |
| 500 | 503 |
| 501 SyncCompleted(std::move(token), SYNC_STATUS_OK); | 504 SyncCompleted(std::move(token), SYNC_STATUS_OK); |
| 502 } | 505 } |
| 503 | 506 |
| 504 void LocalToRemoteSyncer::UploadExistingFile(scoped_ptr<SyncTaskToken> token) { | 507 void LocalToRemoteSyncer::UploadExistingFile( |
| 508 std::unique_ptr<SyncTaskToken> token) { |
| 505 DCHECK(remote_file_tracker_); | 509 DCHECK(remote_file_tracker_); |
| 506 DCHECK(remote_file_tracker_->has_synced_details()); | 510 DCHECK(remote_file_tracker_->has_synced_details()); |
| 507 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | 511 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); |
| 508 | 512 |
| 509 const std::string local_file_md5 = drive::util::GetMd5Digest(local_path_, | 513 const std::string local_file_md5 = drive::util::GetMd5Digest(local_path_, |
| 510 nullptr); | 514 nullptr); |
| 511 if (local_file_md5 == remote_file_tracker_->synced_details().md5()) { | 515 if (local_file_md5 == remote_file_tracker_->synced_details().md5()) { |
| 512 // Local file is not changed. | 516 // Local file is not changed. |
| 513 SyncCompleted(std::move(token), SYNC_STATUS_OK); | 517 SyncCompleted(std::move(token), SYNC_STATUS_OK); |
| 514 return; | 518 return; |
| 515 } | 519 } |
| 516 | 520 |
| 517 file_type_ = SYNC_FILE_TYPE_FILE; | 521 file_type_ = SYNC_FILE_TYPE_FILE; |
| 518 sync_action_ = SYNC_ACTION_UPDATED; | 522 sync_action_ = SYNC_ACTION_UPDATED; |
| 519 | 523 |
| 520 drive::UploadExistingFileOptions options; | 524 drive::UploadExistingFileOptions options; |
| 521 options.etag = remote_file_tracker_->synced_details().etag(); | 525 options.etag = remote_file_tracker_->synced_details().etag(); |
| 522 drive_uploader()->UploadExistingFile( | 526 drive_uploader()->UploadExistingFile( |
| 523 remote_file_tracker_->file_id(), | 527 remote_file_tracker_->file_id(), |
| 524 local_path_, | 528 local_path_, |
| 525 "application/octet_stream", | 529 "application/octet_stream", |
| 526 options, | 530 options, |
| 527 base::Bind(&LocalToRemoteSyncer::DidUploadExistingFile, | 531 base::Bind(&LocalToRemoteSyncer::DidUploadExistingFile, |
| 528 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)), | 532 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)), |
| 529 google_apis::ProgressCallback()); | 533 google_apis::ProgressCallback()); |
| 530 } | 534 } |
| 531 | 535 |
| 532 void LocalToRemoteSyncer::DidUploadExistingFile( | 536 void LocalToRemoteSyncer::DidUploadExistingFile( |
| 533 scoped_ptr<SyncTaskToken> token, | 537 std::unique_ptr<SyncTaskToken> token, |
| 534 google_apis::DriveApiErrorCode error, | 538 google_apis::DriveApiErrorCode error, |
| 535 const GURL&, | 539 const GURL&, |
| 536 scoped_ptr<google_apis::FileResource> entry) { | 540 std::unique_ptr<google_apis::FileResource> entry) { |
| 537 if (error == google_apis::HTTP_PRECONDITION || | 541 if (error == google_apis::HTTP_PRECONDITION || |
| 538 error == google_apis::HTTP_CONFLICT || | 542 error == google_apis::HTTP_CONFLICT || |
| 539 error == google_apis::HTTP_NOT_FOUND) { | 543 error == google_apis::HTTP_NOT_FOUND) { |
| 540 // The remote file has unfetched remote change. Fetch latest metadata and | 544 // The remote file has unfetched remote change. Fetch latest metadata and |
| 541 // update database with it. | 545 // update database with it. |
| 542 // TODO(tzik): Consider adding local side low-priority dirtiness handling to | 546 // TODO(tzik): Consider adding local side low-priority dirtiness handling to |
| 543 // handle this as ListChangesTask. | 547 // handle this as ListChangesTask. |
| 544 | 548 |
| 545 needs_remote_change_listing_ = true; | 549 needs_remote_change_listing_ = true; |
| 546 UpdateRemoteMetadata(remote_file_tracker_->file_id(), std::move(token)); | 550 UpdateRemoteMetadata(remote_file_tracker_->file_id(), std::move(token)); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 remote_file_tracker_->tracker_id(), file.details()); | 589 remote_file_tracker_->tracker_id(), file.details()); |
| 586 SyncCompleted(std::move(token), status); | 590 SyncCompleted(std::move(token), status); |
| 587 return; | 591 return; |
| 588 } | 592 } |
| 589 | 593 |
| 590 SyncCompleted(std::move(token), SYNC_STATUS_RETRY); | 594 SyncCompleted(std::move(token), SYNC_STATUS_RETRY); |
| 591 } | 595 } |
| 592 | 596 |
| 593 void LocalToRemoteSyncer::UpdateRemoteMetadata( | 597 void LocalToRemoteSyncer::UpdateRemoteMetadata( |
| 594 const std::string& file_id, | 598 const std::string& file_id, |
| 595 scoped_ptr<SyncTaskToken> token) { | 599 std::unique_ptr<SyncTaskToken> token) { |
| 596 DCHECK(remote_file_tracker_); | 600 DCHECK(remote_file_tracker_); |
| 597 | 601 |
| 598 drive_service()->GetFileResource( | 602 drive_service()->GetFileResource( |
| 599 file_id, | 603 file_id, |
| 600 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, | 604 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, |
| 601 weak_ptr_factory_.GetWeakPtr(), | 605 weak_ptr_factory_.GetWeakPtr(), |
| 602 file_id, base::Passed(&token))); | 606 file_id, base::Passed(&token))); |
| 603 } | 607 } |
| 604 | 608 |
| 605 void LocalToRemoteSyncer::DidGetRemoteMetadata( | 609 void LocalToRemoteSyncer::DidGetRemoteMetadata( |
| 606 const std::string& file_id, | 610 const std::string& file_id, |
| 607 scoped_ptr<SyncTaskToken> token, | 611 std::unique_ptr<SyncTaskToken> token, |
| 608 google_apis::DriveApiErrorCode error, | 612 google_apis::DriveApiErrorCode error, |
| 609 scoped_ptr<google_apis::FileResource> entry) { | 613 std::unique_ptr<google_apis::FileResource> entry) { |
| 610 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | 614 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); |
| 611 | 615 |
| 612 if (error == google_apis::HTTP_NOT_FOUND) { | 616 if (error == google_apis::HTTP_NOT_FOUND) { |
| 613 retry_on_success_ = true; | 617 retry_on_success_ = true; |
| 614 SyncStatusCode status = | 618 SyncStatusCode status = |
| 615 metadata_database()->UpdateByDeletedRemoteFile(file_id); | 619 metadata_database()->UpdateByDeletedRemoteFile(file_id); |
| 616 SyncCompleted(std::move(token), status); | 620 SyncCompleted(std::move(token), status); |
| 617 return; | 621 return; |
| 618 } | 622 } |
| 619 | 623 |
| 620 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); | 624 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); |
| 621 if (status != SYNC_STATUS_OK) { | 625 if (status != SYNC_STATUS_OK) { |
| 622 SyncCompleted(std::move(token), status); | 626 SyncCompleted(std::move(token), status); |
| 623 return; | 627 return; |
| 624 } | 628 } |
| 625 | 629 |
| 626 if (!entry) { | 630 if (!entry) { |
| 627 NOTREACHED(); | 631 NOTREACHED(); |
| 628 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); | 632 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); |
| 629 return; | 633 return; |
| 630 } | 634 } |
| 631 | 635 |
| 632 retry_on_success_ = true; | 636 retry_on_success_ = true; |
| 633 status = metadata_database()->UpdateByFileResource(*entry); | 637 status = metadata_database()->UpdateByFileResource(*entry); |
| 634 SyncCompleted(std::move(token), status); | 638 SyncCompleted(std::move(token), status); |
| 635 } | 639 } |
| 636 | 640 |
| 637 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { | 641 void LocalToRemoteSyncer::UploadNewFile(std::unique_ptr<SyncTaskToken> token) { |
| 638 DCHECK(remote_parent_folder_tracker_); | 642 DCHECK(remote_parent_folder_tracker_); |
| 639 | 643 |
| 640 file_type_ = SYNC_FILE_TYPE_FILE; | 644 file_type_ = SYNC_FILE_TYPE_FILE; |
| 641 sync_action_ = SYNC_ACTION_ADDED; | 645 sync_action_ = SYNC_ACTION_ADDED; |
| 642 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 646 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
| 643 drive_uploader()->UploadNewFile( | 647 drive_uploader()->UploadNewFile( |
| 644 remote_parent_folder_tracker_->file_id(), local_path_, | 648 remote_parent_folder_tracker_->file_id(), local_path_, |
| 645 title.AsUTF8Unsafe(), GetMimeTypeFromTitle(title), | 649 title.AsUTF8Unsafe(), GetMimeTypeFromTitle(title), |
| 646 drive::UploadNewFileOptions(), | 650 drive::UploadNewFileOptions(), |
| 647 base::Bind(&LocalToRemoteSyncer::DidUploadNewFile, | 651 base::Bind(&LocalToRemoteSyncer::DidUploadNewFile, |
| 648 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)), | 652 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token)), |
| 649 google_apis::ProgressCallback()); | 653 google_apis::ProgressCallback()); |
| 650 } | 654 } |
| 651 | 655 |
| 652 void LocalToRemoteSyncer::DidUploadNewFile( | 656 void LocalToRemoteSyncer::DidUploadNewFile( |
| 653 scoped_ptr<SyncTaskToken> token, | 657 std::unique_ptr<SyncTaskToken> token, |
| 654 google_apis::DriveApiErrorCode error, | 658 google_apis::DriveApiErrorCode error, |
| 655 const GURL& upload_location, | 659 const GURL& upload_location, |
| 656 scoped_ptr<google_apis::FileResource> entry) { | 660 std::unique_ptr<google_apis::FileResource> entry) { |
| 657 if (error == google_apis::HTTP_NOT_FOUND) | 661 if (error == google_apis::HTTP_NOT_FOUND) |
| 658 needs_remote_change_listing_ = true; | 662 needs_remote_change_listing_ = true; |
| 659 | 663 |
| 660 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); | 664 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); |
| 661 if (status != SYNC_STATUS_OK) { | 665 if (status != SYNC_STATUS_OK) { |
| 662 SyncCompleted(std::move(token), status); | 666 SyncCompleted(std::move(token), status); |
| 663 return; | 667 return; |
| 664 } | 668 } |
| 665 | 669 |
| 666 if (!entry) { | 670 if (!entry) { |
| 667 NOTREACHED(); | 671 NOTREACHED(); |
| 668 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); | 672 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); |
| 669 return; | 673 return; |
| 670 } | 674 } |
| 671 | 675 |
| 672 status = metadata_database()->ReplaceActiveTrackerWithNewResource( | 676 status = metadata_database()->ReplaceActiveTrackerWithNewResource( |
| 673 remote_parent_folder_tracker_->tracker_id(), *entry); | 677 remote_parent_folder_tracker_->tracker_id(), *entry); |
| 674 SyncCompleted(std::move(token), status); | 678 SyncCompleted(std::move(token), status); |
| 675 } | 679 } |
| 676 | 680 |
| 677 void LocalToRemoteSyncer::CreateRemoteFolder(scoped_ptr<SyncTaskToken> token) { | 681 void LocalToRemoteSyncer::CreateRemoteFolder( |
| 682 std::unique_ptr<SyncTaskToken> token) { |
| 678 DCHECK(remote_parent_folder_tracker_); | 683 DCHECK(remote_parent_folder_tracker_); |
| 679 | 684 |
| 680 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 685 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
| 681 file_type_ = SYNC_FILE_TYPE_DIRECTORY; | 686 file_type_ = SYNC_FILE_TYPE_DIRECTORY; |
| 682 sync_action_ = SYNC_ACTION_ADDED; | 687 sync_action_ = SYNC_ACTION_ADDED; |
| 683 | 688 |
| 684 DCHECK(!folder_creator_); | 689 DCHECK(!folder_creator_); |
| 685 folder_creator_.reset(new FolderCreator( | 690 folder_creator_.reset(new FolderCreator( |
| 686 drive_service(), metadata_database(), | 691 drive_service(), metadata_database(), |
| 687 remote_parent_folder_tracker_->file_id(), | 692 remote_parent_folder_tracker_->file_id(), |
| 688 title.AsUTF8Unsafe())); | 693 title.AsUTF8Unsafe())); |
| 689 folder_creator_->Run(base::Bind( | 694 folder_creator_->Run(base::Bind( |
| 690 &LocalToRemoteSyncer::DidCreateRemoteFolder, | 695 &LocalToRemoteSyncer::DidCreateRemoteFolder, |
| 691 weak_ptr_factory_.GetWeakPtr(), | 696 weak_ptr_factory_.GetWeakPtr(), |
| 692 base::Passed(&token))); | 697 base::Passed(&token))); |
| 693 } | 698 } |
| 694 | 699 |
| 695 void LocalToRemoteSyncer::DidCreateRemoteFolder( | 700 void LocalToRemoteSyncer::DidCreateRemoteFolder( |
| 696 scoped_ptr<SyncTaskToken> token, | 701 std::unique_ptr<SyncTaskToken> token, |
| 697 const std::string& file_id, | 702 const std::string& file_id, |
| 698 SyncStatusCode status) { | 703 SyncStatusCode status) { |
| 699 if (status == SYNC_FILE_ERROR_NOT_FOUND) | 704 if (status == SYNC_FILE_ERROR_NOT_FOUND) |
| 700 needs_remote_change_listing_ = true; | 705 needs_remote_change_listing_ = true; |
| 701 | 706 |
| 702 scoped_ptr<FolderCreator> deleter = std::move(folder_creator_); | 707 std::unique_ptr<FolderCreator> deleter = std::move(folder_creator_); |
| 703 if (status != SYNC_STATUS_OK) { | 708 if (status != SYNC_STATUS_OK) { |
| 704 SyncCompleted(std::move(token), status); | 709 SyncCompleted(std::move(token), status); |
| 705 return; | 710 return; |
| 706 } | 711 } |
| 707 | 712 |
| 708 status = SYNC_STATUS_FAILED; | 713 status = SYNC_STATUS_FAILED; |
| 709 MetadataDatabase::ActivationStatus activation_status = | 714 MetadataDatabase::ActivationStatus activation_status = |
| 710 metadata_database()->TryActivateTracker( | 715 metadata_database()->TryActivateTracker( |
| 711 remote_parent_folder_tracker_->tracker_id(), | 716 remote_parent_folder_tracker_->tracker_id(), |
| 712 file_id, &status); | 717 file_id, &status); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 724 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | 729 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 725 return; | 730 return; |
| 726 } | 731 } |
| 727 | 732 |
| 728 NOTREACHED(); | 733 NOTREACHED(); |
| 729 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); | 734 SyncCompleted(std::move(token), SYNC_STATUS_FAILED); |
| 730 return; | 735 return; |
| 731 } | 736 } |
| 732 | 737 |
| 733 void LocalToRemoteSyncer::DidDetachResourceForCreationConflict( | 738 void LocalToRemoteSyncer::DidDetachResourceForCreationConflict( |
| 734 scoped_ptr<SyncTaskToken> token, | 739 std::unique_ptr<SyncTaskToken> token, |
| 735 google_apis::DriveApiErrorCode error) { | 740 google_apis::DriveApiErrorCode error) { |
| 736 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); | 741 SyncStatusCode status = DriveApiErrorCodeToSyncStatusCode(error); |
| 737 if (status != SYNC_STATUS_OK) { | 742 if (status != SYNC_STATUS_OK) { |
| 738 SyncCompleted(std::move(token), status); | 743 SyncCompleted(std::move(token), status); |
| 739 return; | 744 return; |
| 740 } | 745 } |
| 741 | 746 |
| 742 SyncCompleted(std::move(token), SYNC_STATUS_RETRY); | 747 SyncCompleted(std::move(token), SYNC_STATUS_RETRY); |
| 743 } | 748 } |
| 744 | 749 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 757 set_used_network(true); | 762 set_used_network(true); |
| 758 return sync_context_->GetDriveUploader(); | 763 return sync_context_->GetDriveUploader(); |
| 759 } | 764 } |
| 760 | 765 |
| 761 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { | 766 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { |
| 762 return sync_context_->GetMetadataDatabase(); | 767 return sync_context_->GetMetadataDatabase(); |
| 763 } | 768 } |
| 764 | 769 |
| 765 } // namespace drive_backend | 770 } // namespace drive_backend |
| 766 } // namespace sync_file_system | 771 } // namespace sync_file_system |
| OLD | NEW |