| Index: webkit/chromeos/fileapi/cros_mount_point_provider.cc
|
| diff --git a/webkit/chromeos/fileapi/cros_mount_point_provider.cc b/webkit/chromeos/fileapi/cros_mount_point_provider.cc
|
| index f61e3cc59c17f09ec5312b75983a13f94e153cd5..33bcbf16a963c378f7352d1d33ab3a4ab6025842 100644
|
| --- a/webkit/chromeos/fileapi/cros_mount_point_provider.cc
|
| +++ b/webkit/chromeos/fileapi/cros_mount_point_provider.cc
|
| @@ -8,7 +8,6 @@
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop.h"
|
| -#include "base/path_service.h"
|
| #include "base/stringprintf.h"
|
| #include "base/synchronization/lock.h"
|
| #include "base/utf_string_conversions.h"
|
| @@ -19,6 +18,7 @@
|
| #include "webkit/chromeos/fileapi/file_access_permissions.h"
|
| #include "webkit/chromeos/fileapi/remote_file_stream_writer.h"
|
| #include "webkit/chromeos/fileapi/remote_file_system_operation.h"
|
| +#include "webkit/fileapi/external_mount_points.h"
|
| #include "webkit/fileapi/file_system_file_stream_reader.h"
|
| #include "webkit/fileapi/file_system_operation_context.h"
|
| #include "webkit/fileapi/file_system_url.h"
|
| @@ -47,16 +47,14 @@ bool CrosMountPointProvider::CanHandleURL(const fileapi::FileSystemURL& url) {
|
| }
|
|
|
| CrosMountPointProvider::CrosMountPointProvider(
|
| - scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy)
|
| + scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy,
|
| + scoped_refptr<fileapi::ExternalMountPoints> mount_points,
|
| + fileapi::ExternalMountPoints* system_mount_points)
|
| : special_storage_policy_(special_storage_policy),
|
| file_access_permissions_(new FileAccessPermissions()),
|
| - local_file_util_(new fileapi::IsolatedFileUtil()) {
|
| - FilePath home_path;
|
| - if (PathService::Get(base::DIR_HOME, &home_path))
|
| - AddLocalMountPoint(home_path.AppendASCII("Downloads"));
|
| - AddLocalMountPoint(FilePath(FILE_PATH_LITERAL("/media/archive")));
|
| - AddLocalMountPoint(FilePath(FILE_PATH_LITERAL("/media/removable")));
|
| - AddRestrictedLocalMountPoint(FilePath(FILE_PATH_LITERAL("/usr/share/oem")));
|
| + local_file_util_(new fileapi::IsolatedFileUtil()),
|
| + mount_points_(mount_points),
|
| + system_mount_points_(system_mount_points) {
|
| }
|
|
|
| CrosMountPointProvider::~CrosMountPointProvider() {
|
| @@ -80,8 +78,11 @@ FilePath CrosMountPointProvider::GetFileSystemRootPathOnFileThread(
|
| return FilePath();
|
|
|
| FilePath root_path;
|
| - if (!isolated_context()->GetRegisteredPath(url.filesystem_id(), &root_path))
|
| + std::string mount_name = url.filesystem_id();
|
| + if (!mount_points_->GetRegisteredPath(mount_name, &root_path) &&
|
| + !system_mount_points_->GetRegisteredPath(mount_name, &root_path)) {
|
| return FilePath();
|
| + }
|
|
|
| return root_path.DirName();
|
| }
|
| @@ -128,56 +129,47 @@ void CrosMountPointProvider::DeleteFileSystem(
|
| callback.Run(base::PLATFORM_FILE_ERROR_INVALID_OPERATION);
|
| }
|
|
|
| -bool CrosMountPointProvider::HasMountPoint(const FilePath& mount_point) {
|
| +bool CrosMountPointProvider::HasMountPoint(const FilePath& mount_point) const {
|
| std::string mount_name = mount_point.BaseName().AsUTF8Unsafe();
|
| FilePath path;
|
| - const bool valid = isolated_context()->GetRegisteredPath(mount_name, &path);
|
| +
|
| + const bool valid = mount_points_->GetRegisteredPath(mount_name, &path);
|
| return valid && path == mount_point;
|
| }
|
|
|
| -void CrosMountPointProvider::AddLocalMountPoint(const FilePath& mount_point) {
|
| +bool CrosMountPointProvider::AddLocalMountPoint(const FilePath& mount_point) {
|
| std::string mount_name = mount_point.BaseName().AsUTF8Unsafe();
|
| - isolated_context()->RevokeFileSystem(mount_name);
|
| - isolated_context()->RegisterExternalFileSystem(
|
| - mount_name,
|
| - fileapi::kFileSystemTypeNativeLocal,
|
| - mount_point);
|
| - base::AutoLock locker(mount_point_map_lock_);
|
| - local_to_virtual_map_[mount_point] = mount_point.BaseName();
|
| + return mount_points_->RegisterFileSystem(
|
| + mount_name,
|
| + fileapi::kFileSystemTypeNativeLocal,
|
| + mount_point);
|
| }
|
|
|
| -void CrosMountPointProvider::AddRestrictedLocalMountPoint(
|
| +bool CrosMountPointProvider::AddRestrictedLocalMountPoint(
|
| const FilePath& mount_point) {
|
| std::string mount_name = mount_point.BaseName().AsUTF8Unsafe();
|
| - isolated_context()->RevokeFileSystem(mount_name);
|
| - isolated_context()->RegisterExternalFileSystem(
|
| - mount_name,
|
| - fileapi::kFileSystemTypeRestrictedNativeLocal,
|
| - mount_point);
|
| - base::AutoLock locker(mount_point_map_lock_);
|
| - local_to_virtual_map_[mount_point] = mount_point.BaseName();
|
| + return mount_points_->RegisterFileSystem(
|
| + mount_name,
|
| + fileapi::kFileSystemTypeRestrictedNativeLocal,
|
| + mount_point);
|
| }
|
|
|
| -void CrosMountPointProvider::AddRemoteMountPoint(
|
| +bool CrosMountPointProvider::AddRemoteMountPoint(
|
| const FilePath& mount_point,
|
| fileapi::RemoteFileSystemProxyInterface* remote_proxy) {
|
| DCHECK(remote_proxy);
|
| std::string mount_name = mount_point.BaseName().AsUTF8Unsafe();
|
| - isolated_context()->RevokeFileSystem(mount_name);
|
| - isolated_context()->RegisterExternalFileSystem(mount_name,
|
| + return mount_points_->RegisterRemoteFileSystem(mount_name,
|
| fileapi::kFileSystemTypeDrive,
|
| + remote_proxy,
|
| mount_point);
|
| - base::AutoLock locker(mount_point_map_lock_);
|
| - remote_proxy_map_[mount_name] = remote_proxy;
|
| - local_to_virtual_map_[mount_point] = mount_point.BaseName();
|
| }
|
|
|
| void CrosMountPointProvider::RemoveMountPoint(const FilePath& mount_point) {
|
| + if (!HasMountPoint(mount_point))
|
| + return;
|
| std::string mount_name = mount_point.BaseName().AsUTF8Unsafe();
|
| - isolated_context()->RevokeFileSystem(mount_name);
|
| - base::AutoLock locker(mount_point_map_lock_);
|
| - remote_proxy_map_.erase(mount_name);
|
| - local_to_virtual_map_.erase(mount_point);
|
| + mount_points_->RevokeFileSystem(mount_name);
|
| }
|
|
|
| void CrosMountPointProvider::GrantFullAccessToExtension(
|
| @@ -185,8 +177,11 @@ void CrosMountPointProvider::GrantFullAccessToExtension(
|
| DCHECK(special_storage_policy_->IsFileHandler(extension_id));
|
| if (!special_storage_policy_->IsFileHandler(extension_id))
|
| return;
|
| - std::vector<fileapi::IsolatedContext::FileInfo> files =
|
| - isolated_context()->GetExternalMountPoints();
|
| +
|
| + std::vector<fileapi::MountPoints::MountPointInfo> files;
|
| + mount_points_->AddMountPointInfosTo(&files);
|
| + system_mount_points_->AddMountPointInfosTo(&files);
|
| +
|
| for (size_t i = 0; i < files.size(); ++i) {
|
| file_access_permissions_->GrantAccessPermission(
|
| extension_id,
|
| @@ -204,7 +199,11 @@ void CrosMountPointProvider::GrantFileAccessToExtension(
|
| std::string id;
|
| fileapi::FileSystemType type;
|
| FilePath path;
|
| - isolated_context()->CrackIsolatedPath(virtual_path, &id, &type, &path);
|
| + if (!mount_points_->CrackVirtualPath(virtual_path, &id, &type, &path) &&
|
| + !system_mount_points_->CrackVirtualPath(virtual_path,
|
| + &id, &type, &path)) {
|
| + return;
|
| + }
|
|
|
| if (type == fileapi::kFileSystemTypeRestrictedNativeLocal) {
|
| LOG(ERROR) << "Can't grant access for restricted mount point";
|
| @@ -220,11 +219,13 @@ void CrosMountPointProvider::RevokeAccessForExtension(
|
| }
|
|
|
| std::vector<FilePath> CrosMountPointProvider::GetRootDirectories() const {
|
| - std::vector<fileapi::IsolatedContext::FileInfo> files =
|
| - isolated_context()->GetExternalMountPoints();
|
| + std::vector<fileapi::MountPoints::MountPointInfo> mount_points;
|
| + mount_points_->AddMountPointInfosTo(&mount_points);
|
| + system_mount_points_->AddMountPointInfosTo(&mount_points);
|
| +
|
| std::vector<FilePath> root_dirs;
|
| - for (size_t i = 0; i < files.size(); ++i)
|
| - root_dirs.push_back(files[i].path);
|
| + for (size_t i = 0; i < mount_points.size(); ++i)
|
| + root_dirs.push_back(mount_points[i].path);
|
| return root_dirs;
|
| }
|
|
|
| @@ -249,16 +250,16 @@ fileapi::FileSystemOperation* CrosMountPointProvider::CreateFileSystemOperation(
|
| const fileapi::FileSystemURL& url,
|
| fileapi::FileSystemContext* context,
|
| base::PlatformFileError* error_code) const {
|
| + DCHECK(url.is_valid());
|
| +
|
| if (url.type() == fileapi::kFileSystemTypeDrive) {
|
| - base::AutoLock locker(mount_point_map_lock_);
|
| - RemoteProxyMap::const_iterator found = remote_proxy_map_.find(
|
| - url.filesystem_id());
|
| - if (found != remote_proxy_map_.end()) {
|
| - return new chromeos::RemoteFileSystemOperation(found->second);
|
| - } else {
|
| + fileapi::RemoteFileSystemProxyInterface* remote_proxy =
|
| + GetRemoteProxy(url.filesystem_id());
|
| + if (!remote_proxy) {
|
| *error_code = base::PLATFORM_FILE_ERROR_NOT_FOUND;
|
| return NULL;
|
| }
|
| + return new chromeos::RemoteFileSystemOperation(remote_proxy);
|
| }
|
|
|
| DCHECK(url.type() == fileapi::kFileSystemTypeNativeLocal ||
|
| @@ -285,15 +286,14 @@ fileapi::FileStreamWriter* CrosMountPointProvider::CreateFileStreamWriter(
|
| const fileapi::FileSystemURL& url,
|
| int64 offset,
|
| fileapi::FileSystemContext* context) const {
|
| - if (!url.is_valid())
|
| - return NULL;
|
| + DCHECK(url.is_valid());
|
| +
|
| if (url.type() == fileapi::kFileSystemTypeDrive) {
|
| - base::AutoLock locker(mount_point_map_lock_);
|
| - RemoteProxyMap::const_iterator found = remote_proxy_map_.find(
|
| - url.filesystem_id());
|
| - if (found == remote_proxy_map_.end())
|
| + fileapi::RemoteFileSystemProxyInterface* remote_proxy =
|
| + GetRemoteProxy(url.filesystem_id());
|
| + if (!remote_proxy)
|
| return NULL;
|
| - return new fileapi::RemoteFileStreamWriter(found->second, url, offset);
|
| + return new fileapi::RemoteFileStreamWriter(remote_proxy, url, offset);
|
| }
|
|
|
| if (url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal)
|
| @@ -305,21 +305,17 @@ fileapi::FileStreamWriter* CrosMountPointProvider::CreateFileStreamWriter(
|
|
|
| bool CrosMountPointProvider::GetVirtualPath(const FilePath& filesystem_path,
|
| FilePath* virtual_path) {
|
| - base::AutoLock locker(mount_point_map_lock_);
|
| - std::map<FilePath, FilePath>::reverse_iterator iter(
|
| - local_to_virtual_map_.upper_bound(filesystem_path));
|
| - if (iter == local_to_virtual_map_.rend())
|
| - return false;
|
| - if (iter->first == filesystem_path) {
|
| - *virtual_path = iter->second;
|
| - return true;
|
| - }
|
| - return iter->first.DirName().AppendRelativePath(
|
| - filesystem_path, virtual_path);
|
| + return mount_points_->GetVirtualPath(filesystem_path, virtual_path) ||
|
| + system_mount_points_->GetVirtualPath(filesystem_path, virtual_path);
|
| }
|
|
|
| -fileapi::IsolatedContext* CrosMountPointProvider::isolated_context() const {
|
| - return fileapi::IsolatedContext::GetInstance();
|
| +fileapi::RemoteFileSystemProxyInterface* CrosMountPointProvider::GetRemoteProxy(
|
| + const std::string& mount_name) const {
|
| + fileapi::RemoteFileSystemProxyInterface* proxy =
|
| + mount_points_->GetRemoteFileSystemProxy(mount_name);
|
| + if (proxy)
|
| + return proxy;
|
| + return system_mount_points_->GetRemoteFileSystemProxy(mount_name);
|
| }
|
|
|
| } // namespace chromeos
|
|
|