// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_ #define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "webkit/browser/fileapi/async_file_util.h" namespace net { class IOBuffer; } class MediaPathFilter; // This class handles native file system operations with media type filtering. // To support virtual file systems it implements the AsyncFileUtil interface // from scratch and provides synchronous override points. class NativeMediaFileUtil : public fileapi::AsyncFileUtil { public: explicit NativeMediaFileUtil(MediaPathFilter* media_path_filter); virtual ~NativeMediaFileUtil(); // Uses the MIME sniffer code, which actually looks into the file, // to determine if it is really a media file (to avoid exposing // non-media files with a media file extension.) static base::File::Error IsMediaFile(const base::FilePath& path); static base::File::Error BufferIsMediaHeader(net::IOBuffer* buf, size_t length); // Methods to support CreateOrOpen. Public so they can be shared with // DeviceMediaAsyncFileUtil. static void CreatedSnapshotFileForCreateOrOpen( base::SequencedTaskRunner* media_task_runner, int file_flags, const fileapi::AsyncFileUtil::CreateOrOpenCallback& callback, base::File::Error result, const base::File::Info& file_info, const base::FilePath& platform_path, const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref); // AsyncFileUtil overrides. virtual void CreateOrOpen( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, int file_flags, const CreateOrOpenCallback& callback) OVERRIDE; virtual void EnsureFileExists( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const EnsureFileExistsCallback& callback) OVERRIDE; virtual void CreateDirectory( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, bool exclusive, bool recursive, const StatusCallback& callback) OVERRIDE; virtual void GetFileInfo( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const GetFileInfoCallback& callback) OVERRIDE; virtual void ReadDirectory( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const ReadDirectoryCallback& callback) OVERRIDE; virtual void Touch( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const base::Time& last_access_time, const base::Time& last_modified_time, const StatusCallback& callback) OVERRIDE; virtual void Truncate( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, int64 length, const StatusCallback& callback) OVERRIDE; virtual void CopyFileLocal( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& src_url, const fileapi::FileSystemURL& dest_url, CopyOrMoveOption option, const CopyFileProgressCallback& progress_callback, const StatusCallback& callback) OVERRIDE; virtual void MoveFileLocal( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& src_url, const fileapi::FileSystemURL& dest_url, CopyOrMoveOption option, const StatusCallback& callback) OVERRIDE; virtual void CopyInForeignFile( scoped_ptr<fileapi::FileSystemOperationContext> context, const base::FilePath& src_file_path, const fileapi::FileSystemURL& dest_url, const StatusCallback& callback) OVERRIDE; virtual void DeleteFile( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const StatusCallback& callback) OVERRIDE; virtual void DeleteDirectory( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const StatusCallback& callback) OVERRIDE; virtual void DeleteRecursively( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const StatusCallback& callback) OVERRIDE; virtual void CreateSnapshotFile( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const CreateSnapshotFileCallback& callback) OVERRIDE; protected: virtual void CreateDirectoryOnTaskRunnerThread( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, bool exclusive, bool recursive, const StatusCallback& callback); virtual void GetFileInfoOnTaskRunnerThread( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const GetFileInfoCallback& callback); virtual void ReadDirectoryOnTaskRunnerThread( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const ReadDirectoryCallback& callback); virtual void CopyOrMoveFileLocalOnTaskRunnerThread( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& src_url, const fileapi::FileSystemURL& dest_url, CopyOrMoveOption option, bool copy, const StatusCallback& callback); virtual void CopyInForeignFileOnTaskRunnerThread( scoped_ptr<fileapi::FileSystemOperationContext> context, const base::FilePath& src_file_path, const fileapi::FileSystemURL& dest_url, const StatusCallback& callback); virtual void DeleteFileOnTaskRunnerThread( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const StatusCallback& callback); virtual void DeleteDirectoryOnTaskRunnerThread( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const StatusCallback& callback); virtual void CreateSnapshotFileOnTaskRunnerThread( scoped_ptr<fileapi::FileSystemOperationContext> context, const fileapi::FileSystemURL& url, const CreateSnapshotFileCallback& callback); // The following methods should only be called on the task runner thread. // Necessary for copy/move to succeed. virtual base::File::Error CreateDirectorySync( fileapi::FileSystemOperationContext* context, const fileapi::FileSystemURL& url, bool exclusive, bool recursive); virtual base::File::Error CopyOrMoveFileSync( fileapi::FileSystemOperationContext* context, const fileapi::FileSystemURL& src_url, const fileapi::FileSystemURL& dest_url, CopyOrMoveOption option, bool copy); virtual base::File::Error CopyInForeignFileSync( fileapi::FileSystemOperationContext* context, const base::FilePath& src_file_path, const fileapi::FileSystemURL& dest_url); virtual base::File::Error GetFileInfoSync( fileapi::FileSystemOperationContext* context, const fileapi::FileSystemURL& url, base::File::Info* file_info, base::FilePath* platform_path); // Called by GetFileInfoSync. Meant to be overridden by subclasses that // have special mappings from URLs to platform paths (virtual filesystems). virtual base::File::Error GetLocalFilePath( fileapi::FileSystemOperationContext* context, const fileapi::FileSystemURL& file_system_url, base::FilePath* local_file_path); virtual base::File::Error ReadDirectorySync( fileapi::FileSystemOperationContext* context, const fileapi::FileSystemURL& url, EntryList* file_list); virtual base::File::Error DeleteFileSync( fileapi::FileSystemOperationContext* context, const fileapi::FileSystemURL& url); // Necessary for move to succeed. virtual base::File::Error DeleteDirectorySync( fileapi::FileSystemOperationContext* context, const fileapi::FileSystemURL& url); virtual base::File::Error CreateSnapshotFileSync( fileapi::FileSystemOperationContext* context, const fileapi::FileSystemURL& url, base::File::Info* file_info, base::FilePath* platform_path, scoped_refptr<webkit_blob::ShareableFileReference>* file_ref); MediaPathFilter* media_path_filter() { return media_path_filter_; } private: // Like GetLocalFilePath(), but always take media_path_filter() into // consideration. If the media_path_filter() check fails, return // Fila::FILE_ERROR_SECURITY. |local_file_path| does not have to exist. base::File::Error GetFilteredLocalFilePath( fileapi::FileSystemOperationContext* context, const fileapi::FileSystemURL& file_system_url, base::FilePath* local_file_path); // Like GetLocalFilePath(), but if the file does not exist, then return // |failure_error|. // If |local_file_path| is a file, then take media_path_filter() into // consideration. // If the media_path_filter() check fails, return |failure_error|. // If |local_file_path| is a directory, return File::FILE_OK. base::File::Error GetFilteredLocalFilePathForExistingFileOrDirectory( fileapi::FileSystemOperationContext* context, const fileapi::FileSystemURL& file_system_url, base::File::Error failure_error, base::FilePath* local_file_path); // Not owned, owned by the backend which owns this. MediaPathFilter* const media_path_filter_; base::WeakPtrFactory<NativeMediaFileUtil> weak_factory_; DISALLOW_COPY_AND_ASSIGN(NativeMediaFileUtil); }; #endif // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_NATIVE_MEDIA_FILE_UTIL_H_