Index: chrome/browser/chromeos/file_manager/volume_manager.cc |
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.cc b/chrome/browser/chromeos/file_manager/volume_manager.cc |
index d845faa68624fa8caf6d1cf23626c263d11a8009..5102eb8d7c59ed158962aae5b855e9f0385436ec 100644 |
--- a/chrome/browser/chromeos/file_manager/volume_manager.cc |
+++ b/chrome/browser/chromeos/file_manager/volume_manager.cc |
@@ -229,18 +229,42 @@ void VolumeManager::Initialize() { |
// Register 'Downloads' folder for the profile to the file system. |
if (!chromeos::ProfileHelper::IsSigninProfile(profile_)) { |
- bool success = RegisterDownloadsMountPoint( |
- profile_, |
- file_manager::util::GetDownloadsFolderForProfile(profile_)); |
+ const base::FilePath downloads = |
+ file_manager::util::GetDownloadsFolderForProfile(profile_); |
+ const bool success = RegisterDownloadsMountPoint(profile_, downloads); |
DCHECK(success); |
+ |
+ DoMountEvent(chromeos::MOUNT_ERROR_NONE, |
+ CreateDownloadsVolumeInfo(downloads), |
+ false /* is_remounting */); |
} |
// Subscribe to DriveIntegrationService. |
- if (drive_integration_service_) |
+ if (drive_integration_service_) { |
drive_integration_service_->AddObserver(this); |
+ if (drive_integration_service_->IsMounted()) { |
+ DoMountEvent( |
+ chromeos::MOUNT_ERROR_NONE, CreateDriveVolumeInfo(profile_), false); |
+ } |
+ } |
// Subscribe to DiskMountManager. |
disk_mount_manager_->AddObserver(this); |
+ |
+ const chromeos::disks::DiskMountManager::MountPointMap& mount_points = |
+ disk_mount_manager_->mount_points(); |
+ for (chromeos::disks::DiskMountManager::MountPointMap::const_iterator it = |
+ mount_points.begin(); |
+ it != mount_points.end(); |
+ ++it) { |
+ DoMountEvent( |
+ chromeos::MOUNT_ERROR_NONE, |
+ CreateVolumeInfoFromMountPointInfo( |
+ it->second, |
+ disk_mount_manager_->FindDiskBySourcePath(it->second.source_path)), |
+ false /* is_remounting */); |
+ } |
+ |
disk_mount_manager_->RequestMountInfoRefresh(); |
// Subscribe to Profile Preference change. |
@@ -283,39 +307,12 @@ std::vector<VolumeInfo> VolumeManager::GetVolumeInfoList() const { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
std::vector<VolumeInfo> result; |
- |
- // Adds "Drive" volume. |
- if (drive_integration_service_ && drive_integration_service_->IsMounted()) |
- result.push_back(CreateDriveVolumeInfo(profile_)); |
- |
- // Adds "Downloads". |
- // Usually, the path of the directory is where we registered in Initialize(), |
- // but in tests, the mount point may be overridden. To take it into account, |
- // here we explicitly retrieves the path from the file API mount points. |
- base::FilePath downloads; |
- if (FindDownloadsMountPointPath(profile_, &downloads)) |
- result.push_back(CreateDownloadsVolumeInfo(downloads)); |
- |
- // Adds disks (both removable disks and zip archives). |
- const chromeos::disks::DiskMountManager::MountPointMap& mount_points = |
- disk_mount_manager_->mount_points(); |
- for (chromeos::disks::DiskMountManager::MountPointMap::const_iterator it = |
- mount_points.begin(); |
- it != mount_points.end(); ++it) { |
- result.push_back(CreateVolumeInfoFromMountPointInfo( |
- it->second, |
- disk_mount_manager_->FindDiskBySourcePath(it->second.source_path))); |
+ for (std::map<std::string, VolumeInfo>::const_iterator iter = |
+ mounted_volumes_.begin(); |
+ iter != mounted_volumes_.end(); |
+ ++iter) { |
+ result.push_back(iter->second); |
} |
- |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnablePrivetStorage)) { |
- for (local_discovery::PrivetVolumeLister::VolumeList::const_iterator i = |
- privet_volume_lister_->volume_list().begin(); |
- i != privet_volume_lister_->volume_list().end(); i++) { |
- result.push_back(CreatePrivetVolumeInfo(*i)); |
- } |
- } |
- |
return result; |
} |
@@ -324,21 +321,30 @@ bool VolumeManager::FindVolumeInfoById(const std::string& volume_id, |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
DCHECK(result); |
- std::vector<VolumeInfo> info_list = GetVolumeInfoList(); |
- for (size_t i = 0; i < info_list.size(); ++i) { |
- if (info_list[i].volume_id == volume_id) { |
- *result = info_list[i]; |
- return true; |
- } |
- } |
- |
- return false; |
+ std::map<std::string, VolumeInfo>::const_iterator iter = |
+ mounted_volumes_.find(volume_id); |
+ if (iter == mounted_volumes_.end()) |
+ return false; |
+ *result = iter->second; |
+ return true; |
} |
bool VolumeManager::RegisterDownloadsDirectoryForTesting( |
const base::FilePath& path) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- return RegisterDownloadsMountPoint(profile_, path); |
+ |
+ base::FilePath old_path; |
+ if (FindDownloadsMountPointPath(profile_, &old_path)) { |
+ DoUnmountEvent(chromeos::MOUNT_ERROR_NONE, |
+ CreateDownloadsVolumeInfo(old_path)); |
+ } |
+ |
+ bool success = RegisterDownloadsMountPoint(profile_, path); |
+ DoMountEvent( |
+ success ? chromeos::MOUNT_ERROR_NONE : chromeos::MOUNT_ERROR_INVALID_PATH, |
+ CreateDownloadsVolumeInfo(path), |
+ false /* is_remounting */); |
+ return success; |
} |
void VolumeManager::OnFileSystemMounted() { |
@@ -348,19 +354,15 @@ void VolumeManager::OnFileSystemMounted() { |
// We can pass chromeos::MOUNT_ERROR_NONE even when authentication is failed |
// or network is unreachable. These two errors will be handled later. |
VolumeInfo volume_info = CreateDriveVolumeInfo(profile_); |
- FOR_EACH_OBSERVER(VolumeManagerObserver, observers_, |
- OnVolumeMounted(chromeos::MOUNT_ERROR_NONE, |
- volume_info, |
- false)); // Not remounting. |
+ DoMountEvent(chromeos::MOUNT_ERROR_NONE, volume_info, |
+ false /* is_remounting */); |
} |
void VolumeManager::OnFileSystemBeingUnmounted() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
VolumeInfo volume_info = CreateDriveVolumeInfo(profile_); |
- FOR_EACH_OBSERVER( |
- VolumeManagerObserver, observers_, |
- OnVolumeUnmounted(chromeos::MOUNT_ERROR_NONE, volume_info)); |
+ DoUnmountEvent(chromeos::MOUNT_ERROR_NONE, volume_info); |
} |
void VolumeManager::OnDiskEvent( |
@@ -477,14 +479,11 @@ void VolumeManager::OnMountEvent( |
case chromeos::disks::DiskMountManager::MOUNTING: { |
bool is_remounting = |
disk && mounted_disk_monitor_->DiskIsRemounting(*disk); |
- FOR_EACH_OBSERVER( |
- VolumeManagerObserver, observers_, |
- OnVolumeMounted(error_code, volume_info, is_remounting)); |
+ DoMountEvent(error_code, volume_info, is_remounting); |
return; |
} |
case chromeos::disks::DiskMountManager::UNMOUNTING: |
- FOR_EACH_OBSERVER(VolumeManagerObserver, observers_, |
- OnVolumeUnmounted(error_code, volume_info)); |
+ DoUnmountEvent(error_code, volume_info); |
return; |
} |
NOTREACHED(); |
@@ -550,11 +549,33 @@ void VolumeManager::OnPrivetVolumesAvailable( |
for (local_discovery::PrivetVolumeLister::VolumeList::const_iterator i = |
volumes.begin(); i != volumes.end(); i++) { |
VolumeInfo volume_info = CreatePrivetVolumeInfo(*i); |
- |
- FOR_EACH_OBSERVER( |
- VolumeManagerObserver, observers_, |
- OnVolumeMounted(chromeos::MOUNT_ERROR_NONE, volume_info, false)); |
+ DoMountEvent(chromeos::MOUNT_ERROR_NONE, volume_info, false); |
} |
} |
+void VolumeManager::DoMountEvent(chromeos::MountError error_code, |
+ const VolumeInfo& volume_info, |
+ bool is_remounting) { |
+ // TODO(kinaba): filter zip. |
+ |
+ if (error_code == chromeos::MOUNT_ERROR_NONE || volume_info.mount_condition) |
+ mounted_volumes_[volume_info.volume_id] = volume_info; |
+ |
+ FOR_EACH_OBSERVER(VolumeManagerObserver, |
+ observers_, |
+ OnVolumeMounted(error_code, volume_info, is_remounting)); |
+} |
+ |
+void VolumeManager::DoUnmountEvent(chromeos::MountError error_code, |
+ const VolumeInfo& volume_info) { |
+ if (mounted_volumes_.find(volume_info.volume_id) == mounted_volumes_.end()) |
+ return; |
+ if (error_code == chromeos::MOUNT_ERROR_NONE) |
+ mounted_volumes_.erase(volume_info.volume_id); |
+ |
+ FOR_EACH_OBSERVER(VolumeManagerObserver, |
+ observers_, |
+ OnVolumeUnmounted(error_code, volume_info)); |
+} |
+ |
} // namespace file_manager |