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 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 std::string mount_name; | 237 std::string mount_name; |
238 FileSystemType cracked_type; | 238 FileSystemType cracked_type; |
239 base::FilePath cracked_path; | 239 base::FilePath cracked_path; |
240 if (!CrackVirtualPath(path, &mount_name, &cracked_type, &cracked_path)) | 240 if (!CrackVirtualPath(path, &mount_name, &cracked_type, &cracked_path)) |
241 return FileSystemURL(); | 241 return FileSystemURL(); |
242 | 242 |
243 return FileSystemURL(origin, type, path, | 243 return FileSystemURL(origin, type, path, |
244 mount_name, cracked_type, cracked_path); | 244 mount_name, cracked_type, cracked_path); |
245 } | 245 } |
246 | 246 |
247 RemoteFileSystemProxyInterface* ExternalMountPoints::GetRemoteFileSystemProxy( | 247 RemoteFileSystemProxyInterface* |
248 const std::string& mount_name) const { | 248 ExternalMountPoints::GetRemoteFileSystemProxyForPath( |
| 249 const base::FilePath& full_path) const { |
249 base::AutoLock locker(lock_); | 250 base::AutoLock locker(lock_); |
250 NameToInstance::const_iterator found = instance_map_.find(mount_name); | 251 |
| 252 std::string mount_point; |
| 253 if (!GetMountPointForPath(full_path, &mount_point, NULL)) |
| 254 return NULL; |
| 255 |
| 256 // Get mount point instance. |
| 257 NameToInstance::const_iterator found = instance_map_.find(mount_point); |
251 if (found == instance_map_.end()) | 258 if (found == instance_map_.end()) |
252 return NULL; | 259 return NULL; |
| 260 |
253 return found->second->remote_proxy(); | 261 return found->second->remote_proxy(); |
254 } | 262 } |
255 | 263 |
256 void ExternalMountPoints::AddMountPointInfosTo( | 264 void ExternalMountPoints::AddMountPointInfosTo( |
257 std::vector<MountPointInfo>* mount_points) const { | 265 std::vector<MountPointInfo>* mount_points) const { |
258 base::AutoLock locker(lock_); | 266 base::AutoLock locker(lock_); |
259 DCHECK(mount_points); | 267 DCHECK(mount_points); |
260 for (NameToInstance::const_iterator iter = instance_map_.begin(); | 268 for (NameToInstance::const_iterator iter = instance_map_.begin(); |
261 iter != instance_map_.end(); ++iter) { | 269 iter != instance_map_.end(); ++iter) { |
262 mount_points->push_back(MountPointInfo(iter->first, iter->second->path())); | 270 mount_points->push_back(MountPointInfo(iter->first, iter->second->path())); |
263 } | 271 } |
264 } | 272 } |
265 | 273 |
266 bool ExternalMountPoints::GetVirtualPath(const base::FilePath& path_in, | 274 bool ExternalMountPoints::GetVirtualPath(const base::FilePath& path, |
267 base::FilePath* virtual_path) { | 275 base::FilePath* virtual_path) { |
268 DCHECK(virtual_path); | 276 DCHECK(virtual_path); |
269 | 277 |
270 base::AutoLock locker(lock_); | 278 base::AutoLock locker(lock_); |
271 | 279 |
272 base::FilePath path = NormalizeFilePath(path_in); | 280 std::string mount_point_name; |
273 std::map<base::FilePath, std::string>::reverse_iterator iter( | 281 base::FilePath mount_point_root; |
274 path_to_name_map_.upper_bound(path)); | 282 if (!GetMountPointForPath(path, &mount_point_name, &mount_point_root)) |
275 if (iter == path_to_name_map_.rend()) | |
276 return false; | 283 return false; |
277 | 284 |
278 *virtual_path = CreateVirtualRootPath(iter->second); | 285 *virtual_path = CreateVirtualRootPath(mount_point_name); |
279 if (iter->first == path) | 286 if (mount_point_root == path) |
280 return true; | 287 return true; |
281 return iter->first.AppendRelativePath(path, virtual_path); | 288 return mount_point_root.AppendRelativePath(path, virtual_path); |
282 } | 289 } |
283 | 290 |
284 base::FilePath ExternalMountPoints::CreateVirtualRootPath( | 291 base::FilePath ExternalMountPoints::CreateVirtualRootPath( |
285 const std::string& mount_name) const { | 292 const std::string& mount_name) const { |
286 return base::FilePath().AppendASCII(mount_name); | 293 return base::FilePath().AppendASCII(mount_name); |
287 } | 294 } |
288 | 295 |
289 ExternalMountPoints::ExternalMountPoints() {} | 296 ExternalMountPoints::ExternalMountPoints() {} |
290 | 297 |
291 ExternalMountPoints::~ExternalMountPoints() { | 298 ExternalMountPoints::~ExternalMountPoints() { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 } | 332 } |
326 | 333 |
327 std::map<base::FilePath, std::string>::iterator potential_child = | 334 std::map<base::FilePath, std::string>::iterator potential_child = |
328 path_to_name_map_.upper_bound(path); | 335 path_to_name_map_.upper_bound(path); |
329 if (potential_child == path_to_name_map_.end()) | 336 if (potential_child == path_to_name_map_.end()) |
330 return true; | 337 return true; |
331 return !(potential_child->first == path) && | 338 return !(potential_child->first == path) && |
332 !path.IsParent(potential_child->first); | 339 !path.IsParent(potential_child->first); |
333 } | 340 } |
334 | 341 |
| 342 bool ExternalMountPoints::GetMountPointForPath( |
| 343 const base::FilePath& path, |
| 344 std::string* mount_point_name, |
| 345 base::FilePath* mount_point_root) const { |
| 346 DCHECK(mount_point_name); |
| 347 |
| 348 // Get mount point the path belongs to. It is the path whose value is smaller |
| 349 // than normalized path, but also parents the normalized_path. Note that |
| 350 // ExternalMountPoints are constrained so there cannot be a root path x for |
| 351 // which the following holds: root_path(path) < x < path. |
| 352 base::FilePath normalized_path = NormalizeFilePath(path); |
| 353 std::map<base::FilePath, std::string>::const_reverse_iterator iter( |
| 354 path_to_name_map_.upper_bound(normalized_path)); |
| 355 if (iter == path_to_name_map_.rend() || |
| 356 (iter->first != normalized_path && |
| 357 !iter->first.IsParent(normalized_path))) { |
| 358 return false; |
| 359 } |
| 360 |
| 361 *mount_point_name = iter->second; |
| 362 if (mount_point_root) |
| 363 *mount_point_root = iter->first; |
| 364 return true; |
| 365 } |
| 366 |
335 ScopedExternalFileSystem::ScopedExternalFileSystem( | 367 ScopedExternalFileSystem::ScopedExternalFileSystem( |
336 const std::string& mount_name, | 368 const std::string& mount_name, |
337 FileSystemType type, | 369 FileSystemType type, |
338 const base::FilePath& path) | 370 const base::FilePath& path) |
339 : mount_name_(mount_name) { | 371 : mount_name_(mount_name) { |
340 ExternalMountPoints::GetSystemInstance()->RegisterFileSystem( | 372 ExternalMountPoints::GetSystemInstance()->RegisterFileSystem( |
341 mount_name, type, path); | 373 mount_name, type, path); |
342 } | 374 } |
343 | 375 |
344 base::FilePath ScopedExternalFileSystem::GetVirtualRootPath() const { | 376 base::FilePath ScopedExternalFileSystem::GetVirtualRootPath() const { |
345 return ExternalMountPoints::GetSystemInstance()-> | 377 return ExternalMountPoints::GetSystemInstance()-> |
346 CreateVirtualRootPath(mount_name_); | 378 CreateVirtualRootPath(mount_name_); |
347 } | 379 } |
348 | 380 |
349 ScopedExternalFileSystem::~ScopedExternalFileSystem() { | 381 ScopedExternalFileSystem::~ScopedExternalFileSystem() { |
350 ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(mount_name_); | 382 ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(mount_name_); |
351 } | 383 } |
352 | 384 |
353 } // namespace fileapi | 385 } // namespace fileapi |
354 | 386 |
OLD | NEW |