| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "webkit/fileapi/external_mount_points.h" | 5 #include "webkit/fileapi/external_mount_points.h" |
| 6 | 6 |
| 7 #include "base/files/file_path.h" | 7 #include "base/files/file_path.h" |
| 8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
| 9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 return false; | 122 return false; |
| 123 | 123 |
| 124 instance_map_[mount_name] = new Instance(type, path, remote_proxy); | 124 instance_map_[mount_name] = new Instance(type, path, remote_proxy); |
| 125 if (!path.empty()) | 125 if (!path.empty()) |
| 126 path_to_name_map_.insert(std::make_pair(path, mount_name)); | 126 path_to_name_map_.insert(std::make_pair(path, mount_name)); |
| 127 return true; | 127 return true; |
| 128 } | 128 } |
| 129 | 129 |
| 130 bool ExternalMountPoints::HandlesFileSystemMountType( | 130 bool ExternalMountPoints::HandlesFileSystemMountType( |
| 131 FileSystemType type) const { | 131 FileSystemType type) const { |
| 132 return type == kFileSystemTypeExternal; | 132 return type == kFileSystemTypeExternal || |
| 133 type == kFileSystemTypeExternalFullPath; |
| 133 } | 134 } |
| 134 | 135 |
| 135 bool ExternalMountPoints::RevokeFileSystem(const std::string& mount_name) { | 136 bool ExternalMountPoints::RevokeFileSystem(const std::string& mount_name) { |
| 136 base::AutoLock locker(lock_); | 137 base::AutoLock locker(lock_); |
| 137 NameToInstance::iterator found = instance_map_.find(mount_name); | 138 NameToInstance::iterator found = instance_map_.find(mount_name); |
| 138 if (found == instance_map_.end()) | 139 if (found == instance_map_.end()) |
| 139 return false; | 140 return false; |
| 140 Instance* instance = found->second; | 141 Instance* instance = found->second; |
| 141 path_to_name_map_.erase(NormalizeFilePath(instance->path())); | 142 path_to_name_map_.erase(NormalizeFilePath(instance->path())); |
| 142 delete found->second; | 143 delete found->second; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 for (; component_iter != components.end(); ++component_iter) | 197 for (; component_iter != components.end(); ++component_iter) |
| 197 cracked_path = cracked_path.Append(*component_iter); | 198 cracked_path = cracked_path.Append(*component_iter); |
| 198 *path = cracked_path; | 199 *path = cracked_path; |
| 199 return true; | 200 return true; |
| 200 } | 201 } |
| 201 | 202 |
| 202 FileSystemURL ExternalMountPoints::CrackURL(const GURL& url) const { | 203 FileSystemURL ExternalMountPoints::CrackURL(const GURL& url) const { |
| 203 FileSystemURL filesystem_url = FileSystemURL(url); | 204 FileSystemURL filesystem_url = FileSystemURL(url); |
| 204 if (!filesystem_url.is_valid()) | 205 if (!filesystem_url.is_valid()) |
| 205 return FileSystemURL(); | 206 return FileSystemURL(); |
| 206 return CreateCrackedFileSystemURL(filesystem_url.origin(), | 207 return CrackFileSystemURL(filesystem_url); |
| 207 filesystem_url.mount_type(), | 208 } |
| 208 filesystem_url.path()); | 209 |
| 210 FileSystemURL ExternalMountPoints::CrackFileSystemURL( |
| 211 const FileSystemURL& url) const { |
| 212 if (!HandlesFileSystemMountType(url.type())) |
| 213 return FileSystemURL(); |
| 214 |
| 215 base::FilePath virtual_path = url.path(); |
| 216 if (url.type() == kFileSystemTypeExternalFullPath) { |
| 217 #if defined(OS_CHROMEOS) |
| 218 // On Chrome OS, find a mount point and virtual path for the external fs. |
| 219 if (!GetVirtualPath(url.path(), &virtual_path)) |
| 220 return FileSystemURL(); |
| 221 #else |
| 222 // On other OS, external path is simply a native local path. |
| 223 return FileSystemURL( |
| 224 url.origin(), url.mount_type(), url.virtual_path(), |
| 225 url.mount_filesystem_id(), kFileSystemTypeNativeLocal, |
| 226 url.path(), url.filesystem_id()); |
| 227 #endif |
| 228 } |
| 229 |
| 230 std::string mount_name; |
| 231 FileSystemType cracked_type; |
| 232 base::FilePath cracked_path; |
| 233 |
| 234 if (!CrackVirtualPath(virtual_path, &mount_name, &cracked_type, |
| 235 &cracked_path)) { |
| 236 return FileSystemURL(); |
| 237 } |
| 238 |
| 239 return FileSystemURL( |
| 240 url.origin(), url.mount_type(), url.virtual_path(), |
| 241 !url.filesystem_id().empty() ? url.filesystem_id() : mount_name, |
| 242 cracked_type, cracked_path, mount_name); |
| 209 } | 243 } |
| 210 | 244 |
| 211 FileSystemURL ExternalMountPoints::CreateCrackedFileSystemURL( | 245 FileSystemURL ExternalMountPoints::CreateCrackedFileSystemURL( |
| 212 const GURL& origin, | 246 const GURL& origin, |
| 213 FileSystemType type, | 247 FileSystemType type, |
| 214 const base::FilePath& path) const { | 248 const base::FilePath& path) const { |
| 215 if (!HandlesFileSystemMountType(type)) | 249 return CrackFileSystemURL(FileSystemURL(origin, type, path)); |
| 216 return FileSystemURL(); | |
| 217 | |
| 218 std::string mount_name; | |
| 219 FileSystemType cracked_type; | |
| 220 base::FilePath cracked_path; | |
| 221 if (!CrackVirtualPath(path, &mount_name, &cracked_type, &cracked_path)) | |
| 222 return FileSystemURL(); | |
| 223 | |
| 224 return FileSystemURL(origin, type, path, | |
| 225 mount_name, cracked_type, cracked_path); | |
| 226 } | 250 } |
| 227 | 251 |
| 228 RemoteFileSystemProxyInterface* ExternalMountPoints::GetRemoteFileSystemProxy( | 252 RemoteFileSystemProxyInterface* ExternalMountPoints::GetRemoteFileSystemProxy( |
| 229 const std::string& mount_name) const { | 253 const std::string& mount_name) const { |
| 230 base::AutoLock locker(lock_); | 254 base::AutoLock locker(lock_); |
| 231 NameToInstance::const_iterator found = instance_map_.find(mount_name); | 255 NameToInstance::const_iterator found = instance_map_.find(mount_name); |
| 232 if (found == instance_map_.end()) | 256 if (found == instance_map_.end()) |
| 233 return NULL; | 257 return NULL; |
| 234 return found->second->remote_proxy(); | 258 return found->second->remote_proxy(); |
| 235 } | 259 } |
| 236 | 260 |
| 237 void ExternalMountPoints::AddMountPointInfosTo( | 261 void ExternalMountPoints::AddMountPointInfosTo( |
| 238 std::vector<MountPointInfo>* mount_points) const { | 262 std::vector<MountPointInfo>* mount_points) const { |
| 239 base::AutoLock locker(lock_); | 263 base::AutoLock locker(lock_); |
| 240 DCHECK(mount_points); | 264 DCHECK(mount_points); |
| 241 for (NameToInstance::const_iterator iter = instance_map_.begin(); | 265 for (NameToInstance::const_iterator iter = instance_map_.begin(); |
| 242 iter != instance_map_.end(); ++iter) { | 266 iter != instance_map_.end(); ++iter) { |
| 243 mount_points->push_back(MountPointInfo(iter->first, iter->second->path())); | 267 mount_points->push_back(MountPointInfo(iter->first, iter->second->path())); |
| 244 } | 268 } |
| 245 } | 269 } |
| 246 | 270 |
| 247 bool ExternalMountPoints::GetVirtualPath(const base::FilePath& path_in, | 271 bool ExternalMountPoints::GetVirtualPath(const base::FilePath& path_in, |
| 248 base::FilePath* virtual_path) { | 272 base::FilePath* virtual_path) const { |
| 249 DCHECK(virtual_path); | 273 DCHECK(virtual_path); |
| 250 | 274 |
| 251 base::AutoLock locker(lock_); | 275 base::AutoLock locker(lock_); |
| 252 | 276 |
| 253 base::FilePath path = NormalizeFilePath(path_in); | 277 base::FilePath path = NormalizeFilePath(path_in); |
| 254 std::map<base::FilePath, std::string>::reverse_iterator iter( | 278 std::map<base::FilePath, std::string>::const_reverse_iterator iter( |
| 255 path_to_name_map_.upper_bound(path)); | 279 path_to_name_map_.upper_bound(path)); |
| 256 if (iter == path_to_name_map_.rend()) | 280 if (iter == path_to_name_map_.rend()) |
| 257 return false; | 281 return false; |
| 258 | 282 |
| 259 *virtual_path = CreateVirtualRootPath(iter->second); | 283 *virtual_path = CreateVirtualRootPath(iter->second); |
| 260 if (iter->first == path) | 284 if (iter->first == path) |
| 261 return true; | 285 return true; |
| 262 return iter->first.AppendRelativePath(path, virtual_path); | 286 return iter->first.AppendRelativePath(path, virtual_path); |
| 263 } | 287 } |
| 264 | 288 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 base::FilePath ScopedExternalFileSystem::GetVirtualRootPath() const { | 349 base::FilePath ScopedExternalFileSystem::GetVirtualRootPath() const { |
| 326 return ExternalMountPoints::GetSystemInstance()-> | 350 return ExternalMountPoints::GetSystemInstance()-> |
| 327 CreateVirtualRootPath(mount_name_); | 351 CreateVirtualRootPath(mount_name_); |
| 328 } | 352 } |
| 329 | 353 |
| 330 ScopedExternalFileSystem::~ScopedExternalFileSystem() { | 354 ScopedExternalFileSystem::~ScopedExternalFileSystem() { |
| 331 ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(mount_name_); | 355 ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(mount_name_); |
| 332 } | 356 } |
| 333 | 357 |
| 334 } // namespace fileapi | 358 } // namespace fileapi |
| OLD | NEW |