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