- add sources.
[platform/framework/web/crosswalk.git] / src / webkit / browser / fileapi / file_system_operation_impl.h
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.
4
5 #ifndef WEBKIT_BROWSER_FILEAPI_FILE_SYSTEM_OPERATION_IMPL_H_
6 #define WEBKIT_BROWSER_FILEAPI_FILE_SYSTEM_OPERATION_IMPL_H_
7
8 #include <vector>
9
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"
20
21 namespace fileapi {
22
23 class AsyncFileUtil;
24 class FileSystemContext;
25 class RecursiveOperationDelegate;
26
27 // The default implementation of FileSystemOperation for file systems.
28 class WEBKIT_STORAGE_BROWSER_EXPORT FileSystemOperationImpl
29     : public NON_EXPORTED_BASE(FileSystemOperation) {
30  public:
31   virtual ~FileSystemOperationImpl();
32
33   // FileSystemOperation overrides.
34   virtual void CreateFile(const FileSystemURL& url,
35                           bool exclusive,
36                           const StatusCallback& callback) OVERRIDE;
37   virtual void CreateDirectory(const FileSystemURL& url,
38                                bool exclusive,
39                                bool recursive,
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,
71                         int file_flags,
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;
97
98   FileSystemContext* file_system_context() const {
99     return file_system_context_.get();
100   }
101
102  private:
103   friend class FileSystemOperation;
104
105   FileSystemOperationImpl(
106       const FileSystemURL& url,
107       FileSystemContext* file_system_context,
108       scoped_ptr<FileSystemOperationContext> operation_context);
109
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);
116
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
121   // |error_callback|.
122   void DidGetUsageAndQuotaAndRunTask(
123       const base::Closure& task,
124       const base::Closure& error_callback,
125       quota::QuotaStatusCode status,
126       int64 usage, int64 quota);
127
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,
134                          bool exclusive,
135                          bool recursive);
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);
152
153   // Callback for CreateFile for |exclusive|=true cases.
154   void DidEnsureFileExistsExclusive(const StatusCallback& callback,
155                                     base::PlatformFileError rv,
156                                     bool created);
157
158   // Callback for CreateFile for |exclusive|=false cases.
159   void DidEnsureFileExistsNonExclusive(const StatusCallback& callback,
160                                        base::PlatformFileError rv,
161                                        bool created);
162
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,
177                 int64 bytes,
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);
183
184   // Used only for internal assertions.
185   // Returns false if there's another inflight pending operation.
186   bool SetPendingOperationType(OperationType type);
187
188   scoped_refptr<FileSystemContext> file_system_context_;
189
190   scoped_ptr<FileSystemOperationContext> operation_context_;
191   AsyncFileUtil* async_file_util_;  // Not owned.
192
193   scoped_ptr<FileWriterDelegate> file_writer_delegate_;
194   scoped_ptr<RecursiveOperationDelegate> recursive_operation_delegate_;
195
196   StatusCallback cancel_callback_;
197
198   // Used only by OpenFile, in order to clone the file handle back to the
199   // requesting process.
200   base::ProcessHandle peer_handle_;
201
202   // A flag to make sure we call operation only once per instance.
203   OperationType pending_operation_;
204
205   base::WeakPtrFactory<FileSystemOperationImpl> weak_factory_;
206
207   DISALLOW_COPY_AND_ASSIGN(FileSystemOperationImpl);
208 };
209
210 }  // namespace fileapi
211
212 #endif  // WEBKIT_BROWSER_FILEAPI_FILE_SYSTEM_OPERATION_IMPL_H_