OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_file_sync_service.h" | 5 #include "chrome/browser/sync_file_system/drive_file_sync_service.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 sync_client_->GetDriveDirectoryForSyncRoot( | 655 sync_client_->GetDriveDirectoryForSyncRoot( |
656 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, | 656 base::Bind(&DriveFileSyncService::DidGetSyncRootDirectory, |
657 AsWeakPtr(), base::Passed(&token), callback)); | 657 AsWeakPtr(), base::Passed(&token), callback)); |
658 } | 658 } |
659 | 659 |
660 void DriveFileSyncService::DidGetSyncRootDirectory( | 660 void DriveFileSyncService::DidGetSyncRootDirectory( |
661 scoped_ptr<TaskToken> token, | 661 scoped_ptr<TaskToken> token, |
662 const fileapi::SyncStatusCallback& callback, | 662 const fileapi::SyncStatusCallback& callback, |
663 google_apis::GDataErrorCode error, | 663 google_apis::GDataErrorCode error, |
664 const std::string& resource_id) { | 664 const std::string& resource_id) { |
665 fileapi::SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 665 fileapi::SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); |
666 if (error != google_apis::HTTP_SUCCESS && | 666 if (error != google_apis::HTTP_SUCCESS && |
667 error != google_apis::HTTP_CREATED) { | 667 error != google_apis::HTTP_CREATED) { |
668 NotifyTaskDone(status, token.Pass()); | 668 NotifyTaskDone(status, token.Pass()); |
669 callback.Run(status); | 669 callback.Run(status); |
670 return; | 670 return; |
671 } | 671 } |
672 | 672 |
673 metadata_store_->SetSyncRootDirectory(resource_id); | 673 metadata_store_->SetSyncRootDirectory(resource_id); |
674 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass()); | 674 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass()); |
675 callback.Run(status); | 675 callback.Run(status); |
(...skipping 28 matching lines...) Expand all Loading... |
704 } | 704 } |
705 | 705 |
706 void DriveFileSyncService::DidGetDirectoryForOrigin( | 706 void DriveFileSyncService::DidGetDirectoryForOrigin( |
707 scoped_ptr<TaskToken> token, | 707 scoped_ptr<TaskToken> token, |
708 const GURL& origin, | 708 const GURL& origin, |
709 const fileapi::SyncStatusCallback& callback, | 709 const fileapi::SyncStatusCallback& callback, |
710 google_apis::GDataErrorCode error, | 710 google_apis::GDataErrorCode error, |
711 const std::string& resource_id) { | 711 const std::string& resource_id) { |
712 if (error != google_apis::HTTP_SUCCESS && | 712 if (error != google_apis::HTTP_SUCCESS && |
713 error != google_apis::HTTP_CREATED) { | 713 error != google_apis::HTTP_CREATED) { |
714 fileapi::SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 714 fileapi::SyncStatusCode status = |
| 715 GDataErrorCodeToSyncStatusCodeWrapper(error); |
715 NotifyTaskDone(status, token.Pass()); | 716 NotifyTaskDone(status, token.Pass()); |
716 callback.Run(status); | 717 callback.Run(status); |
717 return; | 718 return; |
718 } | 719 } |
719 | 720 |
720 metadata_store_->AddBatchSyncOrigin(origin, resource_id); | 721 metadata_store_->AddBatchSyncOrigin(origin, resource_id); |
721 | 722 |
722 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass()); | 723 NotifyTaskDone(fileapi::SYNC_STATUS_OK, token.Pass()); |
723 callback.Run(fileapi::SYNC_STATUS_OK); | 724 callback.Run(fileapi::SYNC_STATUS_OK); |
724 | 725 |
725 StartBatchSyncForOrigin(origin, resource_id); | 726 StartBatchSyncForOrigin(origin, resource_id); |
726 } | 727 } |
727 | 728 |
728 void DriveFileSyncService::DidGetLargestChangeStampForBatchSync( | 729 void DriveFileSyncService::DidGetLargestChangeStampForBatchSync( |
729 scoped_ptr<TaskToken> token, | 730 scoped_ptr<TaskToken> token, |
730 const GURL& origin, | 731 const GURL& origin, |
731 const std::string& resource_id, | 732 const std::string& resource_id, |
732 google_apis::GDataErrorCode error, | 733 google_apis::GDataErrorCode error, |
733 int64 largest_changestamp) { | 734 int64 largest_changestamp) { |
734 if (error != google_apis::HTTP_SUCCESS) { | 735 if (error != google_apis::HTTP_SUCCESS) { |
735 pending_batch_sync_origins_.insert(origin); | 736 pending_batch_sync_origins_.insert(origin); |
736 // TODO(tzik): Refine this error code. | 737 // TODO(tzik): Refine this error code. |
737 NotifyTaskDone(GDataErrorCodeToSyncStatusCode(error), token.Pass()); | 738 NotifyTaskDone(GDataErrorCodeToSyncStatusCodeWrapper(error), token.Pass()); |
738 return; | 739 return; |
739 } | 740 } |
740 | 741 |
741 DCHECK(token); | 742 DCHECK(token); |
742 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving remote files"); | 743 token->UpdateTask(FROM_HERE, TASK_TYPE_DRIVE, "Retrieving remote files"); |
743 sync_client_->ListFiles( | 744 sync_client_->ListFiles( |
744 resource_id, | 745 resource_id, |
745 base::Bind( | 746 base::Bind( |
746 &DriveFileSyncService::DidGetDirectoryContentForBatchSync, | 747 &DriveFileSyncService::DidGetDirectoryContentForBatchSync, |
747 AsWeakPtr(), base::Passed(&token), origin, largest_changestamp)); | 748 AsWeakPtr(), base::Passed(&token), origin, largest_changestamp)); |
748 } | 749 } |
749 | 750 |
750 void DriveFileSyncService::DidGetDirectoryContentForBatchSync( | 751 void DriveFileSyncService::DidGetDirectoryContentForBatchSync( |
751 scoped_ptr<TaskToken> token, | 752 scoped_ptr<TaskToken> token, |
752 const GURL& origin, | 753 const GURL& origin, |
753 int64 largest_changestamp, | 754 int64 largest_changestamp, |
754 google_apis::GDataErrorCode error, | 755 google_apis::GDataErrorCode error, |
755 scoped_ptr<google_apis::DocumentFeed> feed) { | 756 scoped_ptr<google_apis::DocumentFeed> feed) { |
756 if (error != google_apis::HTTP_SUCCESS) { | 757 if (error != google_apis::HTTP_SUCCESS) { |
757 pending_batch_sync_origins_.insert(origin); | 758 pending_batch_sync_origins_.insert(origin); |
758 // TODO(tzik): Refine this error code. | 759 // TODO(tzik): Refine this error code. |
759 NotifyTaskDone(GDataErrorCodeToSyncStatusCode(error), token.Pass()); | 760 NotifyTaskDone(GDataErrorCodeToSyncStatusCodeWrapper(error), token.Pass()); |
760 return; | 761 return; |
761 } | 762 } |
762 | 763 |
763 typedef ScopedVector<google_apis::DocumentEntry>::const_iterator iterator; | 764 typedef ScopedVector<google_apis::DocumentEntry>::const_iterator iterator; |
764 for (iterator itr = feed->entries().begin(); | 765 for (iterator itr = feed->entries().begin(); |
765 itr != feed->entries().end(); ++itr) { | 766 itr != feed->entries().end(); ++itr) { |
766 AppendNewRemoteChange(origin, *itr, largest_changestamp, | 767 AppendNewRemoteChange(origin, *itr, largest_changestamp, |
767 REMOTE_SYNC_TYPE_BATCH); | 768 REMOTE_SYNC_TYPE_BATCH); |
768 } | 769 } |
769 | 770 |
(...skipping 20 matching lines...) Expand all Loading... |
790 | 791 |
791 void DriveFileSyncService::DidGetRemoteFileMetadata( | 792 void DriveFileSyncService::DidGetRemoteFileMetadata( |
792 const fileapi::SyncFileMetadataCallback& callback, | 793 const fileapi::SyncFileMetadataCallback& callback, |
793 google_apis::GDataErrorCode error, | 794 google_apis::GDataErrorCode error, |
794 scoped_ptr<google_apis::DocumentEntry> entry) { | 795 scoped_ptr<google_apis::DocumentEntry> entry) { |
795 fileapi::SyncFileType file_type = fileapi::SYNC_FILE_TYPE_UNKNOWN; | 796 fileapi::SyncFileType file_type = fileapi::SYNC_FILE_TYPE_UNKNOWN; |
796 if (entry->is_file()) | 797 if (entry->is_file()) |
797 file_type = fileapi::SYNC_FILE_TYPE_FILE; | 798 file_type = fileapi::SYNC_FILE_TYPE_FILE; |
798 else if (entry->is_folder()) | 799 else if (entry->is_folder()) |
799 file_type = fileapi::SYNC_FILE_TYPE_DIRECTORY; | 800 file_type = fileapi::SYNC_FILE_TYPE_DIRECTORY; |
800 callback.Run(GDataErrorCodeToSyncStatusCode(error), | 801 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error), |
801 fileapi::SyncFileMetadata(file_type, | 802 fileapi::SyncFileMetadata(file_type, |
802 entry->file_size(), | 803 entry->file_size(), |
803 entry->updated_time())); | 804 entry->updated_time())); |
804 } | 805 } |
805 | 806 |
806 DriveFileSyncService::SyncOperationType | 807 DriveFileSyncService::SyncOperationType |
807 DriveFileSyncService::ResolveSyncOperationType( | 808 DriveFileSyncService::ResolveSyncOperationType( |
808 const fileapi::FileChange& local_file_change, | 809 const fileapi::FileChange& local_file_change, |
809 const fileapi::FileSystemURL& url) { | 810 const fileapi::FileSystemURL& url) { |
810 // TODO(nhiroki): check metadata.conflicted() flag before checking the pending | 811 // TODO(nhiroki): check metadata.conflicted() flag before checking the pending |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 } | 863 } |
863 | 864 |
864 void DriveFileSyncService::DidApplyLocalChange( | 865 void DriveFileSyncService::DidApplyLocalChange( |
865 scoped_ptr<TaskToken> token, | 866 scoped_ptr<TaskToken> token, |
866 const fileapi::FileSystemURL& url, | 867 const fileapi::FileSystemURL& url, |
867 const google_apis::GDataErrorCode error, | 868 const google_apis::GDataErrorCode error, |
868 const fileapi::SyncStatusCallback& callback, | 869 const fileapi::SyncStatusCallback& callback, |
869 fileapi::SyncStatusCode status) { | 870 fileapi::SyncStatusCode status) { |
870 if (status == fileapi::SYNC_STATUS_OK) { | 871 if (status == fileapi::SYNC_STATUS_OK) { |
871 CancelRemoteChange(url); | 872 CancelRemoteChange(url); |
872 NotifyTaskDone(GDataErrorCodeToSyncStatusCode(error), token.Pass()); | 873 NotifyTaskDone(GDataErrorCodeToSyncStatusCodeWrapper(error), token.Pass()); |
873 callback.Run(GDataErrorCodeToSyncStatusCode(error)); | 874 callback.Run(GDataErrorCodeToSyncStatusCodeWrapper(error)); |
874 return; | 875 return; |
875 } | 876 } |
876 NotifyTaskDone(status, token.Pass()); | 877 NotifyTaskDone(status, token.Pass()); |
877 callback.Run(status); | 878 callback.Run(status); |
878 } | 879 } |
879 | 880 |
880 void DriveFileSyncService::DidUploadNewFile( | 881 void DriveFileSyncService::DidUploadNewFile( |
881 scoped_ptr<TaskToken> token, | 882 scoped_ptr<TaskToken> token, |
882 const fileapi::FileSystemURL& url, | 883 const fileapi::FileSystemURL& url, |
883 const fileapi::SyncStatusCallback& callback, | 884 const fileapi::SyncStatusCallback& callback, |
884 google_apis::GDataErrorCode error, | 885 google_apis::GDataErrorCode error, |
885 const std::string& resource_id, | 886 const std::string& resource_id, |
886 const std::string& file_md5) { | 887 const std::string& file_md5) { |
887 if (error == google_apis::HTTP_SUCCESS) { | 888 if (error == google_apis::HTTP_SUCCESS) { |
888 DriveMetadata metadata; | 889 DriveMetadata metadata; |
889 metadata_store_->ReadEntry(url, &metadata); | 890 metadata_store_->ReadEntry(url, &metadata); |
890 metadata.set_resource_id(resource_id); | 891 metadata.set_resource_id(resource_id); |
891 metadata.set_md5_checksum(file_md5); | 892 metadata.set_md5_checksum(file_md5); |
892 metadata.set_conflicted(false); | 893 metadata.set_conflicted(false); |
893 metadata_store_->UpdateEntry( | 894 metadata_store_->UpdateEntry( |
894 url, metadata, | 895 url, metadata, |
895 base::Bind(&DriveFileSyncService::DidApplyLocalChange, | 896 base::Bind(&DriveFileSyncService::DidApplyLocalChange, |
896 AsWeakPtr(), base::Passed(&token), url, error, callback)); | 897 AsWeakPtr(), base::Passed(&token), url, error, callback)); |
897 return; | 898 return; |
898 } | 899 } |
899 const fileapi::SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 900 const fileapi::SyncStatusCode status = |
| 901 GDataErrorCodeToSyncStatusCodeWrapper(error); |
900 NotifyTaskDone(status, token.Pass()); | 902 NotifyTaskDone(status, token.Pass()); |
901 callback.Run(status); | 903 callback.Run(status); |
902 } | 904 } |
903 | 905 |
904 void DriveFileSyncService::DidUploadExistingFile( | 906 void DriveFileSyncService::DidUploadExistingFile( |
905 scoped_ptr<TaskToken> token, | 907 scoped_ptr<TaskToken> token, |
906 const fileapi::FileSystemURL& url, | 908 const fileapi::FileSystemURL& url, |
907 const fileapi::SyncStatusCallback& callback, | 909 const fileapi::SyncStatusCallback& callback, |
908 google_apis::GDataErrorCode error, | 910 google_apis::GDataErrorCode error, |
909 const std::string& resource_id, | 911 const std::string& resource_id, |
(...skipping 22 matching lines...) Expand all Loading... |
932 AsWeakPtr(), base::Passed(&token), url, error, callback)); | 934 AsWeakPtr(), base::Passed(&token), url, error, callback)); |
933 return; | 935 return; |
934 } | 936 } |
935 case google_apis::HTTP_NOT_MODIFIED: { | 937 case google_apis::HTTP_NOT_MODIFIED: { |
936 DidApplyLocalChange(token.Pass(), url, google_apis::HTTP_SUCCESS, | 938 DidApplyLocalChange(token.Pass(), url, google_apis::HTTP_SUCCESS, |
937 callback, fileapi::SYNC_STATUS_OK); | 939 callback, fileapi::SYNC_STATUS_OK); |
938 return; | 940 return; |
939 } | 941 } |
940 default: { | 942 default: { |
941 const fileapi::SyncStatusCode status = | 943 const fileapi::SyncStatusCode status = |
942 GDataErrorCodeToSyncStatusCode(error); | 944 GDataErrorCodeToSyncStatusCodeWrapper(error); |
943 DCHECK_NE(fileapi::SYNC_STATUS_OK, status); | 945 DCHECK_NE(fileapi::SYNC_STATUS_OK, status); |
944 DidApplyLocalChange(token.Pass(), url, error, callback, status); | 946 DidApplyLocalChange(token.Pass(), url, error, callback, status); |
945 return; | 947 return; |
946 } | 948 } |
947 } | 949 } |
948 } | 950 } |
949 | 951 |
950 void DriveFileSyncService::DidDeleteFile( | 952 void DriveFileSyncService::DidDeleteFile( |
951 scoped_ptr<TaskToken> token, | 953 scoped_ptr<TaskToken> token, |
952 const fileapi::FileSystemURL& url, | 954 const fileapi::FileSystemURL& url, |
(...skipping 13 matching lines...) Expand all Loading... |
966 metadata_store_->ReadEntry(url, &metadata); | 968 metadata_store_->ReadEntry(url, &metadata); |
967 metadata.set_conflicted(true); | 969 metadata.set_conflicted(true); |
968 metadata_store_->UpdateEntry( | 970 metadata_store_->UpdateEntry( |
969 url, metadata, | 971 url, metadata, |
970 base::Bind(&DriveFileSyncService::DidApplyLocalChange, | 972 base::Bind(&DriveFileSyncService::DidApplyLocalChange, |
971 AsWeakPtr(), base::Passed(&token), url, error, callback)); | 973 AsWeakPtr(), base::Passed(&token), url, error, callback)); |
972 return; | 974 return; |
973 } | 975 } |
974 default: { | 976 default: { |
975 const fileapi::SyncStatusCode status = | 977 const fileapi::SyncStatusCode status = |
976 GDataErrorCodeToSyncStatusCode(error); | 978 GDataErrorCodeToSyncStatusCodeWrapper(error); |
977 DCHECK_NE(fileapi::SYNC_STATUS_OK, status); | 979 DCHECK_NE(fileapi::SYNC_STATUS_OK, status); |
978 DidApplyLocalChange(token.Pass(), url, error, callback, status); | 980 DidApplyLocalChange(token.Pass(), url, error, callback, status); |
979 return; | 981 return; |
980 } | 982 } |
981 } | 983 } |
982 } | 984 } |
983 | 985 |
984 void DriveFileSyncService::DidPrepareForProcessRemoteChange( | 986 void DriveFileSyncService::DidPrepareForProcessRemoteChange( |
985 scoped_ptr<ProcessRemoteChangeParam> param, | 987 scoped_ptr<ProcessRemoteChangeParam> param, |
986 fileapi::SyncStatusCode status, | 988 fileapi::SyncStatusCode status, |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1136 void DriveFileSyncService::DidDownloadFile( | 1138 void DriveFileSyncService::DidDownloadFile( |
1137 scoped_ptr<ProcessRemoteChangeParam> param, | 1139 scoped_ptr<ProcessRemoteChangeParam> param, |
1138 google_apis::GDataErrorCode error, | 1140 google_apis::GDataErrorCode error, |
1139 const std::string& md5_checksum) { | 1141 const std::string& md5_checksum) { |
1140 if (error == google_apis::HTTP_NOT_MODIFIED) { | 1142 if (error == google_apis::HTTP_NOT_MODIFIED) { |
1141 param->operation_type = fileapi::SYNC_OPERATION_NONE; | 1143 param->operation_type = fileapi::SYNC_OPERATION_NONE; |
1142 CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK); | 1144 CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK); |
1143 return; | 1145 return; |
1144 } | 1146 } |
1145 | 1147 |
1146 fileapi::SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 1148 fileapi::SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); |
1147 if (status != fileapi::SYNC_STATUS_OK) { | 1149 if (status != fileapi::SYNC_STATUS_OK) { |
1148 AbortRemoteSync(param.Pass(), status); | 1150 AbortRemoteSync(param.Pass(), status); |
1149 return; | 1151 return; |
1150 } | 1152 } |
1151 | 1153 |
1152 param->md5_checksum = md5_checksum; | 1154 param->md5_checksum = md5_checksum; |
1153 const fileapi::FileChange& change = param->remote_change.change; | 1155 const fileapi::FileChange& change = param->remote_change.change; |
1154 const FilePath& temporary_file_path = param->temporary_file_path; | 1156 const FilePath& temporary_file_path = param->temporary_file_path; |
1155 const fileapi::FileSystemURL& url = param->remote_change.url; | 1157 const fileapi::FileSystemURL& url = param->remote_change.url; |
1156 param->processor->ApplyRemoteChange( | 1158 param->processor->ApplyRemoteChange( |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1317 if (found_url == url_to_change_.end()) | 1319 if (found_url == url_to_change_.end()) |
1318 return false; | 1320 return false; |
1319 const PathToChange& path_to_change = found_url->second; | 1321 const PathToChange& path_to_change = found_url->second; |
1320 PathToChange::const_iterator found_path = path_to_change.find(url.path()); | 1322 PathToChange::const_iterator found_path = path_to_change.find(url.path()); |
1321 if (found_path == path_to_change.end()) | 1323 if (found_path == path_to_change.end()) |
1322 return false; | 1324 return false; |
1323 *change = found_path->second; | 1325 *change = found_path->second; |
1324 return true; | 1326 return true; |
1325 } | 1327 } |
1326 | 1328 |
| 1329 fileapi::SyncStatusCode |
| 1330 DriveFileSyncService::GDataErrorCodeToSyncStatusCodeWrapper( |
| 1331 google_apis::GDataErrorCode error) const { |
| 1332 fileapi::SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 1333 if (status != fileapi::SYNC_STATUS_OK && !sync_client_->IsAuthenticated()) |
| 1334 return fileapi::SYNC_STATUS_AUTHENTICATION_FAILED; |
| 1335 return status; |
| 1336 } |
| 1337 |
1327 } // namespace sync_file_system | 1338 } // namespace sync_file_system |
OLD | NEW |