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