Index: chrome/browser/chromeos/file_system_provider/service.cc |
diff --git a/chrome/browser/chromeos/file_system_provider/service.cc b/chrome/browser/chromeos/file_system_provider/service.cc |
index 9694296201e9a0091dbe10b30ba22bb9b0d0bab2..c989766f166c9add902e3a2614e5dde7a879fce8 100644 |
--- a/chrome/browser/chromeos/file_system_provider/service.cc |
+++ b/chrome/browser/chromeos/file_system_provider/service.cc |
@@ -43,7 +43,6 @@ Service::Service(Profile* profile, |
: profile_(profile), |
extension_registry_(extension_registry), |
file_system_factory_(base::Bind(CreateProvidedFileSystem)), |
- next_id_(1), |
weak_ptr_factory_(this) { |
extension_registry_->AddObserver(this); |
} |
@@ -53,7 +52,8 @@ Service::~Service() { |
ProvidedFileSystemMap::iterator it = file_system_map_.begin(); |
while (it != file_system_map_.end()) { |
- const int file_system_id = it->first; |
+ const std::string file_system_id = |
+ it->second->GetFileSystemInfo().file_system_id(); |
const std::string extension_id = |
it->second->GetFileSystemInfo().extension_id(); |
++it; |
@@ -85,10 +85,21 @@ void Service::SetFileSystemFactoryForTests( |
file_system_factory_ = factory_callback; |
} |
-int Service::MountFileSystem(const std::string& extension_id, |
- const std::string& file_system_name) { |
+bool Service::MountFileSystem(const std::string& extension_id, |
+ const std::string& file_system_id, |
+ const std::string& file_system_name) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ // If already exists a file system provided by the same extension with this |
+ // id, then abort. |
+ if (GetProvidedFileSystem(extension_id, file_system_id)) { |
+ FOR_EACH_OBSERVER(Observer, |
+ observers_, |
+ OnProvidedFileSystemMount(ProvidedFileSystemInfo(), |
+ base::File::FILE_ERROR_EXISTS)); |
+ return false; |
+ } |
+ |
// Restrict number of file systems to prevent system abusing. |
if (file_system_map_.size() + 1 > kMaxFileSystems) { |
FOR_EACH_OBSERVER( |
@@ -96,12 +107,9 @@ int Service::MountFileSystem(const std::string& extension_id, |
observers_, |
OnProvidedFileSystemMount(ProvidedFileSystemInfo(), |
base::File::FILE_ERROR_TOO_MANY_OPENED)); |
- return 0; |
+ return false; |
} |
- // The provided file system id is unique per service, so per profile. |
- int file_system_id = next_id_; |
- |
fileapi::ExternalMountPoints* const mount_points = |
fileapi::ExternalMountPoints::GetSystemInstance(); |
DCHECK(mount_points); |
@@ -121,7 +129,7 @@ int Service::MountFileSystem(const std::string& extension_id, |
observers_, |
OnProvidedFileSystemMount(ProvidedFileSystemInfo(), |
base::File::FILE_ERROR_INVALID_OPERATION)); |
- return 0; |
+ return false; |
} |
// Store the file system descriptor. Use the mount point name as the file |
@@ -139,27 +147,25 @@ int Service::MountFileSystem(const std::string& extension_id, |
ProvidedFileSystemInterface* file_system = |
file_system_factory_.Run(router, file_system_info); |
DCHECK(file_system); |
- file_system_map_[file_system_id] = file_system; |
- mount_point_name_to_id_map_[mount_point_name] = file_system_id; |
+ file_system_map_[FileSystemKey(extension_id, file_system_id)] = file_system; |
+ mount_point_name_to_key_map_[mount_point_name] = |
+ FileSystemKey(extension_id, file_system_id); |
FOR_EACH_OBSERVER( |
Observer, |
observers_, |
OnProvidedFileSystemMount(file_system_info, base::File::FILE_OK)); |
- next_id_++; |
- return file_system_id; |
+ return true; |
} |
bool Service::UnmountFileSystem(const std::string& extension_id, |
- int file_system_id) { |
+ const std::string& file_system_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
const ProvidedFileSystemMap::iterator file_system_it = |
- file_system_map_.find(file_system_id); |
- if (file_system_it == file_system_map_.end() || |
- file_system_it->second->GetFileSystemInfo().extension_id() != |
- extension_id) { |
+ file_system_map_.find(FileSystemKey(extension_id, file_system_id)); |
+ if (file_system_it == file_system_map_.end()) { |
const ProvidedFileSystemInfo empty_file_system_info; |
FOR_EACH_OBSERVER( |
Observer, |
@@ -192,7 +198,7 @@ bool Service::UnmountFileSystem(const std::string& extension_id, |
observers_, |
OnProvidedFileSystemUnmount(file_system_info, base::File::FILE_OK)); |
- mount_point_name_to_id_map_.erase(mount_point_name); |
+ mount_point_name_to_key_map_.erase(mount_point_name); |
delete file_system_it->second; |
file_system_map_.erase(file_system_it); |
@@ -200,11 +206,12 @@ bool Service::UnmountFileSystem(const std::string& extension_id, |
return true; |
} |
-bool Service::RequestUnmount(int file_system_id) { |
+bool Service::RequestUnmount(const std::string& extension_id, |
+ const std::string& file_system_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
ProvidedFileSystemMap::iterator file_system_it = |
- file_system_map_.find(file_system_id); |
+ file_system_map_.find(FileSystemKey(extension_id, file_system_id)); |
if (file_system_it == file_system_map_.end()) |
return false; |
@@ -229,16 +236,13 @@ std::vector<ProvidedFileSystemInfo> Service::GetProvidedFileSystemInfoList() { |
ProvidedFileSystemInterface* Service::GetProvidedFileSystem( |
const std::string& extension_id, |
- int file_system_id) { |
+ const std::string& file_system_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
const ProvidedFileSystemMap::const_iterator file_system_it = |
- file_system_map_.find(file_system_id); |
- if (file_system_it == file_system_map_.end() || |
- file_system_it->second->GetFileSystemInfo().extension_id() != |
- extension_id) { |
+ file_system_map_.find(FileSystemKey(extension_id, file_system_id)); |
+ if (file_system_it == file_system_map_.end()) |
return NULL; |
- } |
return file_system_it->second; |
} |
@@ -267,9 +271,9 @@ ProvidedFileSystemInterface* Service::GetProvidedFileSystem( |
const std::string& mount_point_name) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- const MountPointNameToIdMap::const_iterator mapping_it = |
- mount_point_name_to_id_map_.find(mount_point_name); |
- if (mapping_it == mount_point_name_to_id_map_.end()) |
+ const MountPointNameToKeyMap::const_iterator mapping_it = |
+ mount_point_name_to_key_map_.find(mount_point_name); |
+ if (mapping_it == mount_point_name_to_key_map_.end()) |
return NULL; |
const ProvidedFileSystemMap::const_iterator file_system_it = |