Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/common/extensions/image_writer/image_writer_util_mac.h" | |
| 6 | |
| 7 #include <IOKit/storage/IOStorageProtocolCharacteristics.h> | |
| 8 | |
| 9 #include "base/mac/foundation_util.h" | |
| 10 | |
| 11 namespace extensions { | |
| 12 namespace image_writer { | |
| 13 | |
| 14 bool IsRemovableDevice(CFDictionaryRef disk_description) { | |
| 15 CFBooleanRef internal = base::mac::GetValueFromDictionary<CFBooleanRef>( | |
| 16 disk_description, kDADiskDescriptionDeviceInternalKey); | |
| 17 CFStringRef protocol = base::mac::GetValueFromDictionary<CFStringRef>( | |
| 18 disk_description, kDADiskDescriptionDeviceProtocolKey); | |
| 19 CFStringRef io_reg_path = base::mac::GetValueFromDictionary<CFStringRef>( | |
| 20 disk_description, kDADiskDescriptionDevicePathKey); | |
| 21 CFBooleanRef ejectable = base::mac::GetValueFromDictionary<CFBooleanRef>( | |
| 22 disk_description, kDADiskDescriptionMediaEjectableKey); | |
| 23 CFBooleanRef removable = base::mac::GetValueFromDictionary<CFBooleanRef>( | |
| 24 disk_description, kDADiskDescriptionMediaRemovableKey); | |
| 25 CFBooleanRef whole = base::mac::GetValueFromDictionary<CFBooleanRef>( | |
| 26 disk_description, kDADiskDescriptionMediaWholeKey); | |
| 27 CFStringRef kind = base::mac::GetValueFromDictionary<CFStringRef>( | |
| 28 disk_description, kDADiskDescriptionMediaKindKey); | |
| 29 | |
| 30 // A drive is a USB stick iff: | |
| 31 // - it is not internal | |
| 32 // - it is attached to the USB bus | |
| 33 // - it is ejectable (because it will be ejected after written to) | |
| 34 // - it is removable | |
| 35 // - it is the whole drive (although the use of | |
| 36 // kDADiskDescriptionMatchMediaWhole should have ensured this) | |
| 37 // - it is of type IOMedia (external DVD drives and the like are IOCDMedia | |
| 38 // or | |
| 39 // IODVDMedia) | |
| 40 bool is_usb_stick = | |
| 41 !CFBooleanGetValue(internal) && | |
| 42 CFEqual(protocol, CFSTR(kIOPropertyPhysicalInterconnectTypeUSB)) && | |
|
Robert Sesek
2014/06/10 19:47:46
Maybe pull out line 42, 43, and 44 into its own bo
Drew Haven
2014/06/12 02:24:26
Done.
| |
| 43 CFBooleanGetValue(ejectable) && CFBooleanGetValue(removable) && | |
| 44 CFBooleanGetValue(whole) && | |
| 45 CFStringCompare(kind, CFSTR("IOMedia"), 0) == kCFCompareEqualTo; | |
| 46 | |
| 47 // A drive is an SD card iff: | |
| 48 // - it is attached to the USB bus | |
| 49 // - it is ejectable (because it will be ejected after written to) | |
| 50 // - it is removable | |
| 51 // - it is the whole drive (although the use of | |
| 52 // kDADiskDescriptionMatchMediaWhole should have ensured this) | |
| 53 // - it is of type IOMedia (external DVD drives and the like are IOCDMedia | |
| 54 // or | |
| 55 // IODVDMedia) | |
| 56 // - the IORegistry device path contains "AppleUSBCardReader" | |
| 57 bool is_sd_card = | |
| 58 CFEqual(protocol, CFSTR(kIOPropertyPhysicalInterconnectTypeUSB)) && | |
| 59 CFBooleanGetValue(ejectable) && CFBooleanGetValue(removable) && | |
| 60 CFBooleanGetValue(whole) && | |
| 61 CFStringCompare(kind, CFSTR("IOMedia"), 0) == kCFCompareEqualTo && | |
| 62 CFStringFind(io_reg_path, CFSTR("AppleUSBCardReader"), 0).location != | |
| 63 kCFNotFound; | |
| 64 | |
| 65 return is_usb_stick || is_sd_card; | |
| 66 } | |
| 67 | |
| 68 } // image_writer | |
| 69 } // extensions | |
| OLD | NEW |