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.
5 #ifndef CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_
6 #define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_
8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/weak_ptr.h"
10 #include "webkit/browser/fileapi/async_file_util.h"
12 class MediaPathFilter;
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 {
19 explicit NativeMediaFileUtil(MediaPathFilter* media_path_filter);
20 virtual ~NativeMediaFileUtil();
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);
27 // AsyncFileUtil overrides.
28 virtual void CreateOrOpen(
29 scoped_ptr<fileapi::FileSystemOperationContext> context,
30 const fileapi::FileSystemURL& url,
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,
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;
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,
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;
98 virtual void CreateDirectoryOnTaskRunnerThread(
99 scoped_ptr<fileapi::FileSystemOperationContext> context,
100 const fileapi::FileSystemURL& url,
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,
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);
133 // The following methods should only be called on the task runner thread.
135 // Necessary for copy/move to succeed.
136 virtual base::PlatformFileError CreateDirectorySync(
137 fileapi::FileSystemOperationContext* context,
138 const fileapi::FileSystemURL& url,
141 virtual base::PlatformFileError CopyOrMoveFileSync(
142 fileapi::FileSystemOperationContext* context,
143 const fileapi::FileSystemURL& src_url,
144 const fileapi::FileSystemURL& dest_url,
145 CopyOrMoveOption option,
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);
178 MediaPathFilter* media_path_filter() {
179 return media_path_filter_;
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);
191 // Like GetLocalFilePath(), but if the file does not exist, then return
193 // If |local_file_path| is a file, then take media_path_filter() into
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);
204 // Not owned, owned by the backend which owns this.
205 MediaPathFilter* media_path_filter_;
207 base::WeakPtrFactory<NativeMediaFileUtil> weak_factory_;
209 DISALLOW_COPY_AND_ASSIGN(NativeMediaFileUtil);
212 #endif // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_