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 namespace chrome { 13 14 class MediaPathFilter; 15 16 // 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. 19 class NativeMediaFileUtil : public fileapi::AsyncFileUtil { 20 public: 21 explicit NativeMediaFileUtil(MediaPathFilter* media_path_filter); 22 virtual ~NativeMediaFileUtil(); 23 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.) 27 static base::PlatformFileError IsMediaFile(const base::FilePath& path); 28 29 // AsyncFileUtil overrides. 30 virtual void CreateOrOpen( 31 scoped_ptr<fileapi::FileSystemOperationContext> context, 32 const fileapi::FileSystemURL& url, 33 int file_flags, 34 const CreateOrOpenCallback& callback) OVERRIDE; 35 virtual void EnsureFileExists( 36 scoped_ptr<fileapi::FileSystemOperationContext> context, 37 const fileapi::FileSystemURL& url, 38 const EnsureFileExistsCallback& callback) OVERRIDE; 39 virtual void CreateDirectory( 40 scoped_ptr<fileapi::FileSystemOperationContext> context, 41 const fileapi::FileSystemURL& url, 42 bool exclusive, 43 bool recursive, 44 const StatusCallback& callback) OVERRIDE; 45 virtual void GetFileInfo( 46 scoped_ptr<fileapi::FileSystemOperationContext> context, 47 const fileapi::FileSystemURL& url, 48 const GetFileInfoCallback& callback) OVERRIDE; 49 virtual void ReadDirectory( 50 scoped_ptr<fileapi::FileSystemOperationContext> context, 51 const fileapi::FileSystemURL& url, 52 const ReadDirectoryCallback& callback) OVERRIDE; 53 virtual void Touch( 54 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; 59 virtual void Truncate( 60 scoped_ptr<fileapi::FileSystemOperationContext> context, 61 const fileapi::FileSystemURL& url, 62 int64 length, 63 const StatusCallback& callback) OVERRIDE; 64 virtual void CopyFileLocal( 65 scoped_ptr<fileapi::FileSystemOperationContext> context, 66 const fileapi::FileSystemURL& src_url, 67 const fileapi::FileSystemURL& dest_url, 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 const StatusCallback& callback) OVERRIDE; 74 virtual void CopyInForeignFile( 75 scoped_ptr<fileapi::FileSystemOperationContext> context, 76 const base::FilePath& src_file_path, 77 const fileapi::FileSystemURL& dest_url, 78 const StatusCallback& callback) OVERRIDE; 79 virtual void DeleteFile( 80 scoped_ptr<fileapi::FileSystemOperationContext> context, 81 const fileapi::FileSystemURL& url, 82 const StatusCallback& callback) OVERRIDE; 83 virtual void DeleteDirectory( 84 scoped_ptr<fileapi::FileSystemOperationContext> context, 85 const fileapi::FileSystemURL& url, 86 const StatusCallback& callback) OVERRIDE; 87 virtual void DeleteRecursively( 88 scoped_ptr<fileapi::FileSystemOperationContext> context, 89 const fileapi::FileSystemURL& url, 90 const StatusCallback& callback) OVERRIDE; 91 virtual void CreateSnapshotFile( 92 scoped_ptr<fileapi::FileSystemOperationContext> context, 93 const fileapi::FileSystemURL& url, 94 const CreateSnapshotFileCallback& callback) OVERRIDE; 95 96 protected: 97 virtual void CreateDirectoryOnTaskRunnerThread( 98 scoped_ptr<fileapi::FileSystemOperationContext> context, 99 const fileapi::FileSystemURL& url, 100 bool exclusive, 101 bool recursive, 102 const StatusCallback& callback); 103 virtual void GetFileInfoOnTaskRunnerThread( 104 scoped_ptr<fileapi::FileSystemOperationContext> context, 105 const fileapi::FileSystemURL& url, 106 const GetFileInfoCallback& callback); 107 virtual void ReadDirectoryOnTaskRunnerThread( 108 scoped_ptr<fileapi::FileSystemOperationContext> context, 109 const fileapi::FileSystemURL& url, 110 const ReadDirectoryCallback& callback); 111 virtual void CopyOrMoveFileLocalOnTaskRunnerThread( 112 scoped_ptr<fileapi::FileSystemOperationContext> context, 113 const fileapi::FileSystemURL& src_url, 114 const fileapi::FileSystemURL& dest_url, 115 bool copy, 116 const StatusCallback& callback); 117 virtual void CopyInForeignFileOnTaskRunnerThread( 118 scoped_ptr<fileapi::FileSystemOperationContext> context, 119 const base::FilePath& src_file_path, 120 const fileapi::FileSystemURL& dest_url, 121 const StatusCallback& callback); 122 virtual void DeleteDirectoryOnTaskRunnerThread( 123 scoped_ptr<fileapi::FileSystemOperationContext> context, 124 const fileapi::FileSystemURL& url, 125 const StatusCallback& callback); 126 virtual void CreateSnapshotFileOnTaskRunnerThread( 127 scoped_ptr<fileapi::FileSystemOperationContext> context, 128 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 174 protected: 175 chrome::MediaPathFilter* media_path_filter() { 176 return media_path_filter_; 177 } 178 179 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 200 201 base::WeakPtrFactory<NativeMediaFileUtil> weak_factory_; 202 203 // Not owned, owned by the backend which owns this. 204 chrome::MediaPathFilter* media_path_filter_; 205 206 DISALLOW_COPY_AND_ASSIGN(NativeMediaFileUtil); 207 }; 208 209 } // namespace chrome 210 211 #endif // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_ 212