Home | History | Annotate | Download | only in fileapi
      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