From 26ea44e3b45de4a33515c826f6f5c9aa501f57fd Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Sun, 14 Feb 2016 17:46:11 +0300 Subject: Enumerate dial-in devices on OS X OS X divide serial ports into dialin (tty) and callout (cu) devices. QSPI did not return a list of dialin devices, that now has been fixed in this patch. Task-number: QTBUG-50895 Change-Id: I9f25b8f042ce1fdef9fd140896fc1d7093ee91a1 Reviewed-by: Sergey Belyashov Reviewed-by: Denis Shienkov --- src/serialport/qserialportinfo_osx.cpp | 38 ++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/serialport/qserialportinfo_osx.cpp b/src/serialport/qserialportinfo_osx.cpp index 4e73025..5a0cdd8 100644 --- a/src/serialport/qserialportinfo_osx.cpp +++ b/src/serialport/qserialportinfo_osx.cpp @@ -83,10 +83,10 @@ static quint16 searchShortIntProperty(io_registry_entry_t ioRegistryEntry, return value; } -static bool isCompleteInfo(const QSerialPortInfoPrivate &priv) +static bool isCompleteInfo(const QSerialPortInfoPrivate &priv, const QString &calloutDevice, const QString &dialinDevice) { - return !priv.portName.isEmpty() - && !priv.device.isEmpty() + return !calloutDevice.isEmpty() + && !dialinDevice.isEmpty() && !priv.manufacturer.isEmpty() && !priv.description.isEmpty() && !priv.serialNumber.isEmpty() @@ -94,11 +94,16 @@ static bool isCompleteInfo(const QSerialPortInfoPrivate &priv) && priv.hasVendorIdentifier; } -static QString deviceSystemLocation(io_registry_entry_t ioRegistryEntry) +static QString calloutDeviceSystemLocation(io_registry_entry_t ioRegistryEntry) { return searchStringProperty(ioRegistryEntry, QCFString(kIOCalloutDeviceKey)); } +static QString dialinDeviceSystemLocation(io_registry_entry_t ioRegistryEntry) +{ + return searchStringProperty(ioRegistryEntry, QCFString(kIODialinDeviceKey)); +} + static QString deviceDescription(io_registry_entry_t ioRegistryEntry) { QString result = searchStringProperty(ioRegistryEntry, QCFString(kIOPropertyProductNameKey)); @@ -162,12 +167,15 @@ QList QSerialPortInfo::availablePorts() QSerialPortInfoPrivate priv; + QString calloutDevice; + QString dialinDevice; + forever { - if (priv.device.isEmpty()) { - priv.device = deviceSystemLocation(serialPortService); - if (!priv.device.isEmpty()) - priv.portName = QSerialPortInfoPrivate::portNameFromSystemLocation(priv.device); - } + if (calloutDevice.isEmpty()) + calloutDevice = calloutDeviceSystemLocation(serialPortService); + + if (dialinDevice.isEmpty()) + dialinDevice = dialinDeviceSystemLocation(serialPortService); if (priv.description.isEmpty()) priv.description = deviceDescription(serialPortService); @@ -190,7 +198,7 @@ QList QSerialPortInfo::availablePorts() priv.hasProductIdentifier); } - if (isCompleteInfo(priv)) { + if (isCompleteInfo(priv, calloutDevice, dialinDevice)) { ::IOObjectRelease(serialPortService); break; } @@ -200,7 +208,15 @@ QList QSerialPortInfo::availablePorts() break; } - serialPortInfoList.append(priv); + QSerialPortInfoPrivate calloutCandidate = priv; + calloutCandidate.device = calloutDevice; + calloutCandidate.portName = QSerialPortInfoPrivate::portNameFromSystemLocation(calloutDevice); + serialPortInfoList.append(calloutCandidate); + + QSerialPortInfoPrivate dialinCandidate = priv; + dialinCandidate.device = dialinDevice; + dialinCandidate.portName = QSerialPortInfoPrivate::portNameFromSystemLocation(dialinDevice); + serialPortInfoList.append(dialinCandidate); } ::IOObjectRelease(serialPortIterator); -- cgit v1.2.1