| 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 |
| 556 base::Bind(&LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile, | 552 // TODO(tzik): Expand this function. |
| 557 weak_ptr_factory_.GetWeakPtr(), | 553 DidUpdateDatabaseForUploadExistingFile(token.Pass(), status); |
| 558 base::Passed(&token))); | |
| 559 } | 554 } |
| 560 | 555 |
| 561 void LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile( | 556 void LocalToRemoteSyncer::DidUpdateDatabaseForUploadExistingFile( |
| 562 scoped_ptr<SyncTaskToken> token, | 557 scoped_ptr<SyncTaskToken> token, |
| 563 SyncStatusCode status) { | 558 SyncStatusCode status) { |
| 564 if (status != SYNC_STATUS_OK) { | 559 if (status != SYNC_STATUS_OK) { |
| 565 SyncCompleted(token.Pass(), status); | 560 SyncCompleted(token.Pass(), status); |
| 566 return; | 561 return; |
| 567 } | 562 } |
| 568 | 563 |
| 569 FileMetadata file; | 564 FileMetadata file; |
| 570 if (!metadata_database()->FindFileByFileID( | 565 if (!metadata_database()->FindFileByFileID( |
| 571 remote_file_tracker_->file_id(), &file)) { | 566 remote_file_tracker_->file_id(), &file)) { |
| 572 NOTREACHED(); | 567 NOTREACHED(); |
| 573 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 568 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
| 574 return; | 569 return; |
| 575 } | 570 } |
| 576 | 571 |
| 577 const FileDetails& details = file.details(); | 572 const FileDetails& details = file.details(); |
| 578 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 573 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
| 579 if (!details.missing() && | 574 if (!details.missing() && |
| 580 details.file_kind() == FILE_KIND_FILE && | 575 details.file_kind() == FILE_KIND_FILE && |
| 581 details.title() == title.AsUTF8Unsafe() && | 576 details.title() == title.AsUTF8Unsafe() && |
| 582 HasFileAsParent(details, | 577 HasFileAsParent(details, |
| 583 remote_parent_folder_tracker_->file_id())) { | 578 remote_parent_folder_tracker_->file_id())) { |
| 584 metadata_database()->UpdateTracker( | 579 SyncStatusCode status = metadata_database()->UpdateTracker( |
| 585 remote_file_tracker_->tracker_id(), | 580 remote_file_tracker_->tracker_id(), file.details()); |
| 586 file.details(), | 581 SyncCompleted(token.Pass(), status); |
| 587 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
| 588 weak_ptr_factory_.GetWeakPtr(), | |
| 589 base::Passed(&token))); | |
| 590 return; | 582 return; |
| 591 } | 583 } |
| 592 | 584 |
| 593 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); | 585 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); |
| 594 } | 586 } |
| 595 | 587 |
| 596 void LocalToRemoteSyncer::UpdateRemoteMetadata( | 588 void LocalToRemoteSyncer::UpdateRemoteMetadata( |
| 597 const std::string& file_id, | 589 const std::string& file_id, |
| 598 scoped_ptr<SyncTaskToken> token) { | 590 scoped_ptr<SyncTaskToken> token) { |
| 599 DCHECK(remote_file_tracker_); | 591 DCHECK(remote_file_tracker_); |
| 600 | 592 |
| 601 drive_service()->GetFileResource( | 593 drive_service()->GetFileResource( |
| 602 file_id, | 594 file_id, |
| 603 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, | 595 base::Bind(&LocalToRemoteSyncer::DidGetRemoteMetadata, |
| 604 weak_ptr_factory_.GetWeakPtr(), | 596 weak_ptr_factory_.GetWeakPtr(), |
| 605 file_id, base::Passed(&token))); | 597 file_id, base::Passed(&token))); |
| 606 } | 598 } |
| 607 | 599 |
| 608 void LocalToRemoteSyncer::DidGetRemoteMetadata( | 600 void LocalToRemoteSyncer::DidGetRemoteMetadata( |
| 609 const std::string& file_id, | 601 const std::string& file_id, |
| 610 scoped_ptr<SyncTaskToken> token, | 602 scoped_ptr<SyncTaskToken> token, |
| 611 google_apis::GDataErrorCode error, | 603 google_apis::GDataErrorCode error, |
| 612 scoped_ptr<google_apis::FileResource> entry) { | 604 scoped_ptr<google_apis::FileResource> entry) { |
| 613 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | 605 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); |
| 614 | 606 |
| 615 if (error == google_apis::HTTP_NOT_FOUND) { | 607 if (error == google_apis::HTTP_NOT_FOUND) { |
| 616 retry_on_success_ = true; | 608 retry_on_success_ = true; |
| 617 metadata_database()->UpdateByDeletedRemoteFile( | 609 SyncStatusCode status = |
| 618 file_id, | 610 metadata_database()->UpdateByDeletedRemoteFile(file_id); |
| 619 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 611 SyncCompleted(token.Pass(), status); |
| 620 weak_ptr_factory_.GetWeakPtr(), | |
| 621 base::Passed(&token))); | |
| 622 return; | 612 return; |
| 623 } | 613 } |
| 624 | 614 |
| 625 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 615 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 626 if (status != SYNC_STATUS_OK) { | 616 if (status != SYNC_STATUS_OK) { |
| 627 SyncCompleted(token.Pass(), status); | 617 SyncCompleted(token.Pass(), status); |
| 628 return; | 618 return; |
| 629 } | 619 } |
| 630 | 620 |
| 631 if (!entry) { | 621 if (!entry) { |
| 632 NOTREACHED(); | 622 NOTREACHED(); |
| 633 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 623 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
| 634 return; | 624 return; |
| 635 } | 625 } |
| 636 | 626 |
| 637 retry_on_success_ = true; | 627 retry_on_success_ = true; |
| 638 metadata_database()->UpdateByFileResource( | 628 status = metadata_database()->UpdateByFileResource(*entry); |
| 639 *entry, | 629 SyncCompleted(token.Pass(), status); |
| 640 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
| 641 weak_ptr_factory_.GetWeakPtr(), | |
| 642 base::Passed(&token))); | |
| 643 } | 630 } |
| 644 | 631 |
| 645 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { | 632 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { |
| 646 DCHECK(remote_parent_folder_tracker_); | 633 DCHECK(remote_parent_folder_tracker_); |
| 647 | 634 |
| 648 sync_action_ = SYNC_ACTION_ADDED; | 635 sync_action_ = SYNC_ACTION_ADDED; |
| 649 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 636 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
| 650 drive_uploader()->UploadNewFile( | 637 drive_uploader()->UploadNewFile( |
| 651 remote_parent_folder_tracker_->file_id(), | 638 remote_parent_folder_tracker_->file_id(), |
| 652 local_path_, | 639 local_path_, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 672 SyncCompleted(token.Pass(), status); | 659 SyncCompleted(token.Pass(), status); |
| 673 return; | 660 return; |
| 674 } | 661 } |
| 675 | 662 |
| 676 if (!entry) { | 663 if (!entry) { |
| 677 NOTREACHED(); | 664 NOTREACHED(); |
| 678 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 665 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
| 679 return; | 666 return; |
| 680 } | 667 } |
| 681 | 668 |
| 682 metadata_database()->ReplaceActiveTrackerWithNewResource( | 669 status = metadata_database()->ReplaceActiveTrackerWithNewResource( |
| 683 remote_parent_folder_tracker_->tracker_id(), *entry, | 670 remote_parent_folder_tracker_->tracker_id(), *entry); |
| 684 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 671 SyncCompleted(token.Pass(), status); |
| 685 weak_ptr_factory_.GetWeakPtr(), | |
| 686 base::Passed(&token))); | |
| 687 } | 672 } |
| 688 | 673 |
| 689 void LocalToRemoteSyncer::CreateRemoteFolder( | 674 void LocalToRemoteSyncer::CreateRemoteFolder( |
| 690 scoped_ptr<SyncTaskToken> token) { | 675 scoped_ptr<SyncTaskToken> token) { |
| 691 DCHECK(remote_parent_folder_tracker_); | 676 DCHECK(remote_parent_folder_tracker_); |
| 692 | 677 |
| 693 base::FilePath title = storage::VirtualPath::BaseName(target_path_); | 678 base::FilePath title = storage::VirtualPath::BaseName(target_path_); |
| 694 sync_action_ = SYNC_ACTION_ADDED; | 679 sync_action_ = SYNC_ACTION_ADDED; |
| 695 | 680 |
| 696 DCHECK(!folder_creator_); | 681 DCHECK(!folder_creator_); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 710 SyncStatusCode status) { | 695 SyncStatusCode status) { |
| 711 if (status == SYNC_FILE_ERROR_NOT_FOUND) | 696 if (status == SYNC_FILE_ERROR_NOT_FOUND) |
| 712 needs_remote_change_listing_ = true; | 697 needs_remote_change_listing_ = true; |
| 713 | 698 |
| 714 scoped_ptr<FolderCreator> deleter = folder_creator_.Pass(); | 699 scoped_ptr<FolderCreator> deleter = folder_creator_.Pass(); |
| 715 if (status != SYNC_STATUS_OK) { | 700 if (status != SYNC_STATUS_OK) { |
| 716 SyncCompleted(token.Pass(), status); | 701 SyncCompleted(token.Pass(), status); |
| 717 return; | 702 return; |
| 718 } | 703 } |
| 719 | 704 |
| 705 status = SYNC_STATUS_FAILED; |
| 720 MetadataDatabase::ActivationStatus activation_status = | 706 MetadataDatabase::ActivationStatus activation_status = |
| 721 metadata_database()->TryActivateTracker( | 707 metadata_database()->TryActivateTracker( |
| 722 remote_parent_folder_tracker_->tracker_id(), | 708 remote_parent_folder_tracker_->tracker_id(), |
| 723 file_id, | 709 file_id, &status); |
| 724 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
| 725 weak_ptr_factory_.GetWeakPtr(), | |
| 726 base::Passed(token.Pass()))); | |
| 727 switch (activation_status) { | 710 switch (activation_status) { |
| 728 case MetadataDatabase::ACTIVATION_PENDING: | 711 case MetadataDatabase::ACTIVATION_PENDING: |
| 729 // The task will be finalized by the callback passed to MetadataDatabase | 712 SyncCompleted(token.Pass(), status); |
| 730 // in this case. | |
| 731 return; | 713 return; |
| 732 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER: | 714 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER: |
| 733 // The activation failed due to another tracker that has another parent. | 715 // 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 | 716 // Detach the folder from the current parent to avoid using this folder as |
| 735 // active folder. | 717 // active folder. |
| 736 drive_service()->RemoveResourceFromDirectory( | 718 drive_service()->RemoveResourceFromDirectory( |
| 737 remote_parent_folder_tracker_->file_id(), file_id, | 719 remote_parent_folder_tracker_->file_id(), file_id, |
| 738 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict, | 720 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict, |
| 739 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | 721 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 740 return; | 722 return; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 set_used_network(true); | 754 set_used_network(true); |
| 773 return sync_context_->GetDriveUploader(); | 755 return sync_context_->GetDriveUploader(); |
| 774 } | 756 } |
| 775 | 757 |
| 776 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { | 758 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { |
| 777 return sync_context_->GetMetadataDatabase(); | 759 return sync_context_->GetMetadataDatabase(); |
| 778 } | 760 } |
| 779 | 761 |
| 780 } // namespace drive_backend | 762 } // namespace drive_backend |
| 781 } // namespace sync_file_system | 763 } // namespace sync_file_system |
| OLD | NEW |