Chromium Code Reviews| 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 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 363 return; | 363 return; |
| 364 } | 364 } |
| 365 | 365 |
| 366 const FileDetails& remote_details = remote_file_metadata.details(); | 366 const FileDetails& remote_details = remote_file_metadata.details(); |
| 367 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 367 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
| 368 if (!remote_details.missing() && | 368 if (!remote_details.missing() && |
| 369 remote_details.file_kind() == FILE_KIND_FOLDER && | 369 remote_details.file_kind() == FILE_KIND_FOLDER && |
| 370 remote_details.title() == title.AsUTF8Unsafe() && | 370 remote_details.title() == title.AsUTF8Unsafe() && |
| 371 HasFileAsParent(remote_details, | 371 HasFileAsParent(remote_details, |
| 372 remote_parent_folder_tracker_->file_id())) { | 372 remote_parent_folder_tracker_->file_id())) { |
| 373 | |
| 374 MoveToBackground( | 373 MoveToBackground( |
| 375 base::Bind(&LocalToRemoteSyncer::UpdateTrackerForReusedFolder, | 374 base::Bind(&LocalToRemoteSyncer::UpdateTrackerForReusedFolder, |
| 376 weak_ptr_factory_.GetWeakPtr(), | 375 weak_ptr_factory_.GetWeakPtr(), |
| 377 remote_details), | 376 remote_details), |
| 378 token.Pass()); | 377 token.Pass()); |
| 379 return; | 378 return; |
| 380 } | 379 } |
| 381 | 380 |
| 382 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder, | 381 MoveToBackground(base::Bind(&LocalToRemoteSyncer::CreateRemoteFolder, |
| 383 weak_ptr_factory_.GetWeakPtr()), | 382 weak_ptr_factory_.GetWeakPtr()), |
| 384 token.Pass()); | 383 token.Pass()); |
| 385 } | 384 } |
| 386 | 385 |
| 387 void LocalToRemoteSyncer::UpdateTrackerForReusedFolder( | 386 void LocalToRemoteSyncer::UpdateTrackerForReusedFolder( |
| 388 const FileDetails& details, | 387 const FileDetails& details, |
| 389 scoped_ptr<SyncTaskToken> token) { | 388 scoped_ptr<SyncTaskToken> token) { |
| 390 metadata_database()->UpdateTracker( | 389 SyncStatusCode status = metadata_database()->UpdateTracker( |
| 391 remote_file_tracker_->tracker_id(), details, | 390 remote_file_tracker_->tracker_id(), details); |
| 392 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 391 SyncCompleted(token.Pass(), status); |
| 393 weak_ptr_factory_.GetWeakPtr(), | |
| 394 base::Passed(&token))); | |
| 395 } | 392 } |
| 396 | 393 |
| 397 void LocalToRemoteSyncer::HandleExistingRemoteFile( | 394 void LocalToRemoteSyncer::HandleExistingRemoteFile( |
| 398 scoped_ptr<SyncTaskToken> token) { | 395 scoped_ptr<SyncTaskToken> token) { |
| 399 DCHECK(remote_file_tracker_); | 396 DCHECK(remote_file_tracker_); |
| 400 DCHECK(!remote_file_tracker_->dirty()); | 397 DCHECK(!remote_file_tracker_->dirty()); |
| 401 DCHECK(remote_file_tracker_->active()); | 398 DCHECK(remote_file_tracker_->active()); |
| 402 DCHECK(remote_file_tracker_->has_synced_details()); | 399 DCHECK(remote_file_tracker_->has_synced_details()); |
| 403 | 400 |
| 404 if (local_is_missing_) { | 401 if (local_is_missing_) { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 475 SyncCompleted(token.Pass(), status); | 472 SyncCompleted(token.Pass(), status); |
| 476 return; | 473 return; |
| 477 } | 474 } |
| 478 | 475 |
| 479 // Handle NOT_FOUND case as SUCCESS case. | 476 // Handle NOT_FOUND case as SUCCESS case. |
| 480 // For PRECONDITION / CONFLICT case, the remote file is modified since the | 477 // For PRECONDITION / CONFLICT case, the remote file is modified since the |
| 481 // last sync completed. As our policy for deletion-modification conflict | 478 // last sync completed. As our policy for deletion-modification conflict |
| 482 // resolution, ignore the local deletion. | 479 // resolution, ignore the local deletion. |
| 483 if (status == SYNC_STATUS_OK || | 480 if (status == SYNC_STATUS_OK || |
| 484 error == google_apis::HTTP_NOT_FOUND) { | 481 error == google_apis::HTTP_NOT_FOUND) { |
| 485 metadata_database()->UpdateByDeletedRemoteFile( | 482 SyncStatusCode status = metadata_database()->UpdateByDeletedRemoteFile( |
| 486 remote_file_tracker_->file_id(), | 483 remote_file_tracker_->file_id()); |
| 487 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 484 SyncCompleted(token.Pass(), status); |
| 488 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | |
| 489 return; | 485 return; |
| 490 } | 486 } |
| 491 | 487 |
| 492 SyncCompleted(token.Pass(), SYNC_STATUS_OK); | 488 SyncCompleted(token.Pass(), SYNC_STATUS_OK); |
| 493 } | 489 } |
| 494 | 490 |
| 495 void LocalToRemoteSyncer::UploadExistingFile(scoped_ptr<SyncTaskToken> token) { | 491 void LocalToRemoteSyncer::UploadExistingFile(scoped_ptr<SyncTaskToken> token) { |
| 496 DCHECK(remote_file_tracker_); | 492 DCHECK(remote_file_tracker_); |
| 497 DCHECK(remote_file_tracker_->has_synced_details()); | 493 DCHECK(remote_file_tracker_->has_synced_details()); |
| 498 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | 494 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 544 return; | 540 return; |
| 545 } | 541 } |
| 546 | 542 |
| 547 if (!entry) { | 543 if (!entry) { |
| 548 NOTREACHED(); | 544 NOTREACHED(); |
| 549 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 545 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
| 550 return; | 546 return; |
| 551 } | 547 } |
| 552 | 548 |
| 553 DCHECK(entry); | 549 DCHECK(entry); |
| 554 metadata_database()->UpdateByFileResource( | 550 status = metadata_database()->UpdateByFileResource(*entry); |
| 555 *entry, | 551 DidUpdateDatabaseForUploadExistingFile(token.Pass(), status); |
|
peria
2014/09/10 00:24:15
Expand DidUpdateDatabaseForUploadExistingFile() he
tzik
2014/09/10 00:56:54
ditto
| |
| 556 base::Bind(&LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile, | |
| 557 weak_ptr_factory_.GetWeakPtr(), | |
| 558 base::Passed(&token))); | |
| 559 } | 552 } |
| 560 | 553 |
| 561 void LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile( | 554 void LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile( |
| 562 scoped_ptr<SyncTaskToken> token, | 555 scoped_ptr<SyncTaskToken> token, |
| 563 SyncStatusCode status) { | 556 SyncStatusCode status) { |
| 564 if (status != SYNC_STATUS_OK) { | 557 if (status != SYNC_STATUS_OK) { |
| 565 SyncCompleted(token.Pass(), status); | 558 SyncCompleted(token.Pass(), status); |
| 566 return; | 559 return; |
| 567 } | 560 } |
| 568 | 561 |
| 569 FileMetadata file; | 562 FileMetadata file; |
| 570 if (!metadata_database()->FindFileByFileID( | 563 if (!metadata_database()->FindFileByFileID( |
| 571 remote_file_tracker_->file_id(), &file)) { | 564 remote_file_tracker_->file_id(), &file)) { |
| 572 NOTREACHED(); | 565 NOTREACHED(); |
| 573 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 566 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
| 574 return; | 567 return; |
| 575 } | 568 } |
| 576 | 569 |
| 577 const FileDetails& details = file.details(); | 570 const FileDetails& details = file.details(); |
| 578 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 571 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
| 579 if (!details.missing() && | 572 if (!details.missing() && |
| 580 details.file_kind() == FILE_KIND_FILE && | 573 details.file_kind() == FILE_KIND_FILE && |
| 581 details.title() == title.AsUTF8Unsafe() && | 574 details.title() == title.AsUTF8Unsafe() && |
| 582 HasFileAsParent(details, | 575 HasFileAsParent(details, |
| 583 remote_parent_folder_tracker_->file_id())) { | 576 remote_parent_folder_tracker_->file_id())) { |
| 584 metadata_database()->UpdateTracker( | 577 SyncStatusCode status = metadata_database()->UpdateTracker( |
| 585 remote_file_tracker_->tracker_id(), | 578 remote_file_tracker_->tracker_id(), file.details()); |
| 586 file.details(), | 579 SyncCompleted(token.Pass(), status); |
| 587 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
| 588 weak_ptr_factory_.GetWeakPtr(), | |
| 589 base::Passed(&token))); | |
| 590 return; | 580 return; |
| 591 } | 581 } |
| 592 | 582 |
| 593 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); | 583 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); |
| 594 } | 584 } |
| 595 | 585 |
| 596 void LocalToRemoteSyncer::UpdateRemoteMetadata( | 586 void LocalToRemoteSyncer::UpdateRemoteMetadata( |
| 597 const std::string& file_id, | 587 const std::string& file_id, |
| 598 scoped_ptr<SyncTaskToken> token) { | 588 scoped_ptr<SyncTaskToken> token) { |
| 599 DCHECK(remote_file_tracker_); | 589 DCHECK(remote_file_tracker_); |
| 600 | 590 |
| 601 drive_service()->GetFileResource( | 591 drive_service()->GetFileResource( |
| 602 file_id, | 592 file_id, |
| 603 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, | 593 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, |
| 604 weak_ptr_factory_.GetWeakPtr(), | 594 weak_ptr_factory_.GetWeakPtr(), |
| 605 file_id, base::Passed(&token))); | 595 file_id, base::Passed(&token))); |
| 606 } | 596 } |
| 607 | 597 |
| 608 void LocalToRemoteSyncer::DidGetRemoteMetadata( | 598 void LocalToRemoteSyncer::DidGetRemoteMetadata( |
| 609 const std::string& file_id, | 599 const std::string& file_id, |
| 610 scoped_ptr<SyncTaskToken> token, | 600 scoped_ptr<SyncTaskToken> token, |
| 611 google_apis::GDataErrorCode error, | 601 google_apis::GDataErrorCode error, |
| 612 scoped_ptr<google_apis::FileResource> entry) { | 602 scoped_ptr<google_apis::FileResource> entry) { |
| 613 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | 603 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); |
| 614 | 604 |
| 615 if (error == google_apis::HTTP_NOT_FOUND) { | 605 if (error == google_apis::HTTP_NOT_FOUND) { |
| 616 retry_on_success_ = true; | 606 retry_on_success_ = true; |
| 617 metadata_database()->UpdateByDeletedRemoteFile( | 607 SyncStatusCode status = |
| 618 file_id, | 608 metadata_database()->UpdateByDeletedRemoteFile(file_id); |
| 619 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 609 SyncCompleted(token.Pass(), status); |
| 620 weak_ptr_factory_.GetWeakPtr(), | |
| 621 base::Passed(&token))); | |
| 622 return; | 610 return; |
| 623 } | 611 } |
| 624 | 612 |
| 625 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 613 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 626 if (status != SYNC_STATUS_OK) { | 614 if (status != SYNC_STATUS_OK) { |
| 627 SyncCompleted(token.Pass(), status); | 615 SyncCompleted(token.Pass(), status); |
| 628 return; | 616 return; |
| 629 } | 617 } |
| 630 | 618 |
| 631 if (!entry) { | 619 if (!entry) { |
| 632 NOTREACHED(); | 620 NOTREACHED(); |
| 633 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 621 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
| 634 return; | 622 return; |
| 635 } | 623 } |
| 636 | 624 |
| 637 retry_on_success_ = true; | 625 retry_on_success_ = true; |
| 638 metadata_database()->UpdateByFileResource( | 626 status = metadata_database()->UpdateByFileResource(*entry); |
| 639 *entry, | 627 SyncCompleted(token.Pass(), status); |
| 640 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
| 641 weak_ptr_factory_.GetWeakPtr(), | |
| 642 base::Passed(&token))); | |
| 643 } | 628 } |
| 644 | 629 |
| 645 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { | 630 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { |
| 646 DCHECK(remote_parent_folder_tracker_); | 631 DCHECK(remote_parent_folder_tracker_); |
| 647 | 632 |
| 648 sync_action_ = SYNC_ACTION_ADDED; | 633 sync_action_ = SYNC_ACTION_ADDED; |
| 649 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 634 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
| 650 drive_uploader()->UploadNewFile( | 635 drive_uploader()->UploadNewFile( |
| 651 remote_parent_folder_tracker_->file_id(), | 636 remote_parent_folder_tracker_->file_id(), |
| 652 local_path_, | 637 local_path_, |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 672 SyncCompleted(token.Pass(), status); | 657 SyncCompleted(token.Pass(), status); |
| 673 return; | 658 return; |
| 674 } | 659 } |
| 675 | 660 |
| 676 if (!entry) { | 661 if (!entry) { |
| 677 NOTREACHED(); | 662 NOTREACHED(); |
| 678 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 663 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
| 679 return; | 664 return; |
| 680 } | 665 } |
| 681 | 666 |
| 682 metadata_database()->ReplaceActiveTrackerWithNewResource( | 667 status = metadata_database()->ReplaceActiveTrackerWithNewResource( |
| 683 remote_parent_folder_tracker_->tracker_id(), *entry, | 668 remote_parent_folder_tracker_->tracker_id(), *entry); |
| 684 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 669 SyncCompleted(token.Pass(), status); |
| 685 weak_ptr_factory_.GetWeakPtr(), | |
| 686 base::Passed(&token))); | |
| 687 } | 670 } |
| 688 | 671 |
| 689 void LocalToRemoteSyncer::CreateRemoteFolder( | 672 void LocalToRemoteSyncer::CreateRemoteFolder( |
| 690 scoped_ptr<SyncTaskToken> token) { | 673 scoped_ptr<SyncTaskToken> token) { |
| 691 DCHECK(remote_parent_folder_tracker_); | 674 DCHECK(remote_parent_folder_tracker_); |
| 692 | 675 |
| 693 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 676 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
| 694 sync_action_ = SYNC_ACTION_ADDED; | 677 sync_action_ = SYNC_ACTION_ADDED; |
| 695 | 678 |
| 696 DCHECK(!folder_creator_); | 679 DCHECK(!folder_creator_); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 710 SyncStatusCode status) { | 693 SyncStatusCode status) { |
| 711 if (status == SYNC_FILE_ERROR_NOT_FOUND) | 694 if (status == SYNC_FILE_ERROR_NOT_FOUND) |
| 712 needs_remote_change_listing_ = true; | 695 needs_remote_change_listing_ = true; |
| 713 | 696 |
| 714 scoped_ptr<FolderCreator> deleter = folder_creator_.Pass(); | 697 scoped_ptr<FolderCreator> deleter = folder_creator_.Pass(); |
| 715 if (status != SYNC_STATUS_OK) { | 698 if (status != SYNC_STATUS_OK) { |
| 716 SyncCompleted(token.Pass(), status); | 699 SyncCompleted(token.Pass(), status); |
| 717 return; | 700 return; |
| 718 } | 701 } |
| 719 | 702 |
| 703 status = SYNC_STATUS_FAILED; | |
| 720 MetadataDatabase::ActivationStatus activation_status = | 704 MetadataDatabase::ActivationStatus activation_status = |
| 721 metadata_database()->TryActivateTracker( | 705 metadata_database()->TryActivateTracker( |
| 722 remote_parent_folder_tracker_->tracker_id(), | 706 remote_parent_folder_tracker_->tracker_id(), |
| 723 file_id, | 707 file_id, &status); |
| 724 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
| 725 weak_ptr_factory_.GetWeakPtr(), | |
| 726 base::Passed(token.Pass()))); | |
| 727 switch (activation_status) { | 708 switch (activation_status) { |
| 728 case MetadataDatabase::ACTIVATION_PENDING: | 709 case MetadataDatabase::ACTIVATION_PENDING: |
| 729 // The task will be finalized by the callback passed to MetadataDatabase | 710 SyncCompleted(token.Pass(), status); |
| 730 // in this case. | |
| 731 return; | 711 return; |
| 732 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER: | 712 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER: |
| 733 // The activation failed due to another tracker that has another parent. | 713 // The activation failed due to another tracker that has another parent. |
| 734 // Detach the folder from the current parent to avoid using this folder as | 714 // Detach the folder from the current parent to avoid using this folder as |
| 735 // active folder. | 715 // active folder. |
| 736 drive_service()->RemoveResourceFromDirectory( | 716 drive_service()->RemoveResourceFromDirectory( |
| 737 remote_parent_folder_tracker_->file_id(), file_id, | 717 remote_parent_folder_tracker_->file_id(), file_id, |
| 738 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict, | 718 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict, |
| 739 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | 719 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 740 return; | 720 return; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 772 set_used_network(true); | 752 set_used_network(true); |
| 773 return sync_context_->GetDriveUploader(); | 753 return sync_context_->GetDriveUploader(); |
| 774 } | 754 } |
| 775 | 755 |
| 776 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { | 756 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { |
| 777 return sync_context_->GetMetadataDatabase(); | 757 return sync_context_->GetMetadataDatabase(); |
| 778 } | 758 } |
| 779 | 759 |
| 780 } // namespace drive_backend | 760 } // namespace drive_backend |
| 781 } // namespace sync_file_system | 761 } // namespace sync_file_system |
| OLD | NEW |