- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / media_galleries / fileapi / native_media_file_util.h
1 // Copyright (c) 2012 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 CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_
6 #define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_
7
8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/weak_ptr.h"
10 #include "webkit/browser/fileapi/async_file_util.h"
11
12 class MediaPathFilter;
13
14 // This class handles native file system operations with media type filtering.
15 // To support virtual file systems it implements the AsyncFileUtil interface
16 // from scratch and provides synchronous override points.
17 class NativeMediaFileUtil : public fileapi::AsyncFileUtil {
18  public:
19   explicit NativeMediaFileUtil(MediaPathFilter* media_path_filter);
20   virtual ~NativeMediaFileUtil();
21
22   // Uses the MIME sniffer code, which actually looks into the file,
23   // to determine if it is really a media file (to avoid exposing
24   // non-media files with a media file extension.)
25   static base::PlatformFileError IsMediaFile(const base::FilePath& path);
26
27   // AsyncFileUtil overrides.
28   virtual void CreateOrOpen(
29       scoped_ptr<fileapi::FileSystemOperationContext> context,
30       const fileapi::FileSystemURL& url,
31       int file_flags,
32       const CreateOrOpenCallback& callback) OVERRIDE;
33   virtual void EnsureFileExists(
34       scoped_ptr<fileapi::FileSystemOperationContext> context,
35       const fileapi::FileSystemURL& url,
36       const EnsureFileExistsCallback& callback) OVERRIDE;
37   virtual void CreateDirectory(
38       scoped_ptr<fileapi::FileSystemOperationContext> context,
39       const fileapi::FileSystemURL& url,
40       bool exclusive,
41       bool recursive,
42       const StatusCallback& callback) OVERRIDE;
43   virtual void GetFileInfo(
44       scoped_ptr<fileapi::FileSystemOperationContext> context,
45       const fileapi::FileSystemURL& url,
46       const GetFileInfoCallback& callback) OVERRIDE;
47   virtual void ReadDirectory(
48       scoped_ptr<fileapi::FileSystemOperationContext> context,
49       const fileapi::FileSystemURL& url,
50       const ReadDirectoryCallback& callback) OVERRIDE;
51   virtual void Touch(
52       scoped_ptr<fileapi::FileSystemOperationContext> context,
53       const fileapi::FileSystemURL& url,
54       const base::Time& last_access_time,
55       const base::Time& last_modified_time,
56       const StatusCallback& callback) OVERRIDE;
57   virtual void Truncate(
58       scoped_ptr<fileapi::FileSystemOperationContext> context,
59       const fileapi::FileSystemURL& url,
60       int64 length,
61       const StatusCallback& callback) OVERRIDE;
62   virtual void CopyFileLocal(
63       scoped_ptr<fileapi::FileSystemOperationContext> context,
64       const fileapi::FileSystemURL& src_url,
65       const fileapi::FileSystemURL& dest_url,
66       CopyOrMoveOption option,
67       const CopyFileProgressCallback& progress_callback,
68       const StatusCallback& callback) OVERRIDE;
69   virtual void MoveFileLocal(
70       scoped_ptr<fileapi::FileSystemOperationContext> context,
71       const fileapi::FileSystemURL& src_url,
72       const fileapi::FileSystemURL& dest_url,
73       CopyOrMoveOption option,
74       const StatusCallback& callback) OVERRIDE;
75   virtual void CopyInForeignFile(
76       scoped_ptr<fileapi::FileSystemOperationContext> context,
77       const base::FilePath& src_file_path,
78       const fileapi::FileSystemURL& dest_url,
79       const StatusCallback& callback) OVERRIDE;
80   virtual void DeleteFile(
81       scoped_ptr<fileapi::FileSystemOperationContext> context,
82       const fileapi::FileSystemURL& url,
83       const StatusCallback& callback) OVERRIDE;
84   virtual void DeleteDirectory(
85       scoped_ptr<fileapi::FileSystemOperationContext> context,
86       const fileapi::FileSystemURL& url,
87       const StatusCallback& callback) OVERRIDE;
88   virtual void DeleteRecursively(
89       scoped_ptr<fileapi::FileSystemOperationContext> context,
90       const fileapi::FileSystemURL& url,
91       const StatusCallback& callback) OVERRIDE;
92   virtual void CreateSnapshotFile(
93       scoped_ptr<fileapi::FileSystemOperationContext> context,
94       const fileapi::FileSystemURL& url,
95       const CreateSnapshotFileCallback& callback) OVERRIDE;
96
97  protected:
98   virtual void CreateDirectoryOnTaskRunnerThread(
99       scoped_ptr<fileapi::FileSystemOperationContext> context,
100       const fileapi::FileSystemURL& url,
101       bool exclusive,
102       bool recursive,
103       const StatusCallback& callback);
104   virtual void GetFileInfoOnTaskRunnerThread(
105       scoped_ptr<fileapi::FileSystemOperationContext> context,
106       const fileapi::FileSystemURL& url,
107       const GetFileInfoCallback& callback);
108   virtual void ReadDirectoryOnTaskRunnerThread(
109       scoped_ptr<fileapi::FileSystemOperationContext> context,
110       const fileapi::FileSystemURL& url,
111       const ReadDirectoryCallback& callback);
112   virtual void CopyOrMoveFileLocalOnTaskRunnerThread(
113       scoped_ptr<fileapi::FileSystemOperationContext> context,
114       const fileapi::FileSystemURL& src_url,
115       const fileapi::FileSystemURL& dest_url,
116       CopyOrMoveOption option,
117       bool copy,
118       const StatusCallback& callback);
119   virtual void CopyInForeignFileOnTaskRunnerThread(
120       scoped_ptr<fileapi::FileSystemOperationContext> context,
121       const base::FilePath& src_file_path,
122       const fileapi::FileSystemURL& dest_url,
123       const StatusCallback& callback);
124   virtual void DeleteDirectoryOnTaskRunnerThread(
125       scoped_ptr<fileapi::FileSystemOperationContext> context,
126       const fileapi::FileSystemURL& url,
127       const StatusCallback& callback);
128   virtual void CreateSnapshotFileOnTaskRunnerThread(
129       scoped_ptr<fileapi::FileSystemOperationContext> context,
130       const fileapi::FileSystemURL& url,
131       const CreateSnapshotFileCallback& callback);
132
133   // The following methods should only be called on the task runner thread.
134
135   // Necessary for copy/move to succeed.
136   virtual base::PlatformFileError CreateDirectorySync(
137       fileapi::FileSystemOperationContext* context,
138       const fileapi::FileSystemURL& url,
139       bool exclusive,
140       bool recursive);
141   virtual base::PlatformFileError CopyOrMoveFileSync(
142       fileapi::FileSystemOperationContext* context,
143       const fileapi::FileSystemURL& src_url,
144       const fileapi::FileSystemURL& dest_url,
145       CopyOrMoveOption option,
146       bool copy);
147   virtual base::PlatformFileError CopyInForeignFileSync(
148       fileapi::FileSystemOperationContext* context,
149       const base::FilePath& src_file_path,
150       const fileapi::FileSystemURL& dest_url);
151   virtual base::PlatformFileError GetFileInfoSync(
152       fileapi::FileSystemOperationContext* context,
153       const fileapi::FileSystemURL& url,
154       base::PlatformFileInfo* file_info,
155       base::FilePath* platform_path);
156   // Called by GetFileInfoSync. Meant to be overridden by subclasses that
157   // have special mappings from URLs to platform paths (virtual filesystems).
158   virtual base::PlatformFileError GetLocalFilePath(
159       fileapi::FileSystemOperationContext* context,
160       const fileapi::FileSystemURL& file_system_url,
161       base::FilePath* local_file_path);
162   virtual base::PlatformFileError ReadDirectorySync(
163       fileapi::FileSystemOperationContext* context,
164       const fileapi::FileSystemURL& url,
165       EntryList* file_list);
166   // Necessary for move to succeed.
167   virtual base::PlatformFileError DeleteDirectorySync(
168       fileapi::FileSystemOperationContext* context,
169       const fileapi::FileSystemURL& url);
170   virtual base::PlatformFileError CreateSnapshotFileSync(
171       fileapi::FileSystemOperationContext* context,
172       const fileapi::FileSystemURL& url,
173       base::PlatformFileInfo* file_info,
174       base::FilePath* platform_path,
175       scoped_refptr<webkit_blob::ShareableFileReference>* file_ref);
176
177  protected:
178   MediaPathFilter* media_path_filter() {
179     return media_path_filter_;
180   }
181
182  private:
183   // Like GetLocalFilePath(), but always take media_path_filter() into
184   // consideration. If the media_path_filter() check fails, return
185   // PLATFORM_FILE_ERROR_SECURITY. |local_file_path| does not have to exist.
186   base::PlatformFileError GetFilteredLocalFilePath(
187       fileapi::FileSystemOperationContext* context,
188       const fileapi::FileSystemURL& file_system_url,
189       base::FilePath* local_file_path);
190
191   // Like GetLocalFilePath(), but if the file does not exist, then return
192   // |failure_error|.
193   // If |local_file_path| is a file, then take media_path_filter() into
194   // consideration.
195   // If the media_path_filter() check fails, return |failure_error|.
196   // If |local_file_path| is a directory, return PLATFORM_FILE_OK.
197   base::PlatformFileError GetFilteredLocalFilePathForExistingFileOrDirectory(
198       fileapi::FileSystemOperationContext* context,
199       const fileapi::FileSystemURL& file_system_url,
200       base::PlatformFileError failure_error,
201       base::FilePath* local_file_path);
202
203
204   // Not owned, owned by the backend which owns this.
205   MediaPathFilter* media_path_filter_;
206
207   base::WeakPtrFactory<NativeMediaFileUtil> weak_factory_;
208
209   DISALLOW_COPY_AND_ASSIGN(NativeMediaFileUtil);
210 };
211
212 #endif  // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_