| 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 <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 namespace { | 35 namespace { |
| 36 | 36 |
| 37 scoped_ptr<FileTracker> FindTrackerByID(MetadataDatabase* metadata_database, | 37 scoped_ptr<FileTracker> FindTrackerByID(MetadataDatabase* metadata_database, |
| 38 int64 tracker_id) { | 38 int64 tracker_id) { |
| 39 scoped_ptr<FileTracker> tracker(new FileTracker); | 39 scoped_ptr<FileTracker> tracker(new FileTracker); |
| 40 if (metadata_database->FindTrackerByTrackerID(tracker_id, tracker.get())) | 40 if (metadata_database->FindTrackerByTrackerID(tracker_id, tracker.get())) |
| 41 return tracker.Pass(); | 41 return tracker.Pass(); |
| 42 return scoped_ptr<FileTracker>(); | 42 return scoped_ptr<FileTracker>(); |
| 43 } | 43 } |
| 44 | 44 |
| 45 void ReturnRetryOnSuccess(const SyncStatusCallback& callback, | |
| 46 SyncStatusCode status) { | |
| 47 if (status == SYNC_STATUS_OK) | |
| 48 status = SYNC_STATUS_RETRY; | |
| 49 callback.Run(status); | |
| 50 } | |
| 51 | |
| 52 bool IsLocalFileMissing(const SyncFileMetadata& local_metadata, | 45 bool IsLocalFileMissing(const SyncFileMetadata& local_metadata, |
| 53 const FileChange& local_change) { | 46 const FileChange& local_change) { |
| 54 return local_metadata.file_type == SYNC_FILE_TYPE_UNKNOWN || | 47 return local_metadata.file_type == SYNC_FILE_TYPE_UNKNOWN || |
| 55 local_change.IsDelete(); | 48 local_change.IsDelete(); |
| 56 } | 49 } |
| 57 | 50 |
| 58 } // namespace | 51 } // namespace |
| 59 | 52 |
| 60 LocalToRemoteSyncer::LocalToRemoteSyncer(SyncEngineContext* sync_context, | 53 LocalToRemoteSyncer::LocalToRemoteSyncer(SyncEngineContext* sync_context, |
| 61 const SyncFileMetadata& local_metadata, | 54 const SyncFileMetadata& local_metadata, |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 error == google_apis::HTTP_CONFLICT || | 428 error == google_apis::HTTP_CONFLICT || |
| 436 error == google_apis::HTTP_NOT_FOUND) { | 429 error == google_apis::HTTP_NOT_FOUND) { |
| 437 // The remote file has unfetched remote change. Fetch latest metadata and | 430 // The remote file has unfetched remote change. Fetch latest metadata and |
| 438 // update database with it. | 431 // update database with it. |
| 439 // TODO(tzik): Consider adding local side low-priority dirtiness handling to | 432 // TODO(tzik): Consider adding local side low-priority dirtiness handling to |
| 440 // handle this as ListChangesTask. | 433 // handle this as ListChangesTask. |
| 441 | 434 |
| 442 needs_remote_change_listing_ = true; | 435 needs_remote_change_listing_ = true; |
| 443 UpdateRemoteMetadata( | 436 UpdateRemoteMetadata( |
| 444 remote_file_tracker_->file_id(), | 437 remote_file_tracker_->file_id(), |
| 445 base::Bind(&ReturnRetryOnSuccess, | 438 token.Pass()); |
| 446 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
| 447 weak_ptr_factory_.GetWeakPtr(), | |
| 448 base::Passed(&token)))); | |
| 449 return; | 439 return; |
| 450 } | 440 } |
| 451 | 441 |
| 452 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 442 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 453 if (status != SYNC_STATUS_OK) { | 443 if (status != SYNC_STATUS_OK) { |
| 454 SyncCompleted(token.Pass(), status); | 444 SyncCompleted(token.Pass(), status); |
| 455 return; | 445 return; |
| 456 } | 446 } |
| 457 | 447 |
| 458 if (!entry) { | 448 if (!entry) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 weak_ptr_factory_.GetWeakPtr(), | 489 weak_ptr_factory_.GetWeakPtr(), |
| 500 base::Passed(&token))); | 490 base::Passed(&token))); |
| 501 return; | 491 return; |
| 502 } | 492 } |
| 503 | 493 |
| 504 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); | 494 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); |
| 505 } | 495 } |
| 506 | 496 |
| 507 void LocalToRemoteSyncer::UpdateRemoteMetadata( | 497 void LocalToRemoteSyncer::UpdateRemoteMetadata( |
| 508 const std::string& file_id, | 498 const std::string& file_id, |
| 509 const SyncStatusCallback& callback) { | 499 scoped_ptr<SyncTaskToken> token) { |
| 510 DCHECK(remote_file_tracker_); | 500 DCHECK(remote_file_tracker_); |
| 511 | 501 |
| 512 drive_service()->GetFileResource( | 502 drive_service()->GetFileResource( |
| 513 file_id, | 503 file_id, |
| 514 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, | 504 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, |
| 515 weak_ptr_factory_.GetWeakPtr(), | 505 weak_ptr_factory_.GetWeakPtr(), |
| 516 file_id, callback)); | 506 file_id, base::Passed(&token))); |
| 517 } | 507 } |
| 518 | 508 |
| 519 void LocalToRemoteSyncer::DidGetRemoteMetadata( | 509 void LocalToRemoteSyncer::DidGetRemoteMetadata( |
| 520 const std::string& file_id, | 510 const std::string& file_id, |
| 521 const SyncStatusCallback& callback, | 511 scoped_ptr<SyncTaskToken> token, |
| 522 google_apis::GDataErrorCode error, | 512 google_apis::GDataErrorCode error, |
| 523 scoped_ptr<google_apis::FileResource> entry) { | 513 scoped_ptr<google_apis::FileResource> entry) { |
| 524 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | 514 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); |
| 525 | 515 |
| 526 if (error == google_apis::HTTP_NOT_FOUND) { | 516 if (error == google_apis::HTTP_NOT_FOUND) { |
| 527 metadata_database()->UpdateByDeletedRemoteFile(file_id, callback); | 517 metadata_database()->UpdateByDeletedRemoteFile( |
| 518 file_id, |
| 519 base::Bind(&LocalToRemoteSyncer::CompleteWithRetryStatus, |
| 520 weak_ptr_factory_.GetWeakPtr(), |
| 521 base::Passed(&token))); |
| 528 return; | 522 return; |
| 529 } | 523 } |
| 530 | 524 |
| 531 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 525 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 532 if (status != SYNC_STATUS_OK) { | 526 if (status != SYNC_STATUS_OK) { |
| 533 callback.Run(status); | 527 SyncCompleted(token.Pass(), status); |
| 534 return; | 528 return; |
| 535 } | 529 } |
| 536 | 530 |
| 537 if (!entry) { | 531 if (!entry) { |
| 538 NOTREACHED(); | 532 NOTREACHED(); |
| 539 callback.Run(SYNC_STATUS_FAILED); | 533 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
| 540 return; | 534 return; |
| 541 } | 535 } |
| 542 | 536 |
| 543 metadata_database()->UpdateByFileResource(*entry, callback); | 537 metadata_database()->UpdateByFileResource( |
| 538 *entry, |
| 539 base::Bind(&LocalToRemoteSyncer::CompleteWithRetryStatus, |
| 540 weak_ptr_factory_.GetWeakPtr(), |
| 541 base::Passed(&token))); |
| 544 } | 542 } |
| 545 | 543 |
| 546 void LocalToRemoteSyncer::DidDeleteForUploadNewFile( | 544 void LocalToRemoteSyncer::DidDeleteForUploadNewFile( |
| 547 scoped_ptr<SyncTaskToken> token, | 545 scoped_ptr<SyncTaskToken> token, |
| 548 SyncStatusCode status) { | 546 SyncStatusCode status) { |
| 549 if (status == SYNC_STATUS_HAS_CONFLICT) { | 547 if (status == SYNC_STATUS_HAS_CONFLICT) { |
| 550 UpdateRemoteMetadata( | 548 UpdateRemoteMetadata( |
| 551 remote_file_tracker_->file_id(), | 549 remote_file_tracker_->file_id(), |
| 552 base::Bind(&ReturnRetryOnSuccess, | 550 token.Pass()); |
| 553 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
| 554 weak_ptr_factory_.GetWeakPtr(), | |
| 555 base::Passed(&token)))); | |
| 556 return; | 551 return; |
| 557 } | 552 } |
| 558 | 553 |
| 559 if (status != SYNC_STATUS_OK) { | 554 if (status != SYNC_STATUS_OK) { |
| 560 SyncCompleted(token.Pass(), status); | 555 SyncCompleted(token.Pass(), status); |
| 561 return; | 556 return; |
| 562 } | 557 } |
| 563 | 558 |
| 564 UploadNewFile(token.Pass()); | 559 UploadNewFile(token.Pass()); |
| 565 } | 560 } |
| 566 | 561 |
| 567 void LocalToRemoteSyncer::DidDeleteForCreateFolder( | 562 void LocalToRemoteSyncer::DidDeleteForCreateFolder( |
| 568 scoped_ptr<SyncTaskToken> token, | 563 scoped_ptr<SyncTaskToken> token, |
| 569 SyncStatusCode status) { | 564 SyncStatusCode status) { |
| 570 if (status == SYNC_STATUS_HAS_CONFLICT) { | 565 if (status == SYNC_STATUS_HAS_CONFLICT) { |
| 571 UpdateRemoteMetadata( | 566 UpdateRemoteMetadata(remote_file_tracker_->file_id(), token.Pass()); |
| 572 remote_file_tracker_->file_id(), | |
| 573 base::Bind(&ReturnRetryOnSuccess, | |
| 574 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
| 575 weak_ptr_factory_.GetWeakPtr(), | |
| 576 base::Passed(&token)))); | |
| 577 return; | 567 return; |
| 578 } | 568 } |
| 579 | 569 |
| 580 if (status != SYNC_STATUS_OK) { | 570 if (status != SYNC_STATUS_OK) { |
| 581 SyncCompleted(token.Pass(), status); | 571 SyncCompleted(token.Pass(), status); |
| 582 return; | 572 return; |
| 583 } | 573 } |
| 584 | 574 |
| 585 CreateRemoteFolder(token.Pass()); | 575 CreateRemoteFolder(token.Pass()); |
| 586 } | 576 } |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 | 703 |
| 714 drive::DriveUploaderInterface* LocalToRemoteSyncer::drive_uploader() { | 704 drive::DriveUploaderInterface* LocalToRemoteSyncer::drive_uploader() { |
| 715 set_used_network(true); | 705 set_used_network(true); |
| 716 return sync_context_->GetDriveUploader(); | 706 return sync_context_->GetDriveUploader(); |
| 717 } | 707 } |
| 718 | 708 |
| 719 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { | 709 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { |
| 720 return sync_context_->GetMetadataDatabase(); | 710 return sync_context_->GetMetadataDatabase(); |
| 721 } | 711 } |
| 722 | 712 |
| 713 void LocalToRemoteSyncer::CompleteWithRetryStatus( |
| 714 scoped_ptr<SyncTaskToken> token, |
| 715 SyncStatusCode status) { |
| 716 if (status == SYNC_STATUS_OK) |
| 717 status = SYNC_STATUS_RETRY; |
| 718 SyncCompleted(token.Pass(), status); |
| 719 } |
| 720 |
| 723 } // namespace drive_backend | 721 } // namespace drive_backend |
| 724 } // namespace sync_file_system | 722 } // namespace sync_file_system |
| OLD | NEW |