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
3 // found in the LICENSE file.
5 #ifndef WEBKIT_BROWSER_FILEAPI_COPY_OR_MOVE_OPERATION_DELEGATE_H_
6 #define WEBKIT_BROWSER_FILEAPI_COPY_OR_MOVE_OPERATION_DELEGATE_H_
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"
17 class DrainableIOBuffer
;
18 class IOBufferWithSize
;
21 namespace webkit_blob
{
22 class FileStreamReader
;
23 class ShareableFileReference
;
28 class CopyOrMoveFileValidator
;
29 class FileStreamWriter
;
31 // A delegate class for recursive copy or move operations.
32 class CopyOrMoveOperationDelegate
33 : public RecursiveOperationDelegate
{
36 typedef FileSystemOperation::CopyProgressCallback CopyProgressCallback
;
37 typedef FileSystemOperation::CopyOrMoveOption CopyOrMoveOption
;
44 // Helper to copy a file by reader and writer streams.
45 // Export for testing.
46 class WEBKIT_STORAGE_BROWSER_EXPORT StreamCopyHelper
{
49 scoped_ptr
<webkit_blob::FileStreamReader
> reader
,
50 scoped_ptr
<FileStreamWriter
> writer
,
53 const FileSystemOperation::CopyFileProgressCallback
&
54 file_progress_callback
,
55 const base::TimeDelta
& min_progress_callback_invocation_span
);
58 void Run(const StatusCallback
& callback
);
60 // Requests cancelling. After the cancelling is done, |callback| passed to
61 // Run will be called.
65 // Reads the content from the |reader_|.
66 void Read(const StatusCallback
& callback
);
67 void DidRead(const StatusCallback
& callback
, int result
);
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
);
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
);
79 scoped_ptr
<webkit_blob::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
);
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();
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
;
115 virtual void OnCancel() OVERRIDE
;
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
);
143 void OnCopyFileProgress(const FileSystemURL
& src_url
, int64 size
);
144 FileSystemURL
CreateDestURL(const FileSystemURL
& src_url
) const;
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_
;
154 std::set
<CopyOrMoveImpl
*> running_copy_set_
;
155 base::WeakPtrFactory
<CopyOrMoveOperationDelegate
> weak_factory_
;
157 DISALLOW_COPY_AND_ASSIGN(CopyOrMoveOperationDelegate
);
160 } // namespace fileapi
162 #endif // WEBKIT_BROWSER_FILEAPI_COPY_OR_MOVE_OPERATION_DELEGATE_H_