| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #ifndef WEBKIT_BROWSER_FILEAPI_COPY_OR_MOVE_OPERATION_DELEGATE_H_ | 5 #include "storage/browser/fileapi/copy_or_move_operation_delegate.h" |
| 6 #define WEBKIT_BROWSER_FILEAPI_COPY_OR_MOVE_OPERATION_DELEGATE_H_ | |
| 7 | |
| 8 #include <set> | |
| 9 #include <stack> | |
| 10 | |
| 11 #include "base/memory/ref_counted.h" | |
| 12 #include "base/memory/scoped_ptr.h" | |
| 13 #include "base/time/time.h" | |
| 14 #include "webkit/browser/fileapi/recursive_operation_delegate.h" | |
| 15 | |
| 16 namespace net { | |
| 17 class DrainableIOBuffer; | |
| 18 class IOBufferWithSize; | |
| 19 } | |
| 20 | |
| 21 namespace storage { | |
| 22 class FileStreamReader; | |
| 23 class ShareableFileReference; | |
| 24 } | |
| 25 | |
| 26 namespace storage { | |
| 27 | |
| 28 class CopyOrMoveFileValidator; | |
| 29 class FileStreamWriter; | |
| 30 | |
| 31 // A delegate class for recursive copy or move operations. | |
| 32 class CopyOrMoveOperationDelegate | |
| 33 : public RecursiveOperationDelegate { | |
| 34 public: | |
| 35 class CopyOrMoveImpl; | |
| 36 typedef FileSystemOperation::CopyProgressCallback CopyProgressCallback; | |
| 37 typedef FileSystemOperation::CopyOrMoveOption CopyOrMoveOption; | |
| 38 | |
| 39 enum OperationType { | |
| 40 OPERATION_COPY, | |
| 41 OPERATION_MOVE | |
| 42 }; | |
| 43 | |
| 44 // Helper to copy a file by reader and writer streams. | |
| 45 // Export for testing. | |
| 46 class STORAGE_EXPORT StreamCopyHelper { | |
| 47 public: | |
| 48 StreamCopyHelper( | |
| 49 scoped_ptr<storage::FileStreamReader> reader, | |
| 50 scoped_ptr<FileStreamWriter> writer, | |
| 51 bool need_flush, | |
| 52 int buffer_size, | |
| 53 const FileSystemOperation::CopyFileProgressCallback& | |
| 54 file_progress_callback, | |
| 55 const base::TimeDelta& min_progress_callback_invocation_span); | |
| 56 ~StreamCopyHelper(); | |
| 57 | |
| 58 void Run(const StatusCallback& callback); | |
| 59 | |
| 60 // Requests cancelling. After the cancelling is done, |callback| passed to | |
| 61 // Run will be called. | |
| 62 void Cancel(); | |
| 63 | |
| 64 private: | |
| 65 // Reads the content from the |reader_|. | |
| 66 void Read(const StatusCallback& callback); | |
| 67 void DidRead(const StatusCallback& callback, int result); | |
| 68 | |
| 69 // Writes the content in |buffer| to |writer_|. | |
| 70 void Write(const StatusCallback& callback, | |
| 71 scoped_refptr<net::DrainableIOBuffer> buffer); | |
| 72 void DidWrite(const StatusCallback& callback, | |
| 73 scoped_refptr<net::DrainableIOBuffer> buffer, int result); | |
| 74 | |
| 75 // Flushes the written content in |writer_|. | |
| 76 void Flush(const StatusCallback& callback, bool is_eof); | |
| 77 void DidFlush(const StatusCallback& callback, bool is_eof, int result); | |
| 78 | |
| 79 scoped_ptr<storage::FileStreamReader> reader_; | |
| 80 scoped_ptr<FileStreamWriter> writer_; | |
| 81 const bool need_flush_; | |
| 82 FileSystemOperation::CopyFileProgressCallback file_progress_callback_; | |
| 83 scoped_refptr<net::IOBufferWithSize> io_buffer_; | |
| 84 int64 num_copied_bytes_; | |
| 85 int64 previous_flush_offset_; | |
| 86 base::Time last_progress_callback_invocation_time_; | |
| 87 base::TimeDelta min_progress_callback_invocation_span_; | |
| 88 bool cancel_requested_; | |
| 89 base::WeakPtrFactory<StreamCopyHelper> weak_factory_; | |
| 90 DISALLOW_COPY_AND_ASSIGN(StreamCopyHelper); | |
| 91 }; | |
| 92 | |
| 93 CopyOrMoveOperationDelegate( | |
| 94 FileSystemContext* file_system_context, | |
| 95 const FileSystemURL& src_root, | |
| 96 const FileSystemURL& dest_root, | |
| 97 OperationType operation_type, | |
| 98 CopyOrMoveOption option, | |
| 99 const CopyProgressCallback& progress_callback, | |
| 100 const StatusCallback& callback); | |
| 101 virtual ~CopyOrMoveOperationDelegate(); | |
| 102 | |
| 103 // RecursiveOperationDelegate overrides: | |
| 104 virtual void Run() OVERRIDE; | |
| 105 virtual void RunRecursively() OVERRIDE; | |
| 106 virtual void ProcessFile(const FileSystemURL& url, | |
| 107 const StatusCallback& callback) OVERRIDE; | |
| 108 virtual void ProcessDirectory(const FileSystemURL& url, | |
| 109 const StatusCallback& callback) OVERRIDE; | |
| 110 virtual void PostProcessDirectory(const FileSystemURL& url, | |
| 111 const StatusCallback& callback) OVERRIDE; | |
| 112 | |
| 113 | |
| 114 protected: | |
| 115 virtual void OnCancel() OVERRIDE; | |
| 116 | |
| 117 private: | |
| 118 void DidCopyOrMoveFile(const FileSystemURL& src_url, | |
| 119 const FileSystemURL& dest_url, | |
| 120 const StatusCallback& callback, | |
| 121 CopyOrMoveImpl* impl, | |
| 122 base::File::Error error); | |
| 123 void DidTryRemoveDestRoot(const StatusCallback& callback, | |
| 124 base::File::Error error); | |
| 125 void ProcessDirectoryInternal(const FileSystemURL& src_url, | |
| 126 const FileSystemURL& dest_url, | |
| 127 const StatusCallback& callback); | |
| 128 void DidCreateDirectory(const FileSystemURL& src_url, | |
| 129 const FileSystemURL& dest_url, | |
| 130 const StatusCallback& callback, | |
| 131 base::File::Error error); | |
| 132 void PostProcessDirectoryAfterGetMetadata( | |
| 133 const FileSystemURL& src_url, | |
| 134 const StatusCallback& callback, | |
| 135 base::File::Error error, | |
| 136 const base::File::Info& file_info); | |
| 137 void PostProcessDirectoryAfterTouchFile(const FileSystemURL& src_url, | |
| 138 const StatusCallback& callback, | |
| 139 base::File::Error error); | |
| 140 void DidRemoveSourceForMove(const StatusCallback& callback, | |
| 141 base::File::Error error); | |
| 142 | |
| 143 void OnCopyFileProgress(const FileSystemURL& src_url, int64 size); | |
| 144 FileSystemURL CreateDestURL(const FileSystemURL& src_url) const; | |
| 145 | |
| 146 FileSystemURL src_root_; | |
| 147 FileSystemURL dest_root_; | |
| 148 bool same_file_system_; | |
| 149 OperationType operation_type_; | |
| 150 CopyOrMoveOption option_; | |
| 151 CopyProgressCallback progress_callback_; | |
| 152 StatusCallback callback_; | |
| 153 | |
| 154 std::set<CopyOrMoveImpl*> running_copy_set_; | |
| 155 base::WeakPtrFactory<CopyOrMoveOperationDelegate> weak_factory_; | |
| 156 | |
| 157 DISALLOW_COPY_AND_ASSIGN(CopyOrMoveOperationDelegate); | |
| 158 }; | |
| 159 | |
| 160 } // namespace storage | |
| 161 | |
| 162 #endif // WEBKIT_BROWSER_FILEAPI_COPY_OR_MOVE_OPERATION_DELEGATE_H_ | |
| OLD | NEW |