OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "storage/browser/fileapi/copy_or_move_operation_delegate.h" | 5 #include "storage/browser/fileapi/copy_or_move_operation_delegate.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <tuple> | 10 #include <tuple> |
11 #include <utility> | 11 #include <utility> |
12 | 12 |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
15 #include "base/macros.h" | 15 #include "base/macros.h" |
16 #include "base/memory/ptr_util.h" | |
16 #include "net/base/io_buffer.h" | 17 #include "net/base/io_buffer.h" |
17 #include "net/base/net_errors.h" | 18 #include "net/base/net_errors.h" |
18 #include "storage/browser/blob/shareable_file_reference.h" | 19 #include "storage/browser/blob/shareable_file_reference.h" |
19 #include "storage/browser/fileapi/copy_or_move_file_validator.h" | 20 #include "storage/browser/fileapi/copy_or_move_file_validator.h" |
20 #include "storage/browser/fileapi/file_observers.h" | 21 #include "storage/browser/fileapi/file_observers.h" |
21 #include "storage/browser/fileapi/file_stream_reader.h" | 22 #include "storage/browser/fileapi/file_stream_reader.h" |
22 #include "storage/browser/fileapi/file_stream_writer.h" | 23 #include "storage/browser/fileapi/file_stream_writer.h" |
23 #include "storage/browser/fileapi/file_system_context.h" | 24 #include "storage/browser/fileapi/file_system_context.h" |
24 #include "storage/browser/fileapi/file_system_operation_runner.h" | 25 #include "storage/browser/fileapi/file_system_operation_runner.h" |
25 #include "storage/browser/fileapi/file_system_url.h" | 26 #include "storage/browser/fileapi/file_system_url.h" |
(...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
747 operation_type_(operation_type), | 748 operation_type_(operation_type), |
748 option_(option), | 749 option_(option), |
749 error_behavior_(error_behavior), | 750 error_behavior_(error_behavior), |
750 progress_callback_(progress_callback), | 751 progress_callback_(progress_callback), |
751 callback_(callback), | 752 callback_(callback), |
752 weak_factory_(this) { | 753 weak_factory_(this) { |
753 same_file_system_ = src_root_.IsInSameFileSystem(dest_root_); | 754 same_file_system_ = src_root_.IsInSameFileSystem(dest_root_); |
754 } | 755 } |
755 | 756 |
756 CopyOrMoveOperationDelegate::~CopyOrMoveOperationDelegate() { | 757 CopyOrMoveOperationDelegate::~CopyOrMoveOperationDelegate() { |
757 base::STLDeleteElements(&running_copy_set_); | |
758 } | 758 } |
759 | 759 |
760 void CopyOrMoveOperationDelegate::Run() { | 760 void CopyOrMoveOperationDelegate::Run() { |
761 // Not supported; this should never be called. | 761 // Not supported; this should never be called. |
762 NOTREACHED(); | 762 NOTREACHED(); |
763 } | 763 } |
764 | 764 |
765 void CopyOrMoveOperationDelegate::RunRecursively() { | 765 void CopyOrMoveOperationDelegate::RunRecursively() { |
766 // Perform light-weight checks first. | 766 // Perform light-weight checks first. |
767 | 767 |
(...skipping 20 matching lines...) Expand all Loading... | |
788 | 788 |
789 void CopyOrMoveOperationDelegate::ProcessFile( | 789 void CopyOrMoveOperationDelegate::ProcessFile( |
790 const FileSystemURL& src_url, | 790 const FileSystemURL& src_url, |
791 const StatusCallback& callback) { | 791 const StatusCallback& callback) { |
792 if (!progress_callback_.is_null()) { | 792 if (!progress_callback_.is_null()) { |
793 progress_callback_.Run( | 793 progress_callback_.Run( |
794 FileSystemOperation::BEGIN_COPY_ENTRY, src_url, FileSystemURL(), 0); | 794 FileSystemOperation::BEGIN_COPY_ENTRY, src_url, FileSystemURL(), 0); |
795 } | 795 } |
796 | 796 |
797 FileSystemURL dest_url = CreateDestURL(src_url); | 797 FileSystemURL dest_url = CreateDestURL(src_url); |
798 CopyOrMoveImpl* impl = NULL; | 798 std::unique_ptr<CopyOrMoveImpl> impl; |
799 if (same_file_system_ && | 799 if (same_file_system_ && |
800 (file_system_context() | 800 (file_system_context() |
801 ->GetFileSystemBackend(src_url.type()) | 801 ->GetFileSystemBackend(src_url.type()) |
802 ->HasInplaceCopyImplementation(src_url.type()) || | 802 ->HasInplaceCopyImplementation(src_url.type()) || |
803 operation_type_ == OPERATION_MOVE)) { | 803 operation_type_ == OPERATION_MOVE)) { |
804 impl = new CopyOrMoveOnSameFileSystemImpl( | 804 impl = base::MakeUnique<CopyOrMoveOnSameFileSystemImpl>( |
805 operation_runner(), operation_type_, src_url, dest_url, option_, | 805 operation_runner(), operation_type_, src_url, dest_url, option_, |
806 base::Bind(&CopyOrMoveOperationDelegate::OnCopyFileProgress, | 806 base::Bind(&CopyOrMoveOperationDelegate::OnCopyFileProgress, |
807 weak_factory_.GetWeakPtr(), src_url)); | 807 weak_factory_.GetWeakPtr(), src_url)); |
808 } else { | 808 } else { |
809 // Cross filesystem case. | 809 // Cross filesystem case. |
810 base::File::Error error = base::File::FILE_ERROR_FAILED; | 810 base::File::Error error = base::File::FILE_ERROR_FAILED; |
811 CopyOrMoveFileValidatorFactory* validator_factory = | 811 CopyOrMoveFileValidatorFactory* validator_factory = |
812 file_system_context()->GetCopyOrMoveFileValidatorFactory( | 812 file_system_context()->GetCopyOrMoveFileValidatorFactory( |
813 dest_root_.type(), &error); | 813 dest_root_.type(), &error); |
814 if (error != base::File::FILE_OK) { | 814 if (error != base::File::FILE_OK) { |
815 if (!progress_callback_.is_null()) | 815 if (!progress_callback_.is_null()) |
816 progress_callback_.Run(FileSystemOperation::ERROR_COPY_ENTRY, src_url, | 816 progress_callback_.Run(FileSystemOperation::ERROR_COPY_ENTRY, src_url, |
817 dest_url, 0); | 817 dest_url, 0); |
818 | 818 |
819 callback.Run(error); | 819 callback.Run(error); |
820 return; | 820 return; |
821 } | 821 } |
822 | 822 |
823 if (!validator_factory) { | 823 if (!validator_factory) { |
824 std::unique_ptr<storage::FileStreamReader> reader = | 824 std::unique_ptr<storage::FileStreamReader> reader = |
825 file_system_context()->CreateFileStreamReader( | 825 file_system_context()->CreateFileStreamReader( |
826 src_url, 0 /* offset */, storage::kMaximumLength, base::Time()); | 826 src_url, 0 /* offset */, storage::kMaximumLength, base::Time()); |
827 std::unique_ptr<FileStreamWriter> writer = | 827 std::unique_ptr<FileStreamWriter> writer = |
828 file_system_context()->CreateFileStreamWriter(dest_url, 0); | 828 file_system_context()->CreateFileStreamWriter(dest_url, 0); |
829 if (reader && writer) { | 829 if (reader && writer) { |
830 impl = new StreamCopyOrMoveImpl( | 830 impl = base::MakeUnique<StreamCopyOrMoveImpl>( |
831 operation_runner(), file_system_context(), operation_type_, src_url, | 831 operation_runner(), file_system_context(), operation_type_, src_url, |
832 dest_url, option_, std::move(reader), std::move(writer), | 832 dest_url, option_, std::move(reader), std::move(writer), |
833 base::Bind(&CopyOrMoveOperationDelegate::OnCopyFileProgress, | 833 base::Bind(&CopyOrMoveOperationDelegate::OnCopyFileProgress, |
834 weak_factory_.GetWeakPtr(), src_url)); | 834 weak_factory_.GetWeakPtr(), src_url)); |
835 } | 835 } |
836 } | 836 } |
837 | 837 |
838 if (!impl) { | 838 if (!impl) { |
839 impl = new SnapshotCopyOrMoveImpl( | 839 impl = base::MakeUnique<SnapshotCopyOrMoveImpl>( |
840 operation_runner(), operation_type_, src_url, dest_url, option_, | 840 operation_runner(), operation_type_, src_url, dest_url, option_, |
841 validator_factory, | 841 validator_factory, |
842 base::Bind(&CopyOrMoveOperationDelegate::OnCopyFileProgress, | 842 base::Bind(&CopyOrMoveOperationDelegate::OnCopyFileProgress, |
843 weak_factory_.GetWeakPtr(), src_url)); | 843 weak_factory_.GetWeakPtr(), src_url)); |
844 } | 844 } |
845 } | 845 } |
846 | 846 |
847 // Register the running task. | 847 // Register the running task. |
848 running_copy_set_.insert(impl); | 848 |
849 impl->Run(base::Bind( | 849 CopyOrMoveImpl* impl_ptr = impl.get(); |
850 &CopyOrMoveOperationDelegate::DidCopyOrMoveFile, | 850 ; |
danakj
2016/10/03 22:51:49
extra;
Avi (use Gerrit)
2016/10/04 15:56:22
Done.
| |
851 weak_factory_.GetWeakPtr(), src_url, dest_url, callback, impl)); | 851 running_copy_set_.insert(std::move(impl)); |
852 impl_ptr->Run(base::Bind(&CopyOrMoveOperationDelegate::DidCopyOrMoveFile, | |
853 weak_factory_.GetWeakPtr(), src_url, dest_url, | |
854 callback, impl_ptr)); | |
852 } | 855 } |
853 | 856 |
854 void CopyOrMoveOperationDelegate::ProcessDirectory( | 857 void CopyOrMoveOperationDelegate::ProcessDirectory( |
855 const FileSystemURL& src_url, | 858 const FileSystemURL& src_url, |
856 const StatusCallback& callback) { | 859 const StatusCallback& callback) { |
857 if (src_url == src_root_) { | 860 if (src_url == src_root_) { |
858 // The src_root_ looks to be a directory. | 861 // The src_root_ looks to be a directory. |
859 // Try removing the dest_root_ to see if it exists and/or it is an | 862 // Try removing the dest_root_ to see if it exists and/or it is an |
860 // empty directory. | 863 // empty directory. |
861 // We do not invoke |progress_callback_| for source root, because it is | 864 // We do not invoke |progress_callback_| for source root, because it is |
(...skipping 24 matching lines...) Expand all Loading... | |
886 | 889 |
887 operation_runner()->GetMetadata( | 890 operation_runner()->GetMetadata( |
888 src_url, FileSystemOperation::GET_METADATA_FIELD_LAST_MODIFIED, | 891 src_url, FileSystemOperation::GET_METADATA_FIELD_LAST_MODIFIED, |
889 base::Bind( | 892 base::Bind( |
890 &CopyOrMoveOperationDelegate::PostProcessDirectoryAfterGetMetadata, | 893 &CopyOrMoveOperationDelegate::PostProcessDirectoryAfterGetMetadata, |
891 weak_factory_.GetWeakPtr(), src_url, callback)); | 894 weak_factory_.GetWeakPtr(), src_url, callback)); |
892 } | 895 } |
893 | 896 |
894 void CopyOrMoveOperationDelegate::OnCancel() { | 897 void CopyOrMoveOperationDelegate::OnCancel() { |
895 // Request to cancel all running Copy/Move file. | 898 // Request to cancel all running Copy/Move file. |
896 for (std::set<CopyOrMoveImpl*>::iterator iter = running_copy_set_.begin(); | 899 for (auto& job : running_copy_set_) |
897 iter != running_copy_set_.end(); ++iter) | 900 job->Cancel(); |
898 (*iter)->Cancel(); | |
899 } | 901 } |
900 | 902 |
901 void CopyOrMoveOperationDelegate::DidCopyOrMoveFile( | 903 void CopyOrMoveOperationDelegate::DidCopyOrMoveFile( |
902 const FileSystemURL& src_url, | 904 const FileSystemURL& src_url, |
903 const FileSystemURL& dest_url, | 905 const FileSystemURL& dest_url, |
904 const StatusCallback& callback, | 906 const StatusCallback& callback, |
905 CopyOrMoveImpl* impl, | 907 CopyOrMoveImpl* impl, |
906 base::File::Error error) { | 908 base::File::Error error) { |
907 running_copy_set_.erase(impl); | 909 running_copy_set_.erase( |
danakj
2016/10/03 22:51:49
I assume this set is small and not being called mu
Avi (use Gerrit)
2016/10/04 15:56:22
Switching to map.
| |
908 delete impl; | 910 std::find_if(running_copy_set_.begin(), running_copy_set_.end(), |
911 [impl](const std::unique_ptr<CopyOrMoveImpl>& ptr) { | |
912 return ptr.get() == impl; | |
913 })); | |
909 | 914 |
910 if (!progress_callback_.is_null() && error != base::File::FILE_OK && | 915 if (!progress_callback_.is_null() && error != base::File::FILE_OK && |
911 error != base::File::FILE_ERROR_NOT_A_FILE) | 916 error != base::File::FILE_ERROR_NOT_A_FILE) |
912 progress_callback_.Run(FileSystemOperation::ERROR_COPY_ENTRY, src_url, | 917 progress_callback_.Run(FileSystemOperation::ERROR_COPY_ENTRY, src_url, |
913 dest_url, 0); | 918 dest_url, 0); |
914 | 919 |
915 if (!progress_callback_.is_null() && error == base::File::FILE_OK) { | 920 if (!progress_callback_.is_null() && error == base::File::FILE_OK) { |
916 progress_callback_.Run( | 921 progress_callback_.Run( |
917 FileSystemOperation::END_COPY_ENTRY, src_url, dest_url, 0); | 922 FileSystemOperation::END_COPY_ENTRY, src_url, dest_url, 0); |
918 } | 923 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1029 base::FilePath relative = dest_root_.virtual_path(); | 1034 base::FilePath relative = dest_root_.virtual_path(); |
1030 src_root_.virtual_path().AppendRelativePath(src_url.virtual_path(), | 1035 src_root_.virtual_path().AppendRelativePath(src_url.virtual_path(), |
1031 &relative); | 1036 &relative); |
1032 return file_system_context()->CreateCrackedFileSystemURL( | 1037 return file_system_context()->CreateCrackedFileSystemURL( |
1033 dest_root_.origin(), | 1038 dest_root_.origin(), |
1034 dest_root_.mount_type(), | 1039 dest_root_.mount_type(), |
1035 relative); | 1040 relative); |
1036 } | 1041 } |
1037 | 1042 |
1038 } // namespace storage | 1043 } // namespace storage |
OLD | NEW |