• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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