blob: a797e144873cc9d73577045e2c4f346b009ea58d [file] [log] [blame]
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +01001// 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"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +01009#include "base/memory/weak_ptr.h"
10#include "webkit/browser/fileapi/async_file_util.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010011
12namespace chrome {
13
Ben Murdochbb1529c2013-08-08 10:24:53 +010014class MediaPathFilter;
15
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010016// This class handles native file system operations with media type filtering.
17// To support virtual file systems it implements the AsyncFileUtil interface
18// from scratch and provides synchronous override points.
19class NativeMediaFileUtil : public fileapi::AsyncFileUtil {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010020 public:
Ben Murdochbb1529c2013-08-08 10:24:53 +010021 explicit NativeMediaFileUtil(MediaPathFilter* media_path_filter);
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010022 virtual ~NativeMediaFileUtil();
Torne (Richard Coles)a93a17c2013-05-15 11:34:50 +010023
24 // Uses the MIME sniffer code, which actually looks into the file,
25 // to determine if it is really a media file (to avoid exposing
26 // non-media files with a media file extension.)
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010027 static base::PlatformFileError IsMediaFile(const base::FilePath& path);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010028
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010029 // AsyncFileUtil overrides.
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010030 virtual void CreateOrOpen(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010031 scoped_ptr<fileapi::FileSystemOperationContext> context,
32 const fileapi::FileSystemURL& url,
33 int file_flags,
34 const CreateOrOpenCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010035 virtual void EnsureFileExists(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010036 scoped_ptr<fileapi::FileSystemOperationContext> context,
37 const fileapi::FileSystemURL& url,
38 const EnsureFileExistsCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010039 virtual void CreateDirectory(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010040 scoped_ptr<fileapi::FileSystemOperationContext> context,
41 const fileapi::FileSystemURL& url,
42 bool exclusive,
43 bool recursive,
44 const StatusCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010045 virtual void GetFileInfo(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010046 scoped_ptr<fileapi::FileSystemOperationContext> context,
47 const fileapi::FileSystemURL& url,
48 const GetFileInfoCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010049 virtual void ReadDirectory(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010050 scoped_ptr<fileapi::FileSystemOperationContext> context,
51 const fileapi::FileSystemURL& url,
52 const ReadDirectoryCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010053 virtual void Touch(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010054 scoped_ptr<fileapi::FileSystemOperationContext> context,
55 const fileapi::FileSystemURL& url,
56 const base::Time& last_access_time,
57 const base::Time& last_modified_time,
58 const StatusCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010059 virtual void Truncate(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010060 scoped_ptr<fileapi::FileSystemOperationContext> context,
61 const fileapi::FileSystemURL& url,
62 int64 length,
63 const StatusCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010064 virtual void CopyFileLocal(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010065 scoped_ptr<fileapi::FileSystemOperationContext> context,
66 const fileapi::FileSystemURL& src_url,
67 const fileapi::FileSystemURL& dest_url,
68 const StatusCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010069 virtual void MoveFileLocal(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010070 scoped_ptr<fileapi::FileSystemOperationContext> context,
71 const fileapi::FileSystemURL& src_url,
72 const fileapi::FileSystemURL& dest_url,
73 const StatusCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010074 virtual void CopyInForeignFile(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010075 scoped_ptr<fileapi::FileSystemOperationContext> context,
76 const base::FilePath& src_file_path,
77 const fileapi::FileSystemURL& dest_url,
78 const StatusCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010079 virtual void DeleteFile(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010080 scoped_ptr<fileapi::FileSystemOperationContext> context,
81 const fileapi::FileSystemURL& url,
82 const StatusCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010083 virtual void DeleteDirectory(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010084 scoped_ptr<fileapi::FileSystemOperationContext> context,
85 const fileapi::FileSystemURL& url,
86 const StatusCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010087 virtual void DeleteRecursively(
Ben Murdocheb525c52013-07-10 11:40:50 +010088 scoped_ptr<fileapi::FileSystemOperationContext> context,
89 const fileapi::FileSystemURL& url,
90 const StatusCallback& callback) OVERRIDE;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010091 virtual void CreateSnapshotFile(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010092 scoped_ptr<fileapi::FileSystemOperationContext> context,
93 const fileapi::FileSystemURL& url,
94 const CreateSnapshotFileCallback& callback) OVERRIDE;
95
96 protected:
97 virtual void CreateDirectoryOnTaskRunnerThread(
Ben Murdocheb525c52013-07-10 11:40:50 +010098 scoped_ptr<fileapi::FileSystemOperationContext> context,
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010099 const fileapi::FileSystemURL& url,
100 bool exclusive,
101 bool recursive,
102 const StatusCallback& callback);
103 virtual void GetFileInfoOnTaskRunnerThread(
Ben Murdocheb525c52013-07-10 11:40:50 +0100104 scoped_ptr<fileapi::FileSystemOperationContext> context,
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100105 const fileapi::FileSystemURL& url,
106 const GetFileInfoCallback& callback);
107 virtual void ReadDirectoryOnTaskRunnerThread(
Ben Murdocheb525c52013-07-10 11:40:50 +0100108 scoped_ptr<fileapi::FileSystemOperationContext> context,
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100109 const fileapi::FileSystemURL& url,
110 const ReadDirectoryCallback& callback);
111 virtual void CopyOrMoveFileLocalOnTaskRunnerThread(
Ben Murdocheb525c52013-07-10 11:40:50 +0100112 scoped_ptr<fileapi::FileSystemOperationContext> context,
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100113 const fileapi::FileSystemURL& src_url,
114 const fileapi::FileSystemURL& dest_url,
115 bool copy,
116 const StatusCallback& callback);
117 virtual void CopyInForeignFileOnTaskRunnerThread(
Ben Murdocheb525c52013-07-10 11:40:50 +0100118 scoped_ptr<fileapi::FileSystemOperationContext> context,
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100119 const base::FilePath& src_file_path,
120 const fileapi::FileSystemURL& dest_url,
121 const StatusCallback& callback);
122 virtual void DeleteDirectoryOnTaskRunnerThread(
Ben Murdocheb525c52013-07-10 11:40:50 +0100123 scoped_ptr<fileapi::FileSystemOperationContext> context,
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100124 const fileapi::FileSystemURL& url,
125 const StatusCallback& callback);
126 virtual void CreateSnapshotFileOnTaskRunnerThread(
Ben Murdocheb525c52013-07-10 11:40:50 +0100127 scoped_ptr<fileapi::FileSystemOperationContext> context,
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100128 const fileapi::FileSystemURL& url,
129 const CreateSnapshotFileCallback& callback);
130
131 // The following methods should only be called on the task runner thread.
132
133 // Necessary for copy/move to succeed.
134 virtual base::PlatformFileError CreateDirectorySync(
135 fileapi::FileSystemOperationContext* context,
136 const fileapi::FileSystemURL& url,
137 bool exclusive,
138 bool recursive);
139 virtual base::PlatformFileError CopyOrMoveFileSync(
140 fileapi::FileSystemOperationContext* context,
141 const fileapi::FileSystemURL& src_url,
142 const fileapi::FileSystemURL& dest_url,
143 bool copy);
144 virtual base::PlatformFileError CopyInForeignFileSync(
145 fileapi::FileSystemOperationContext* context,
146 const base::FilePath& src_file_path,
147 const fileapi::FileSystemURL& dest_url);
148 virtual base::PlatformFileError GetFileInfoSync(
149 fileapi::FileSystemOperationContext* context,
150 const fileapi::FileSystemURL& url,
151 base::PlatformFileInfo* file_info,
152 base::FilePath* platform_path);
153 // Called by GetFileInfoSync. Meant to be overridden by subclasses that
154 // have special mappings from URLs to platform paths (virtual filesystems).
155 virtual base::PlatformFileError GetLocalFilePath(
156 fileapi::FileSystemOperationContext* context,
157 const fileapi::FileSystemURL& file_system_url,
158 base::FilePath* local_file_path);
159 virtual base::PlatformFileError ReadDirectorySync(
160 fileapi::FileSystemOperationContext* context,
161 const fileapi::FileSystemURL& url,
162 EntryList* file_list);
163 // Necessary for move to succeed.
164 virtual base::PlatformFileError DeleteDirectorySync(
165 fileapi::FileSystemOperationContext* context,
166 const fileapi::FileSystemURL& url);
167 virtual base::PlatformFileError CreateSnapshotFileSync(
168 fileapi::FileSystemOperationContext* context,
169 const fileapi::FileSystemURL& url,
170 base::PlatformFileInfo* file_info,
171 base::FilePath* platform_path,
172 scoped_refptr<webkit_blob::ShareableFileReference>* file_ref);
173
Ben Murdochbb1529c2013-08-08 10:24:53 +0100174 protected:
175 chrome::MediaPathFilter* media_path_filter() {
176 return media_path_filter_;
177 }
178
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100179 private:
180 // Like GetLocalFilePath(), but always take media_path_filter() into
181 // consideration. If the media_path_filter() check fails, return
182 // PLATFORM_FILE_ERROR_SECURITY. |local_file_path| does not have to exist.
183 base::PlatformFileError GetFilteredLocalFilePath(
184 fileapi::FileSystemOperationContext* context,
185 const fileapi::FileSystemURL& file_system_url,
186 base::FilePath* local_file_path);
187
188 // Like GetLocalFilePath(), but if the file does not exist, then return
189 // |failure_error|.
190 // If |local_file_path| is a file, then take media_path_filter() into
191 // consideration.
192 // If the media_path_filter() check fails, return |failure_error|.
193 // If |local_file_path| is a directory, return PLATFORM_FILE_OK.
194 base::PlatformFileError GetFilteredLocalFilePathForExistingFileOrDirectory(
195 fileapi::FileSystemOperationContext* context,
196 const fileapi::FileSystemURL& file_system_url,
197 base::PlatformFileError failure_error,
198 base::FilePath* local_file_path);
199
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100200
201 base::WeakPtrFactory<NativeMediaFileUtil> weak_factory_;
202
Ben Murdochbb1529c2013-08-08 10:24:53 +0100203 // Not owned, owned by the backend which owns this.
204 chrome::MediaPathFilter* media_path_filter_;
205
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100206 DISALLOW_COPY_AND_ASSIGN(NativeMediaFileUtil);
207};
208
209} // namespace chrome
210
211#endif // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_