Chromium Code Reviews| Index: chrome/browser/system_monitor/media_storage_util.cc |
| diff --git a/chrome/browser/system_monitor/media_storage_util.cc b/chrome/browser/system_monitor/media_storage_util.cc |
| index e4f69b4de0b6d93e40ecdea87e38a638317bb364..7c5570fcc4423472db0723180d7a52bb8b4d5a05 100644 |
| --- a/chrome/browser/system_monitor/media_storage_util.cc |
| +++ b/chrome/browser/system_monitor/media_storage_util.cc |
| @@ -34,12 +34,12 @@ |
| using base::SystemMonitor; |
| using content::BrowserThread; |
| +const char kRootPath[] = "/"; |
| + |
| namespace chrome { |
| namespace { |
| -typedef std::vector<SystemMonitor::RemovableStorageInfo> RemovableStorageInfo; |
| - |
| // MediaDeviceNotification.DeviceInfo histogram values. |
| enum DeviceInfoHistogramBuckets { |
| MASS_STORAGE_DEVICE_NAME_AND_UUID_AVAILABLE, |
| @@ -58,6 +58,7 @@ const char kRemovableMassStorageWithDCIMPrefix[] = "dcim:"; |
| const char kRemovableMassStorageNoDCIMPrefix[] = "nodcim:"; |
| const char kFixedMassStoragePrefix[] = "path:"; |
| const char kMtpPtpPrefix[] = "mtp:"; |
| +const char kMacImageCapture[] = "ic:"; |
| static bool (*g_test_get_device_info_from_path_function)( // NOLINT |
| const FilePath& path, std::string* device_id, string16* device_name, |
| @@ -70,11 +71,25 @@ void ValidatePathOnFileThread( |
| base::Bind(callback, file_util::PathExists(path))); |
| } |
| +bool IsRemovableStorageAttached(const std::string& id) { |
| + std::vector<SystemMonitor::RemovableStorageInfo> media_devices = |
| + SystemMonitor::Get()->GetAttachedRemovableStorage(); |
| + for (std::vector<SystemMonitor::RemovableStorageInfo>::const_iterator it = |
| + media_devices.begin(); |
| + it != media_devices.end(); |
| + ++it) { |
| + if (it->device_id == id) |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| FilePath::StringType FindRemovableStorageLocationById( |
| const std::string& device_id) { |
| - RemovableStorageInfo media_devices = |
| + std::vector<SystemMonitor::RemovableStorageInfo> media_devices = |
| SystemMonitor::Get()->GetAttachedRemovableStorage(); |
| - for (RemovableStorageInfo::const_iterator it = media_devices.begin(); |
| + for (std::vector<SystemMonitor::RemovableStorageInfo>::const_iterator it = |
| + media_devices.begin(); |
| it != media_devices.end(); |
| ++it) { |
| if (it->device_id == device_id) |
| @@ -103,10 +118,7 @@ void FilterAttachedDevicesOnFileThread(MediaStorageUtil::DeviceIdSet* devices) { |
| continue; |
| } |
| - DCHECK(type == MediaStorageUtil::MTP_OR_PTP || |
| - type == MediaStorageUtil::REMOVABLE_MASS_STORAGE_WITH_DCIM || |
| - type == MediaStorageUtil::REMOVABLE_MASS_STORAGE_NO_DCIM); |
| - if (FindRemovableStorageLocationById(*it).empty()) |
| + if (!IsRemovableStorageAttached(*it)) |
| missing_devices.insert(*it); |
| } |
| @@ -133,6 +145,8 @@ std::string MediaStorageUtil::MakeDeviceId(Type type, |
| return std::string(kFixedMassStoragePrefix) + unique_id; |
| case MTP_OR_PTP: |
| return std::string(kMtpPtpPrefix) + unique_id; |
| + case MAC_IMAGE_CAPTURE: |
| + return std::string(kMacImageCapture) + unique_id; |
| } |
| NOTREACHED(); |
| return std::string(); |
| @@ -154,6 +168,8 @@ bool MediaStorageUtil::CrackDeviceId(const std::string& device_id, |
| found_type = FIXED_MASS_STORAGE; |
| } else if (prefix == kMtpPtpPrefix) { |
| found_type = MTP_OR_PTP; |
| + } else if (prefix == kMacImageCapture) { |
| + found_type = MAC_IMAGE_CAPTURE; |
| } else { |
| NOTREACHED(); |
| return false; |
| @@ -170,7 +186,8 @@ bool MediaStorageUtil::CrackDeviceId(const std::string& device_id, |
| bool MediaStorageUtil::IsMediaDevice(const std::string& device_id) { |
| Type type; |
| return CrackDeviceId(device_id, &type, NULL) && |
| - (type == REMOVABLE_MASS_STORAGE_WITH_DCIM || type == MTP_OR_PTP); |
| + (type == REMOVABLE_MASS_STORAGE_WITH_DCIM || type == MTP_OR_PTP || |
| + type == MAC_IMAGE_CAPTURE); |
| } |
| // static |
| @@ -182,7 +199,23 @@ bool MediaStorageUtil::IsRemovableDevice(const std::string& device_id) { |
| // static |
| bool MediaStorageUtil::IsMassStorageDevice(const std::string& device_id) { |
| Type type; |
| - return CrackDeviceId(device_id, &type, NULL) && type != MTP_OR_PTP; |
| + return CrackDeviceId(device_id, &type, NULL) && |
| + (type == REMOVABLE_MASS_STORAGE_WITH_DCIM || |
| + type == REMOVABLE_MASS_STORAGE_NO_DCIM || |
| + type == FIXED_MASS_STORAGE); |
| +} |
| + |
| +// static |
| +bool MediaStorageUtil::CanCreateFileSystem(const std::string& device_id, |
| + const FilePath& path) { |
| + Type type; |
| + if (!CrackDeviceId(device_id, &type, NULL)) |
| + return false; |
| + |
| + if (type == MAC_IMAGE_CAPTURE) |
| + return true; |
| + |
| + return path.IsAbsolute() && !path.ReferencesParent(); |
| } |
| // static |
| @@ -206,7 +239,7 @@ void MediaStorageUtil::IsDeviceAttached(const std::string& device_id, |
| type == REMOVABLE_MASS_STORAGE_WITH_DCIM || |
| type == REMOVABLE_MASS_STORAGE_NO_DCIM); |
| // We should be able to find removable storage in SystemMonitor. |
| - callback.Run(!FindRemovableStorageLocationById(device_id).empty()); |
| + callback.Run(IsRemovableStorageAttached(device_id)); |
| } |
| } |
| @@ -310,6 +343,14 @@ FilePath MediaStorageUtil::FindDevicePathById(const std::string& device_id) { |
| return FilePath::FromUTF8Unsafe(unique_id); |
| } |
| + // For ImageCapture, the synthetic filesystem will be rooted at a fake |
| + // top-level directory which is the device_id. |
| + if (type == MAC_IMAGE_CAPTURE) { |
| +#if !defined(OS_WIN) |
| + return FilePath(kRootPath + device_id); |
|
Lei Zhang
2012/12/12 20:21:27
I think if you make kRootPath a FilePath::StringTy
Greg Billock
2012/12/12 21:12:18
Yeah, I was looking at that, and I think the devic
|
| +#endif |
| + } |
| + |
| DCHECK(type == MTP_OR_PTP || |
| type == REMOVABLE_MASS_STORAGE_WITH_DCIM || |
| type == REMOVABLE_MASS_STORAGE_NO_DCIM); |