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
3 // found in the LICENSE file.
5 #ifndef WEBKIT_BROWSER_FILEAPI_FILE_SYSTEM_OPERATION_IMPL_H_
6 #define WEBKIT_BROWSER_FILEAPI_FILE_SYSTEM_OPERATION_IMPL_H_
10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/weak_ptr.h"
13 #include "webkit/browser/fileapi/file_system_operation.h"
14 #include "webkit/browser/fileapi/file_system_operation_context.h"
15 #include "webkit/browser/fileapi/file_system_url.h"
16 #include "webkit/browser/fileapi/file_writer_delegate.h"
17 #include "webkit/browser/webkit_storage_browser_export.h"
18 #include "webkit/common/blob/scoped_file.h"
19 #include "webkit/common/quota/quota_types.h"
24 class FileSystemContext
;
25 class RecursiveOperationDelegate
;
27 // The default implementation of FileSystemOperation for file systems.
28 class WEBKIT_STORAGE_BROWSER_EXPORT FileSystemOperationImpl
29 : public NON_EXPORTED_BASE(FileSystemOperation
) {
31 virtual ~FileSystemOperationImpl();
33 // FileSystemOperation overrides.
34 virtual void CreateFile(const FileSystemURL
& url
,
36 const StatusCallback
& callback
) OVERRIDE
;
37 virtual void CreateDirectory(const FileSystemURL
& url
,
40 const StatusCallback
& callback
) OVERRIDE
;
41 virtual void Copy(const FileSystemURL
& src_url
,
42 const FileSystemURL
& dest_url
,
43 CopyOrMoveOption option
,
44 const CopyProgressCallback
& progress_callback
,
45 const StatusCallback
& callback
) OVERRIDE
;
46 virtual void Move(const FileSystemURL
& src_url
,
47 const FileSystemURL
& dest_url
,
48 CopyOrMoveOption option
,
49 const StatusCallback
& callback
) OVERRIDE
;
50 virtual void DirectoryExists(const FileSystemURL
& url
,
51 const StatusCallback
& callback
) OVERRIDE
;
52 virtual void FileExists(const FileSystemURL
& url
,
53 const StatusCallback
& callback
) OVERRIDE
;
54 virtual void GetMetadata(const FileSystemURL
& url
,
55 const GetMetadataCallback
& callback
) OVERRIDE
;
56 virtual void ReadDirectory(const FileSystemURL
& url
,
57 const ReadDirectoryCallback
& callback
) OVERRIDE
;
58 virtual void Remove(const FileSystemURL
& url
, bool recursive
,
59 const StatusCallback
& callback
) OVERRIDE
;
60 virtual void Write(const FileSystemURL
& url
,
61 scoped_ptr
<FileWriterDelegate
> writer_delegate
,
62 scoped_ptr
<net::URLRequest
> blob_request
,
63 const WriteCallback
& callback
) OVERRIDE
;
64 virtual void Truncate(const FileSystemURL
& url
, int64 length
,
65 const StatusCallback
& callback
) OVERRIDE
;
66 virtual void TouchFile(const FileSystemURL
& url
,
67 const base::Time
& last_access_time
,
68 const base::Time
& last_modified_time
,
69 const StatusCallback
& callback
) OVERRIDE
;
70 virtual void OpenFile(const FileSystemURL
& url
,
72 const OpenFileCallback
& callback
) OVERRIDE
;
73 virtual void Cancel(const StatusCallback
& cancel_callback
) OVERRIDE
;
74 virtual void CreateSnapshotFile(
75 const FileSystemURL
& path
,
76 const SnapshotFileCallback
& callback
) OVERRIDE
;
77 virtual void CopyInForeignFile(const base::FilePath
& src_local_disk_path
,
78 const FileSystemURL
& dest_url
,
79 const StatusCallback
& callback
) OVERRIDE
;
80 virtual void RemoveFile(const FileSystemURL
& url
,
81 const StatusCallback
& callback
) OVERRIDE
;
82 virtual void RemoveDirectory(const FileSystemURL
& url
,
83 const StatusCallback
& callback
) OVERRIDE
;
84 virtual void CopyFileLocal(const FileSystemURL
& src_url
,
85 const FileSystemURL
& dest_url
,
86 CopyOrMoveOption option
,
87 const CopyFileProgressCallback
& progress_callback
,
88 const StatusCallback
& callback
) OVERRIDE
;
89 virtual void MoveFileLocal(const FileSystemURL
& src_url
,
90 const FileSystemURL
& dest_url
,
91 CopyOrMoveOption option
,
92 const StatusCallback
& callback
) OVERRIDE
;
93 virtual base::File::Error
SyncGetPlatformPath(
94 const FileSystemURL
& url
,
95 base::FilePath
* platform_path
) OVERRIDE
;
97 FileSystemContext
* file_system_context() const {
98 return file_system_context_
.get();
102 friend class FileSystemOperation
;
104 FileSystemOperationImpl(
105 const FileSystemURL
& url
,
106 FileSystemContext
* file_system_context
,
107 scoped_ptr
<FileSystemOperationContext
> operation_context
);
109 // Queries the quota and usage and then runs the given |task|.
110 // If an error occurs during the quota query it runs |error_callback| instead.
111 void GetUsageAndQuotaThenRunTask(
112 const FileSystemURL
& url
,
113 const base::Closure
& task
,
114 const base::Closure
& error_callback
);
116 // Called after the quota info is obtained from the quota manager
117 // (which is triggered by GetUsageAndQuotaThenRunTask).
118 // Sets the quota info in the operation_context_ and then runs the given
119 // |task| if the returned quota status is successful, otherwise runs
121 void DidGetUsageAndQuotaAndRunTask(
122 const base::Closure
& task
,
123 const base::Closure
& error_callback
,
124 quota::QuotaStatusCode status
,
125 int64 usage
, int64 quota
);
127 // The 'body' methods that perform the actual work (i.e. posting the
128 // file task on proxy_) after the quota check.
129 void DoCreateFile(const FileSystemURL
& url
,
130 const StatusCallback
& callback
, bool exclusive
);
131 void DoCreateDirectory(const FileSystemURL
& url
,
132 const StatusCallback
& callback
,
135 void DoCopyFileLocal(const FileSystemURL
& src
,
136 const FileSystemURL
& dest
,
137 CopyOrMoveOption option
,
138 const CopyFileProgressCallback
& progress_callback
,
139 const StatusCallback
& callback
);
140 void DoMoveFileLocal(const FileSystemURL
& src
,
141 const FileSystemURL
& dest
,
142 CopyOrMoveOption option
,
143 const StatusCallback
& callback
);
144 void DoCopyInForeignFile(const base::FilePath
& src_local_disk_file_path
,
145 const FileSystemURL
& dest
,
146 const StatusCallback
& callback
);
147 void DoTruncate(const FileSystemURL
& url
,
148 const StatusCallback
& callback
, int64 length
);
149 void DoOpenFile(const FileSystemURL
& url
,
150 const OpenFileCallback
& callback
, int file_flags
);
152 // Callback for CreateFile for |exclusive|=true cases.
153 void DidEnsureFileExistsExclusive(const StatusCallback
& callback
,
154 base::File::Error rv
,
157 // Callback for CreateFile for |exclusive|=false cases.
158 void DidEnsureFileExistsNonExclusive(const StatusCallback
& callback
,
159 base::File::Error rv
,
162 void DidFinishOperation(const StatusCallback
& callback
,
163 base::File::Error rv
);
164 void DidDirectoryExists(const StatusCallback
& callback
,
165 base::File::Error rv
,
166 const base::File::Info
& file_info
);
167 void DidFileExists(const StatusCallback
& callback
,
168 base::File::Error rv
,
169 const base::File::Info
& file_info
);
170 void DidDeleteRecursively(const FileSystemURL
& url
,
171 const StatusCallback
& callback
,
172 base::File::Error rv
);
173 void DidWrite(const FileSystemURL
& url
,
174 const WriteCallback
& callback
,
175 base::File::Error rv
,
177 FileWriterDelegate::WriteProgressStatus write_status
);
178 void DidOpenFile(const OpenFileCallback
& callback
,
180 const base::Closure
& on_close_callback
);
182 // Used only for internal assertions.
183 // Returns false if there's another inflight pending operation.
184 bool SetPendingOperationType(OperationType type
);
186 scoped_refptr
<FileSystemContext
> file_system_context_
;
188 scoped_ptr
<FileSystemOperationContext
> operation_context_
;
189 AsyncFileUtil
* async_file_util_
; // Not owned.
191 scoped_ptr
<FileWriterDelegate
> file_writer_delegate_
;
192 scoped_ptr
<RecursiveOperationDelegate
> recursive_operation_delegate_
;
194 StatusCallback cancel_callback_
;
196 // A flag to make sure we call operation only once per instance.
197 OperationType pending_operation_
;
199 base::WeakPtrFactory
<FileSystemOperationImpl
> weak_factory_
;
201 DISALLOW_COPY_AND_ASSIGN(FileSystemOperationImpl
);
204 } // namespace fileapi
206 #endif // WEBKIT_BROWSER_FILEAPI_FILE_SYSTEM_OPERATION_IMPL_H_