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 base::ProcessHandle peer_handle,
73 const OpenFileCallback& callback) OVERRIDE;
74 virtual void Cancel(const StatusCallback& cancel_callback) OVERRIDE;
75 virtual void CreateSnapshotFile(
76 const FileSystemURL& path,
77 const SnapshotFileCallback& callback) OVERRIDE;
78 virtual void CopyInForeignFile(const base::FilePath& src_local_disk_path,
79 const FileSystemURL& dest_url,
80 const StatusCallback& callback) OVERRIDE;
81 virtual void RemoveFile(const FileSystemURL& url,
82 const StatusCallback& callback) OVERRIDE;
83 virtual void RemoveDirectory(const FileSystemURL& url,
84 const StatusCallback& callback) OVERRIDE;
85 virtual void CopyFileLocal(const FileSystemURL& src_url,
86 const FileSystemURL& dest_url,
87 CopyOrMoveOption option,
88 const CopyFileProgressCallback& progress_callback,
89 const StatusCallback& callback) OVERRIDE;
90 virtual void MoveFileLocal(const FileSystemURL& src_url,
91 const FileSystemURL& dest_url,
92 CopyOrMoveOption option,
93 const StatusCallback& callback) OVERRIDE;
94 virtual base::PlatformFileError SyncGetPlatformPath(
95 const FileSystemURL& url,
96 base::FilePath* platform_path) OVERRIDE;
98 FileSystemContext* file_system_context() const {
99 return file_system_context_.get();
103 friend class FileSystemOperation;
105 FileSystemOperationImpl(
106 const FileSystemURL& url,
107 FileSystemContext* file_system_context,
108 scoped_ptr<FileSystemOperationContext> operation_context);
110 // Queries the quota and usage and then runs the given |task|.
111 // If an error occurs during the quota query it runs |error_callback| instead.
112 void GetUsageAndQuotaThenRunTask(
113 const FileSystemURL& url,
114 const base::Closure& task,
115 const base::Closure& error_callback);
117 // Called after the quota info is obtained from the quota manager
118 // (which is triggered by GetUsageAndQuotaThenRunTask).
119 // Sets the quota info in the operation_context_ and then runs the given
120 // |task| if the returned quota status is successful, otherwise runs
122 void DidGetUsageAndQuotaAndRunTask(
123 const base::Closure& task,
124 const base::Closure& error_callback,
125 quota::QuotaStatusCode status,
126 int64 usage, int64 quota);
128 // The 'body' methods that perform the actual work (i.e. posting the
129 // file task on proxy_) after the quota check.
130 void DoCreateFile(const FileSystemURL& url,
131 const StatusCallback& callback, bool exclusive);
132 void DoCreateDirectory(const FileSystemURL& url,
133 const StatusCallback& callback,
136 void DoCopyFileLocal(const FileSystemURL& src,
137 const FileSystemURL& dest,
138 CopyOrMoveOption option,
139 const CopyFileProgressCallback& progress_callback,
140 const StatusCallback& callback);
141 void DoMoveFileLocal(const FileSystemURL& src,
142 const FileSystemURL& dest,
143 CopyOrMoveOption option,
144 const StatusCallback& callback);
145 void DoCopyInForeignFile(const base::FilePath& src_local_disk_file_path,
146 const FileSystemURL& dest,
147 const StatusCallback& callback);
148 void DoTruncate(const FileSystemURL& url,
149 const StatusCallback& callback, int64 length);
150 void DoOpenFile(const FileSystemURL& url,
151 const OpenFileCallback& callback, int file_flags);
153 // Callback for CreateFile for |exclusive|=true cases.
154 void DidEnsureFileExistsExclusive(const StatusCallback& callback,
155 base::PlatformFileError rv,
158 // Callback for CreateFile for |exclusive|=false cases.
159 void DidEnsureFileExistsNonExclusive(const StatusCallback& callback,
160 base::PlatformFileError rv,
163 void DidFinishOperation(const StatusCallback& callback,
164 base::PlatformFileError rv);
165 void DidDirectoryExists(const StatusCallback& callback,
166 base::PlatformFileError rv,
167 const base::PlatformFileInfo& file_info);
168 void DidFileExists(const StatusCallback& callback,
169 base::PlatformFileError rv,
170 const base::PlatformFileInfo& file_info);
171 void DidDeleteRecursively(const FileSystemURL& url,
172 const StatusCallback& callback,
173 base::PlatformFileError rv);
174 void DidWrite(const FileSystemURL& url,
175 const WriteCallback& callback,
176 base::PlatformFileError rv,
178 FileWriterDelegate::WriteProgressStatus write_status);
179 void DidOpenFile(const OpenFileCallback& callback,
180 base::PlatformFileError rv,
181 base::PassPlatformFile file,
182 const base::Closure& on_close_callback);
184 // Used only for internal assertions.
185 // Returns false if there's another inflight pending operation.
186 bool SetPendingOperationType(OperationType type);
188 scoped_refptr<FileSystemContext> file_system_context_;
190 scoped_ptr<FileSystemOperationContext> operation_context_;
191 AsyncFileUtil* async_file_util_; // Not owned.
193 scoped_ptr<FileWriterDelegate> file_writer_delegate_;
194 scoped_ptr<RecursiveOperationDelegate> recursive_operation_delegate_;
196 StatusCallback cancel_callback_;
198 // Used only by OpenFile, in order to clone the file handle back to the
199 // requesting process.
200 base::ProcessHandle peer_handle_;
202 // A flag to make sure we call operation only once per instance.
203 OperationType pending_operation_;
205 base::WeakPtrFactory<FileSystemOperationImpl> weak_factory_;
207 DISALLOW_COPY_AND_ASSIGN(FileSystemOperationImpl);
210 } // namespace fileapi
212 #endif // WEBKIT_BROWSER_FILEAPI_FILE_SYSTEM_OPERATION_IMPL_H_