diff options
author | Denis Shienkov <scapig@yandex.ru> | 2012-03-20 23:05:56 +0400 |
---|---|---|
committer | Denis Shienkov <scapig@yandex.ru> | 2012-03-22 19:56:39 +0100 |
commit | b9b5f979efffeedf9a7d541297c38f9d0c3db176 (patch) | |
tree | 25bb09d73109fa389eb4ecba51901c337fccac99 /src | |
parent | e00fe22173c6594bad9c35b16e5e552c9269e8d1 (diff) |
SerialPortInfo, MacOSX added support get VID/PID
Change-Id: I3c9f9e5a9fa4b14c955a65574e16ddb8d818852a
Reviewed-by: Denis Shienkov <scapig@yandex.ru>
Diffstat (limited to 'src')
-rw-r--r-- | src/serialportinfo_mac.cpp | 171 |
1 files changed, 109 insertions, 62 deletions
diff --git a/src/serialportinfo_mac.cpp b/src/serialportinfo_mac.cpp index 8071b70e..5087d338 100644 --- a/src/serialportinfo_mac.cpp +++ b/src/serialportinfo_mac.cpp @@ -28,7 +28,7 @@ QT_BEGIN_NAMESPACE_SERIALPORT /* Public methods */ // -enum { MATCHING_PROPERTIES_COUNT = 4 }; +enum { MATCHING_PROPERTIES_COUNT = 6 }; QList<SerialPortInfo> SerialPortInfo::availablePorts() { @@ -37,28 +37,30 @@ QList<SerialPortInfo> SerialPortInfo::availablePorts() int matchingPropertiesCounter = 0; - CFMutableDictionaryRef matching = IOServiceMatching(kIOSerialBSDServiceValue); + ::CFMutableDictionaryRef matching = ::IOServiceMatching(kIOSerialBSDServiceValue); - CFDictionaryAddValue(matching, - CFSTR(kIOSerialBSDTypeKey), - CFSTR(kIOSerialBSDAllTypes)); + ::CFDictionaryAddValue(matching, + CFSTR(kIOSerialBSDTypeKey), + CFSTR(kIOSerialBSDAllTypes)); io_iterator_t iter = 0; - kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, - matching, - &iter); + kern_return_t kr = ::IOServiceGetMatchingServices(kIOMasterPortDefault, + matching, + &iter); if (kr != kIOReturnSuccess) return ports; io_registry_entry_t service; - while ((service = IOIteratorNext(iter))) { + while ((service = ::IOIteratorNext(iter))) { - CFTypeRef device = 0; - CFTypeRef portName = 0; - CFTypeRef description = 0; - CFTypeRef manufacturer = 0; + ::CFTypeRef device = 0; + ::CFTypeRef portName = 0; + ::CFTypeRef description = 0; + ::CFTypeRef manufacturer = 0; + ::CFTypeRef vid = 0; + ::CFTypeRef pid = 0; io_registry_entry_t entry = service; @@ -67,65 +69,89 @@ QList<SerialPortInfo> SerialPortInfo::availablePorts() if (!device) { device = - IORegistryEntrySearchCFProperty(entry, - kIOServicePlane, - CFSTR(kIOCalloutDeviceKey), - kCFAllocatorDefault, - 0); + ::IORegistryEntrySearchCFProperty(entry, + kIOServicePlane, + CFSTR(kIOCalloutDeviceKey), + kCFAllocatorDefault, + 0); if (device) ++matchingPropertiesCounter; } if (!portName) { portName = - IORegistryEntrySearchCFProperty(entry, - kIOServicePlane, - CFSTR(kIOTTYDeviceKey), - kCFAllocatorDefault, - 0); + ::IORegistryEntrySearchCFProperty(entry, + kIOServicePlane, + CFSTR(kIOTTYDeviceKey), + kCFAllocatorDefault, + 0); if (portName) ++matchingPropertiesCounter; } if (!description) { description = - IORegistryEntrySearchCFProperty(entry, - kIOServicePlane, - CFSTR(kIOPropertyProductNameKey), - kCFAllocatorDefault, - 0); + ::IORegistryEntrySearchCFProperty(entry, + kIOServicePlane, + CFSTR(kIOPropertyProductNameKey), + kCFAllocatorDefault, + 0); if (!description) description = - IORegistryEntrySearchCFProperty(entry, - kIOServicePlane, - CFSTR(kUSBProductString), - kCFAllocatorDefault, - 0); + ::IORegistryEntrySearchCFProperty(entry, + kIOServicePlane, + CFSTR(kUSBProductString), + kCFAllocatorDefault, + 0); if (description) ++matchingPropertiesCounter; } if (!manufacturer) { manufacturer = - IORegistryEntrySearchCFProperty(entry, - kIOServicePlane, - CFSTR(kUSBVendorString), - kCFAllocatorDefault, - 0); + ::IORegistryEntrySearchCFProperty(entry, + kIOServicePlane, + CFSTR(kUSBVendorString), + kCFAllocatorDefault, + 0); if (manufacturer) ++matchingPropertiesCounter; } + if (!vid) { + vid = + ::IORegistryEntrySearchCFProperty(entry, + kIOServicePlane, + CFSTR(kUSBVendorID), + kCFAllocatorDefault, + 0); + if (vid) + ++matchingPropertiesCounter; + + } + + if (!pid) { + pid = + ::IORegistryEntrySearchCFProperty(entry, + kIOServicePlane, + CFSTR(kUSBProductID), + kCFAllocatorDefault, + 0); + if (pid) + ++matchingPropertiesCounter; + + } + // If all matching properties is found, then force break loop. if (matchingPropertiesCounter == MATCHING_PROPERTIES_COUNT) break; - kr = IORegistryEntryGetParentEntry(entry, kIOServicePlane, &entry); + kr = ::IORegistryEntryGetParentEntry(entry, kIOServicePlane, &entry); } while (kr == kIOReturnSuccess); - (void) IOObjectRelease(entry); + (void) ::IOObjectRelease(entry); // Convert from MacOSX-specific properties to Qt4-specific. if (matchingPropertiesCounter > 0) { @@ -134,56 +160,77 @@ QList<SerialPortInfo> SerialPortInfo::availablePorts() QByteArray buffer(MAXPATHLEN, 0); if (device) { - if (CFStringGetCString(CFStringRef(device), - buffer.data(), - buffer.size(), - kCFStringEncodingUTF8)) { + if (::CFStringGetCString(CFStringRef(device), + buffer.data(), + buffer.size(), + kCFStringEncodingUTF8)) { info.d_ptr->device = QString(buffer); } - CFRelease(device); + ::CFRelease(device); } if (portName) { - if (CFStringGetCString(CFStringRef(portName), - buffer.data(), - buffer.size(), - kCFStringEncodingUTF8)) { + if (::CFStringGetCString(CFStringRef(portName), + buffer.data(), + buffer.size(), + kCFStringEncodingUTF8)) { info.d_ptr->portName = QString(buffer); } - CFRelease(portName); + ::CFRelease(portName); } if (description) { - CFStringGetCString(CFStringRef(description), - buffer.data(), - buffer.size(), - kCFStringEncodingUTF8); + ::CFStringGetCString(CFStringRef(description), + buffer.data(), + buffer.size(), + kCFStringEncodingUTF8); info.d_ptr->description = QString(buffer); - CFRelease(description); + ::CFRelease(description); } if (manufacturer) { - CFStringGetCString(CFStringRef(manufacturer), - buffer.data(), - buffer.size(), - kCFStringEncodingUTF8); + ::CFStringGetCString(CFStringRef(manufacturer), + buffer.data(), + buffer.size(), + kCFStringEncodingUTF8); info.d_ptr->manufacturer = QString(buffer); - CFRelease(manufacturer); + ::CFRelease(manufacturer); + } + + + int value = 0; + + if (vid) { + ::CFNumberGetValue(CFNumberRef(vid), + kCFNumberIntType, + &value); + + info.d_ptr->vid = QString::number(value, 16); + ::CFRelease(vid); + } + + if (pid) { + ::CFNumberGetValue(CFNumberRef(pid), + kCFNumberIntType, + &value); + + info.d_ptr->pid = QString::number(value, 16); + ::CFRelease(pid); } ports.append(info); } - (void) IOObjectRelease(service); + (void) ::IOObjectRelease(service); } - (void) IOObjectRelease(iter); + (void) ::IOObjectRelease(iter); return ports; } |