1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/fileapi/file_system_backend.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/chromeos/fileapi/file_access_permissions.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/fileapi/file_system_backend_delegate.h"
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/url_constants.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/cros_disks_client.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/blob/file_stream_reader.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/external_mount_points.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_stream_writer.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_context.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool FileSystemBackend::CanHandleURL(const storage::FileSystemURL& url) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url.is_valid())
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return url.type() == storage::kFileSystemTypeNativeLocal ||
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         url.type() == storage::kFileSystemTypeRestrictedNativeLocal ||
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         url.type() == storage::kFileSystemTypeDrive ||
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         url.type() == storage::kFileSystemTypeProvided ||
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         url.type() == storage::kFileSystemTypeDeviceMediaAsFileStorage;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFileSystemBackend::FileSystemBackend(
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    FileSystemBackendDelegate* drive_delegate,
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    FileSystemBackendDelegate* file_system_provider_delegate,
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    FileSystemBackendDelegate* mtp_delegate,
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy,
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_refptr<storage::ExternalMountPoints> mount_points,
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::ExternalMountPoints* system_mount_points)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : special_storage_policy_(special_storage_policy),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_access_permissions_(new FileAccessPermissions()),
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      local_file_util_(storage::AsyncFileUtil::CreateForLocalFileSystem()),
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      drive_delegate_(drive_delegate),
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      file_system_provider_delegate_(file_system_provider_delegate),
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      mtp_delegate_(mtp_delegate),
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mount_points_(mount_points),
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      system_mount_points_(system_mount_points) {
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFileSystemBackend::~FileSystemBackend() {
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid FileSystemBackend::AddSystemMountPoints() {
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // RegisterFileSystem() is no-op if the mount point with the same name
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // already exists, hence it's safe to call without checking if a mount
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // point already exists or not.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  system_mount_points_->RegisterFileSystem(
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "archive",
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::kFileSystemTypeNativeLocal,
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemMountOption(),
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chromeos::CrosDisksClient::GetArchiveMountPoint());
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  system_mount_points_->RegisterFileSystem(
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "removable",
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::kFileSystemTypeNativeLocal,
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemMountOption(storage::COPY_SYNC_OPTION_SYNC),
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chromeos::CrosDisksClient::GetRemovableDiskMountPoint());
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  system_mount_points_->RegisterFileSystem(
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "oem",
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::kFileSystemTypeRestrictedNativeLocal,
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemMountOption(),
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("/usr/share/oem")));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool FileSystemBackend::CanHandleType(storage::FileSystemType type) const {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (type) {
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeExternal:
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeDrive:
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeRestrictedNativeLocal:
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeNativeLocal:
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeNativeForPlatformApp:
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeDeviceMediaAsFileStorage:
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeProvided:
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void FileSystemBackend::Initialize(storage::FileSystemContext* context) {
94bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
95bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void FileSystemBackend::ResolveURL(const storage::FileSystemURL& url,
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   storage::OpenFileSystemMode mode,
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   const OpenFileSystemCallback& callback) {
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string id;
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemType type;
1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  std::string cracked_id;
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::FilePath path;
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemMountOption option;
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!mount_points_->CrackVirtualPath(
1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)           url.virtual_path(), &id, &type, &cracked_id, &path, &option) &&
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !system_mount_points_->CrackVirtualPath(
1076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)           url.virtual_path(), &id, &type, &cracked_id, &path, &option)) {
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Not under a mount point, so return an error, since the root is not
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // accessible.
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    GURL root_url = GURL(storage::GetExternalFileSystemRootURIString(
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        url.origin(), std::string()));
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    callback.Run(root_url, std::string(), base::File::FILE_ERROR_SECURITY);
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string name;
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Construct a URL restricted to the found mount point.
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string root_url =
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::GetExternalFileSystemRootURIString(url.origin(), id);
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // For removable and archives, the file system root is the external mount
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // point plus the inner mount point.
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (id == "archive" || id == "removable") {
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    std::vector<std::string> components;
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    url.virtual_path().GetComponents(&components);
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK_EQ(id, components.at(0));
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (components.size() < 2) {
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // Unable to access /archive and /removable directories directly. The
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // inner mount name must be specified.
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      callback.Run(
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          GURL(root_url), std::string(), base::File::FILE_ERROR_SECURITY);
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    std::string inner_mount_name = components[1];
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    root_url += inner_mount_name + "/";
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    name = inner_mount_name;
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    name = id;
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  callback.Run(GURL(root_url), name, base::File::FILE_OK);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::FileSystemQuotaUtil* FileSystemBackend::GetQuotaUtil() {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No quota support.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst storage::UpdateObserverList* FileSystemBackend::GetUpdateObservers(
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    storage::FileSystemType type) const {
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst storage::ChangeObserverList* FileSystemBackend::GetChangeObservers(
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    storage::FileSystemType type) const {
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst storage::AccessObserverList* FileSystemBackend::GetAccessObservers(
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    storage::FileSystemType type) const {
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool FileSystemBackend::IsAccessAllowed(
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url) const {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!url.is_valid())
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No extra check is needed for isolated file systems.
17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (url.mount_type() == storage::kFileSystemTypeIsolated)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!CanHandleURL(url))
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string extension_id = url.origin().host();
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // TODO(mtomasz): Temporarily whitelist TimeScapes. Remove this in M-31.
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // See: crbug.com/271946
179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (extension_id == "mlbmkoenclnokonejhlfakkeabdlmpek" &&
18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      url.type() == storage::kFileSystemTypeRestrictedNativeLocal) {
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return true;
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Grant access for URL having "externalfile:" scheme. The URL
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // filesystem:externalfile:/xxx cannot be parsed directly. The URL is created
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // only by DriveURLRequestJob.
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (url.origin().scheme() == chrome::kExternalFileScheme)
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return true;
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check first to make sure this extension has fileBrowserHander permissions.
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!special_storage_policy_.get() ||
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      !special_storage_policy_->IsFileHandler(extension_id))
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return file_access_permissions_->HasAccessPermission(extension_id,
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                       url.virtual_path());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid FileSystemBackend::GrantFullAccessToExtension(
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extension_id) {
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!special_storage_policy_.get())
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!special_storage_policy_->IsFileHandler(extension_id)) {
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    NOTREACHED();
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  file_access_permissions_->GrantFullAccessPermission(extension_id);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid FileSystemBackend::GrantFileAccessToExtension(
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& extension_id, const base::FilePath& virtual_path) {
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!special_storage_policy_.get())
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All we care about here is access from extensions for now.
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!special_storage_policy_->IsFileHandler(extension_id)) {
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    NOTREACHED();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id;
22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemType type;
2226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  std::string cracked_id;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemMountOption option;
2256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!mount_points_->CrackVirtualPath(virtual_path, &id, &type, &cracked_id,
2266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                       &path, &option) &&
2276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      !system_mount_points_->CrackVirtualPath(virtual_path, &id, &type,
2286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                              &cracked_id, &path, &option)) {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (type == storage::kFileSystemTypeRestrictedNativeLocal) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Can't grant access for restricted mount point";
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_access_permissions_->GrantAccessPermission(extension_id, virtual_path);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid FileSystemBackend::RevokeAccessForExtension(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_access_permissions_->RevokePermissions(extension_id);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstd::vector<base::FilePath> FileSystemBackend::GetRootDirectories() const {
24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::vector<storage::MountPoints::MountPointInfo> mount_points;
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mount_points_->AddMountPointInfosTo(&mount_points);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  system_mount_points_->AddMountPointInfosTo(&mount_points);
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::FilePath> root_dirs;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < mount_points.size(); ++i)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_dirs.push_back(mount_points[i].path);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return root_dirs;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::AsyncFileUtil* FileSystemBackend::GetAsyncFileUtil(
25703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemType type) {
2580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  switch (type) {
25903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeDrive:
2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return drive_delegate_->GetAsyncFileUtil(type);
26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeProvided:
2620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return file_system_provider_delegate_->GetAsyncFileUtil(type);
26303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeNativeLocal:
26403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeRestrictedNativeLocal:
2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return local_file_util_.get();
26603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeDeviceMediaAsFileStorage:
2675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return mtp_delegate_->GetAsyncFileUtil(type);
2680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    default:
2690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      NOTREACHED();
2700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return NULL;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistorage::WatcherManager* FileSystemBackend::GetWatcherManager(
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    storage::FileSystemType type) {
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::CopyOrMoveFileValidatorFactory*
2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemType type,
28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    base::File::Error* error_code) {
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(error_code);
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *error_code = base::File::FILE_OK;
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::FileSystemOperation* FileSystemBackend::CreateFileSystemOperation(
28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemContext* context,
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Error* error_code) const {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(url.is_valid());
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!IsAccessAllowed(url)) {
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *error_code = base::File::FILE_ERROR_SECURITY;
296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return NULL;
297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (url.type() == storage::kFileSystemTypeDeviceMediaAsFileStorage) {
3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // MTP file operations run on MediaTaskRunner.
30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return storage::FileSystemOperation::Create(
30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        url,
30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        context,
30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        make_scoped_ptr(new storage::FileSystemOperationContext(
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            context, MediaFileSystemBackend::MediaTaskRunner().get())));
3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
3075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
30803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK(url.type() == storage::kFileSystemTypeNativeLocal ||
30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         url.type() == storage::kFileSystemTypeRestrictedNativeLocal ||
31003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         url.type() == storage::kFileSystemTypeDrive ||
31103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         url.type() == storage::kFileSystemTypeProvided);
31203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return storage::FileSystemOperation::Create(
31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      url,
31403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      context,
31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      make_scoped_ptr(new storage::FileSystemOperationContext(context)));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool FileSystemBackend::SupportsStreaming(
31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url) const {
32003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return url.type() == storage::kFileSystemTypeDrive ||
32103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         url.type() == storage::kFileSystemTypeProvided ||
32203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)         url.type() == storage::kFileSystemTypeDeviceMediaAsFileStorage;
32303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
32403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool FileSystemBackend::HasInplaceCopyImplementation(
32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemType type) const {
32703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  switch (type) {
32803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeDrive:
32903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeProvided:
33003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeDeviceMediaAsFileStorage:
33103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return true;
33203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeNativeLocal:
33303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeRestrictedNativeLocal:
33403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return false;
33503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    default:
33603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      NOTREACHED();
33703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
33803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return true;
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
34103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_ptr<storage::FileStreamReader> FileSystemBackend::CreateFileStreamReader(
34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 offset,
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int64 max_bytes_to_read,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Time& expected_modification_time,
34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemContext* context) const {
347a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DCHECK(url.is_valid());
348a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!IsAccessAllowed(url))
35003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return scoped_ptr<storage::FileStreamReader>();
351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  switch (url.type()) {
35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeDrive:
3540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return drive_delegate_->CreateFileStreamReader(
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          url, offset, max_bytes_to_read, expected_modification_time, context);
35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeProvided:
3570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return file_system_provider_delegate_->CreateFileStreamReader(
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          url, offset, max_bytes_to_read, expected_modification_time, context);
35903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeNativeLocal:
36003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeRestrictedNativeLocal:
36103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return scoped_ptr<storage::FileStreamReader>(
36203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          storage::FileStreamReader::CreateForFileSystemFile(
3630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch              context, url, offset, expected_modification_time));
36403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeDeviceMediaAsFileStorage:
3655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return mtp_delegate_->CreateFileStreamReader(
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          url, offset, max_bytes_to_read, expected_modification_time, context);
3670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    default:
3680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      NOTREACHED();
369a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
37003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return scoped_ptr<storage::FileStreamReader>();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_ptr<storage::FileStreamWriter> FileSystemBackend::CreateFileStreamWriter(
37403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 offset,
37603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemContext* context) const {
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(url.is_valid());
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!IsAccessAllowed(url))
38003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return scoped_ptr<storage::FileStreamWriter>();
381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  switch (url.type()) {
38303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeDrive:
3840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return drive_delegate_->CreateFileStreamWriter(url, offset, context);
38503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeProvided:
3860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return file_system_provider_delegate_->CreateFileStreamWriter(
3870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          url, offset, context);
38803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeNativeLocal:
38903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return scoped_ptr<storage::FileStreamWriter>(
39003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          storage::FileStreamWriter::CreateForLocalFile(
39103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              context->default_file_task_runner(),
39203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              url.path(),
39303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              offset,
39403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              storage::FileStreamWriter::OPEN_EXISTING_FILE));
39503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeRestrictedNativeLocal:
3960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      // Restricted native local file system is read only.
39703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return scoped_ptr<storage::FileStreamWriter>();
39803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case storage::kFileSystemTypeDeviceMediaAsFileStorage:
3995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return mtp_delegate_->CreateFileStreamWriter(url, offset, context);
4000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    default:
4010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      NOTREACHED();
4020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
40303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return scoped_ptr<storage::FileStreamWriter>();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool FileSystemBackend::GetVirtualPath(
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& filesystem_path,
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath* virtual_path) {
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return mount_points_->GetVirtualPath(filesystem_path, virtual_path) ||
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         system_mount_points_->GetVirtualPath(filesystem_path, virtual_path);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid FileSystemBackend::GetRedirectURLForContents(
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const storage::FileSystemURL& url,
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const storage::URLCallback& callback) {
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(url.is_valid());
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!IsAccessAllowed(url))
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return callback.Run(GURL());
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (url.type()) {
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case storage::kFileSystemTypeDrive:
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      drive_delegate_->GetRedirectURLForContents(url, callback);
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case storage::kFileSystemTypeProvided:
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      file_system_provider_delegate_->GetRedirectURLForContents(url,
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                                  callback);
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case storage::kFileSystemTypeDeviceMediaAsFileStorage:
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      mtp_delegate_->GetRedirectURLForContents(url, callback);
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case storage::kFileSystemTypeNativeLocal:
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case storage::kFileSystemTypeRestrictedNativeLocal:
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      callback.Run(GURL());
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NOTREACHED();
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  callback.Run(GURL());
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
443