| 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/remote_to_local_syncer.h
" | 5 #include "chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.h
" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
| (...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 682 remote_change_processor()->ApplyRemoteChange( | 682 remote_change_processor()->ApplyRemoteChange( |
| 683 FileChange(FileChange::FILE_CHANGE_DELETE, SYNC_FILE_TYPE_UNKNOWN), | 683 FileChange(FileChange::FILE_CHANGE_DELETE, SYNC_FILE_TYPE_UNKNOWN), |
| 684 base::FilePath(), | 684 base::FilePath(), |
| 685 url_, | 685 url_, |
| 686 callback); | 686 callback); |
| 687 } | 687 } |
| 688 | 688 |
| 689 void RemoteToLocalSyncer::DownloadFile(const SyncStatusCallback& callback) { | 689 void RemoteToLocalSyncer::DownloadFile(const SyncStatusCallback& callback) { |
| 690 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | 690 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); |
| 691 | 691 |
| 692 base::Callback<void(webkit_blob::ScopedFile)> did_create_callback = | 692 webkit_blob::ScopedFile file = CreateTemporaryFile( |
| 693 base::Bind(&RemoteToLocalSyncer::DidCreateTemporaryFileForDownload, | 693 make_scoped_refptr(sync_context_->GetWorkerTaskRunner())); |
| 694 weak_ptr_factory_.GetWeakPtr(), callback); | |
| 695 | 694 |
| 696 sync_context_->GetFileTaskRunner()->PostTask( | |
| 697 FROM_HERE, | |
| 698 CreateComposedFunction( | |
| 699 base::Bind(&CreateTemporaryFile, | |
| 700 make_scoped_refptr(sync_context_->GetFileTaskRunner())), | |
| 701 RelayCallbackToTaskRunner( | |
| 702 sync_context_->GetWorkerTaskRunner(), FROM_HERE, | |
| 703 did_create_callback))); | |
| 704 } | |
| 705 | |
| 706 void RemoteToLocalSyncer::DidCreateTemporaryFileForDownload( | |
| 707 const SyncStatusCallback& callback, | |
| 708 webkit_blob::ScopedFile file) { | |
| 709 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | |
| 710 base::FilePath path = file.path(); | 695 base::FilePath path = file.path(); |
| 711 drive_service()->DownloadFile( | 696 drive_service()->DownloadFile( |
| 712 path, remote_metadata_->file_id(), | 697 path, remote_metadata_->file_id(), |
| 713 base::Bind(&RemoteToLocalSyncer::DidDownloadFile, | 698 base::Bind(&RemoteToLocalSyncer::DidDownloadFile, |
| 714 weak_ptr_factory_.GetWeakPtr(), | 699 weak_ptr_factory_.GetWeakPtr(), |
| 715 callback, base::Passed(&file)), | 700 callback, base::Passed(&file)), |
| 716 google_apis::GetContentCallback(), | 701 google_apis::GetContentCallback(), |
| 717 google_apis::ProgressCallback()); | 702 google_apis::ProgressCallback()); |
| 718 } | 703 } |
| 719 | 704 |
| 720 void RemoteToLocalSyncer::DidDownloadFile(const SyncStatusCallback& callback, | 705 void RemoteToLocalSyncer::DidDownloadFile(const SyncStatusCallback& callback, |
| 721 webkit_blob::ScopedFile file, | 706 webkit_blob::ScopedFile file, |
| 722 google_apis::GDataErrorCode error, | 707 google_apis::GDataErrorCode error, |
| 723 const base::FilePath&) { | 708 const base::FilePath&) { |
| 724 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); | 709 DCHECK(sync_context_->GetWorkerTaskRunner()->RunsTasksOnCurrentThread()); |
| 725 | 710 |
| 726 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 711 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 727 if (status != SYNC_STATUS_OK) { | 712 if (status != SYNC_STATUS_OK) { |
| 728 callback.Run(status); | 713 callback.Run(status); |
| 729 return; | 714 return; |
| 730 } | 715 } |
| 731 | 716 |
| 732 base::FilePath path = file.path(); | 717 base::FilePath path = file.path(); |
| 733 base::Callback<void(const std::string&)> did_calculate_callback = | 718 const std::string md5 = drive::util::GetMd5Digest(path); |
| 734 base::Bind(&RemoteToLocalSyncer::DidCalculateMD5ForDownload, | |
| 735 weak_ptr_factory_.GetWeakPtr(), | |
| 736 callback, base::Passed(&file)); | |
| 737 | |
| 738 sync_context_->GetFileTaskRunner()->PostTask( | |
| 739 FROM_HERE, | |
| 740 CreateComposedFunction( | |
| 741 base::Bind(&drive::util::GetMd5Digest, path), | |
| 742 RelayCallbackToTaskRunner( | |
| 743 sync_context_->GetWorkerTaskRunner(), FROM_HERE, | |
| 744 did_calculate_callback))); | |
| 745 } | |
| 746 | |
| 747 void RemoteToLocalSyncer::DidCalculateMD5ForDownload( | |
| 748 const SyncStatusCallback& callback, | |
| 749 webkit_blob::ScopedFile file, | |
| 750 const std::string& md5) { | |
| 751 if (md5.empty()) { | 719 if (md5.empty()) { |
| 752 callback.Run(SYNC_FILE_ERROR_NOT_FOUND); | 720 callback.Run(SYNC_FILE_ERROR_NOT_FOUND); |
| 753 return; | 721 return; |
| 754 } | 722 } |
| 755 | 723 |
| 756 if (md5 != remote_metadata_->details().md5()) { | 724 if (md5 != remote_metadata_->details().md5()) { |
| 757 // File has been modified since last metadata retrieval. | 725 // File has been modified since last metadata retrieval. |
| 758 | 726 |
| 759 // Lower the priority of the tracker to prevent repeated remote sync to the | 727 // Lower the priority of the tracker to prevent repeated remote sync to the |
| 760 // same tracker. | 728 // same tracker. |
| 761 metadata_database()->LowerTrackerPriority(dirty_tracker_->tracker_id()); | 729 metadata_database()->LowerTrackerPriority(dirty_tracker_->tracker_id()); |
| 762 callback.Run(SYNC_STATUS_RETRY); | 730 callback.Run(SYNC_STATUS_RETRY); |
| 763 return; | 731 return; |
| 764 } | 732 } |
| 765 | 733 |
| 766 base::FilePath path = file.path(); | |
| 767 remote_change_processor()->ApplyRemoteChange( | 734 remote_change_processor()->ApplyRemoteChange( |
| 768 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, SYNC_FILE_TYPE_FILE), | 735 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, SYNC_FILE_TYPE_FILE), |
| 769 path, url_, | 736 path, url_, |
| 770 base::Bind(&RemoteToLocalSyncer::DidApplyDownload, | 737 base::Bind(&RemoteToLocalSyncer::DidApplyDownload, |
| 771 weak_ptr_factory_.GetWeakPtr(), | 738 weak_ptr_factory_.GetWeakPtr(), |
| 772 callback, base::Passed(&file))); | 739 callback, base::Passed(&file))); |
| 773 } | 740 } |
| 774 | 741 |
| 775 void RemoteToLocalSyncer::DidApplyDownload(const SyncStatusCallback& callback, | 742 void RemoteToLocalSyncer::DidApplyDownload(const SyncStatusCallback& callback, |
| 776 webkit_blob::ScopedFile, | 743 webkit_blob::ScopedFile, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 803 | 770 |
| 804 SyncStatusCallback RemoteToLocalSyncer::SyncCompletedCallback( | 771 SyncStatusCallback RemoteToLocalSyncer::SyncCompletedCallback( |
| 805 scoped_ptr<SyncTaskToken> token) { | 772 scoped_ptr<SyncTaskToken> token) { |
| 806 return base::Bind(&RemoteToLocalSyncer::SyncCompleted, | 773 return base::Bind(&RemoteToLocalSyncer::SyncCompleted, |
| 807 weak_ptr_factory_.GetWeakPtr(), | 774 weak_ptr_factory_.GetWeakPtr(), |
| 808 base::Passed(&token)); | 775 base::Passed(&token)); |
| 809 } | 776 } |
| 810 | 777 |
| 811 } // namespace drive_backend | 778 } // namespace drive_backend |
| 812 } // namespace sync_file_system | 779 } // namespace sync_file_system |
| OLD | NEW |