Home | History | Annotate | Download | only in fileapi
      1 // Copyright 2013 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_CHROMEOS_FILEAPI_FILE_SYSTEM_BACKEND_H_
      6 #define CHROME_BROWSER_CHROMEOS_FILEAPI_FILE_SYSTEM_BACKEND_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/compiler_specific.h"
     12 #include "base/files/file_path.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "webkit/browser/fileapi/file_system_backend.h"
     15 #include "webkit/browser/quota/special_storage_policy.h"
     16 #include "webkit/common/fileapi/file_system_types.h"
     17 
     18 namespace fileapi {
     19 class CopyOrMoveFileValidatorFactory;
     20 class ExternalMountPoints;
     21 class FileSystemURL;
     22 }  // namespace fileapi
     23 
     24 namespace chromeos {
     25 
     26 class FileSystemBackendDelegate;
     27 class FileAccessPermissions;
     28 
     29 // FileSystemBackend is a Chrome OS specific implementation of
     30 // ExternalFileSystemBackend. This class is responsible for a
     31 // number of things, including:
     32 //
     33 // - Add system mount points
     34 // - Grant/revoke/check file access permissions
     35 // - Create FileSystemOperation per file system type
     36 // - Create FileStreamReader/Writer per file system type
     37 //
     38 // Chrome OS specific mount points:
     39 //
     40 // "Downloads" is a mount point for user's Downloads directory on the local
     41 // disk, where downloaded files are stored by default.
     42 //
     43 // "archive" is a mount point for an archive file, such as a zip file. This
     44 // mount point exposes contents of an archive file via cros_disks and AVFS
     45 // <http://avf.sourceforge.net/>.
     46 //
     47 // "removable" is a mount point for removable media such as an SD card.
     48 // Insertion and removal of removable media are handled by cros_disks.
     49 //
     50 // "oem" is a read-only mount point for a directory containing OEM data.
     51 //
     52 // "drive" is a mount point for Google Drive. Drive is integrated with the
     53 // FileSystem API layer via drive::FileSystemProxy. This mount point is added
     54 // by drive::DriveIntegrationService.
     55 //
     56 // These mount points are placed under the "external" namespace, and file
     57 // system URLs for these mount points look like:
     58 //
     59 //   filesystem:<origin>/external/<mount_name>/...
     60 //
     61 class FileSystemBackend : public fileapi::ExternalFileSystemBackend {
     62  public:
     63   using fileapi::FileSystemBackend::OpenFileSystemCallback;
     64 
     65   // FileSystemBackend will take an ownership of a |mount_points|
     66   // reference. On the other hand, |system_mount_points| will be kept as a raw
     67   // pointer and it should outlive FileSystemBackend instance.
     68   // The ownerships of |drive_delegate| and |file_system_provider_delegate| are
     69   // also taken.
     70   FileSystemBackend(
     71       FileSystemBackendDelegate* drive_delegate,
     72       FileSystemBackendDelegate* file_system_provider_delegate,
     73       FileSystemBackendDelegate* mtp_delegate,
     74       scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy,
     75       scoped_refptr<fileapi::ExternalMountPoints> mount_points,
     76       fileapi::ExternalMountPoints* system_mount_points);
     77   virtual ~FileSystemBackend();
     78 
     79   // Adds system mount points, such as "archive", and "removable". This
     80   // function is no-op if these mount points are already present.
     81   void AddSystemMountPoints();
     82 
     83   // Returns true if CrosMountpointProvider can handle |url|, i.e. its
     84   // file system type matches with what this provider supports.
     85   // This could be called on any threads.
     86   static bool CanHandleURL(const fileapi::FileSystemURL& url);
     87 
     88   // fileapi::FileSystemBackend overrides.
     89   virtual bool CanHandleType(fileapi::FileSystemType type) const OVERRIDE;
     90   virtual void Initialize(fileapi::FileSystemContext* context) OVERRIDE;
     91   virtual void ResolveURL(const fileapi::FileSystemURL& url,
     92                           fileapi::OpenFileSystemMode mode,
     93                           const OpenFileSystemCallback& callback) OVERRIDE;
     94   virtual fileapi::AsyncFileUtil* GetAsyncFileUtil(
     95       fileapi::FileSystemType type) OVERRIDE;
     96   virtual fileapi::CopyOrMoveFileValidatorFactory*
     97       GetCopyOrMoveFileValidatorFactory(
     98           fileapi::FileSystemType type,
     99           base::File::Error* error_code) OVERRIDE;
    100   virtual fileapi::FileSystemOperation* CreateFileSystemOperation(
    101       const fileapi::FileSystemURL& url,
    102       fileapi::FileSystemContext* context,
    103       base::File::Error* error_code) const OVERRIDE;
    104   virtual bool SupportsStreaming(
    105       const fileapi::FileSystemURL& url) const OVERRIDE;
    106   virtual scoped_ptr<webkit_blob::FileStreamReader> CreateFileStreamReader(
    107       const fileapi::FileSystemURL& path,
    108       int64 offset,
    109       const base::Time& expected_modification_time,
    110       fileapi::FileSystemContext* context) const OVERRIDE;
    111   virtual scoped_ptr<fileapi::FileStreamWriter> CreateFileStreamWriter(
    112       const fileapi::FileSystemURL& url,
    113       int64 offset,
    114       fileapi::FileSystemContext* context) const OVERRIDE;
    115   virtual fileapi::FileSystemQuotaUtil* GetQuotaUtil() OVERRIDE;
    116 
    117   // fileapi::ExternalFileSystemBackend overrides.
    118   virtual bool IsAccessAllowed(const fileapi::FileSystemURL& url)
    119       const OVERRIDE;
    120   virtual std::vector<base::FilePath> GetRootDirectories() const OVERRIDE;
    121   virtual void GrantFullAccessToExtension(
    122       const std::string& extension_id) OVERRIDE;
    123   virtual void GrantFileAccessToExtension(
    124       const std::string& extension_id,
    125       const base::FilePath& virtual_path) OVERRIDE;
    126   virtual void RevokeAccessForExtension(
    127       const std::string& extension_id) OVERRIDE;
    128   virtual bool GetVirtualPath(const base::FilePath& filesystem_path,
    129                               base::FilePath* virtual_path) OVERRIDE;
    130 
    131  private:
    132   scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy_;
    133   scoped_ptr<FileAccessPermissions> file_access_permissions_;
    134   scoped_ptr<fileapi::AsyncFileUtil> local_file_util_;
    135 
    136   // The delegate instance for the drive file system related operations.
    137   scoped_ptr<FileSystemBackendDelegate> drive_delegate_;
    138 
    139   // The delegate instance for the provided file system related operations.
    140   scoped_ptr<FileSystemBackendDelegate> file_system_provider_delegate_;
    141 
    142   // The delegate instance for the MTP file system related operations.
    143   scoped_ptr<FileSystemBackendDelegate> mtp_delegate_;
    144 
    145   // Mount points specific to the owning context (i.e. per-profile mount
    146   // points).
    147   //
    148   // It is legal to have mount points with the same name as in
    149   // system_mount_points_. Also, mount point paths may overlap with mount point
    150   // paths in system_mount_points_. In both cases mount points in
    151   // |mount_points_| will have a priority.
    152   // E.g. if |mount_points_| map 'foo1' to '/foo/foo1' and
    153   // |file_system_mount_points_| map 'xxx' to '/foo/foo1/xxx', |GetVirtualPaths|
    154   // will resolve '/foo/foo1/xxx/yyy' as 'foo1/xxx/yyy' (i.e. the mapping from
    155   // |mount_points_| will be used).
    156   scoped_refptr<fileapi::ExternalMountPoints> mount_points_;
    157 
    158   // Globally visible mount points. System MountPonts instance should outlive
    159   // all FileSystemBackend instances, so raw pointer is safe.
    160   fileapi::ExternalMountPoints* system_mount_points_;
    161 
    162   DISALLOW_COPY_AND_ASSIGN(FileSystemBackend);
    163 };
    164 
    165 }  // namespace chromeos
    166 
    167 #endif  // CHROME_BROWSER_CHROMEOS_FILEAPI_FILE_SYSTEM_BACKEND_H_
    168