summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2014-07-02 16:52:09 +0400
committerDenis Shienkov <denis.shienkov@gmail.com>2014-07-09 13:48:17 +0200
commitc3460993440172f0f29fe2bc290c0b2f10d3de5a (patch)
tree2a8d10da6c7c3a61b72d5ed55c0a411af07e6093
parent86457b216171e4195ff1053b856bb9237d37e3f2 (diff)
Wrap of getting the port properties on Windows
It is reasonable to wrap implementation of getting properties of port from availablePorts() to the separate functions. It is simplifies a code and improves its understanding. Tested on Windows 7/8 with the on-board, virtual com0com, USB FTDI serial ports using Qt4 and then Qt5. Change-Id: I2345fa49b3633960412715b299e068daa8fdcfd0 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
-rw-r--r--src/serialport/qserialportinfo_win.cpp124
1 files changed, 74 insertions, 50 deletions
diff --git a/src/serialport/qserialportinfo_win.cpp b/src/serialport/qserialportinfo_win.cpp
index dd6a9075..dbef3141 100644
--- a/src/serialport/qserialportinfo_win.cpp
+++ b/src/serialport/qserialportinfo_win.cpp
@@ -204,7 +204,51 @@ private:
const QString &m_serialPortName;
};
-static QString deviceSerialNumber(const QString &instanceIdentifier)
+static QString deviceDescription(HDEVINFO deviceInfoSet,
+ PSP_DEVINFO_DATA deviceInfoData)
+{
+ return deviceRegistryProperty(deviceInfoSet, deviceInfoData, SPDRP_DEVICEDESC);
+}
+
+static QString deviceManufacturer(HDEVINFO deviceInfoSet,
+ PSP_DEVINFO_DATA deviceInfoData)
+{
+ return deviceRegistryProperty(deviceInfoSet, deviceInfoData, SPDRP_MFG);
+}
+
+static quint16 parseDeviceIdentifier(const QString &instanceIdentifier,
+ const QString &identifierPrefix,
+ int identifierSize, bool &ok)
+{
+ const int index = instanceIdentifier.indexOf(identifierPrefix);
+ if (index == -1)
+ return quint16(0);
+ return instanceIdentifier.mid(index + identifierPrefix.size(), identifierSize).toInt(&ok, 16);
+}
+
+static quint16 deviceVendorIdentifier(const QString &instanceIdentifier, bool &ok)
+{
+ static const int vendorIdentifierSize = 4;
+ quint16 result = parseDeviceIdentifier(
+ instanceIdentifier, QStringLiteral("VID_"), vendorIdentifierSize, ok);
+ if (!ok)
+ result = parseDeviceIdentifier(
+ instanceIdentifier, QStringLiteral("VEN_"), vendorIdentifierSize, ok);
+ return result;
+}
+
+static quint16 deviceProductIdentifier(const QString &instanceIdentifier, bool &ok)
+{
+ static const int productIdentifierSize = 4;
+ quint16 result = parseDeviceIdentifier(
+ instanceIdentifier, QStringLiteral("PID_"), productIdentifierSize, ok);
+ if (!ok)
+ result = parseDeviceIdentifier(
+ instanceIdentifier, QStringLiteral("DEV_"), productIdentifierSize, ok);
+ return result;
+}
+
+static QString parseDeviceSerialNumber(const QString &instanceIdentifier)
{
int firstbound = instanceIdentifier.lastIndexOf(QLatin1Char('\\'));
int lastbound = instanceIdentifier.indexOf(QLatin1Char('_'), firstbound);
@@ -226,16 +270,20 @@ static QString deviceSerialNumber(const QString &instanceIdentifier)
return instanceIdentifier.mid(firstbound + 1, lastbound - firstbound - 1);
}
-QList<QSerialPortInfo> QSerialPortInfo::availablePorts()
+static QString deviceSerialNumber(const QString &instanceIdentifier,
+ DEVINST deviceInstanceNumber)
{
- static const QString usbVendorIdentifierPrefix(QStringLiteral("VID_"));
- static const QString usbProductIdentifierPrefix(QStringLiteral("PID_"));
- static const QString pciVendorIdentifierPrefix(QStringLiteral("VEN_"));
- static const QString pciDeviceIdentifierPrefix(QStringLiteral("DEV_"));
-
- static const int vendorIdentifierSize = 4;
- static const int productIdentifierSize = 4;
+ QString result = parseDeviceSerialNumber(instanceIdentifier);
+ if (result.isEmpty()) {
+ const DEVINST parentNumber = parentDeviceInstanceNumber(deviceInstanceNumber);
+ const QString parentInstanceIdentifier = deviceInstanceIdentifier(parentNumber).toUpper();
+ result = parseDeviceSerialNumber(parentInstanceIdentifier);
+ }
+ return result;
+}
+QList<QSerialPortInfo> QSerialPortInfo::availablePorts()
+{
QList<QSerialPortInfo> serialPortInfoList;
foreach (const GuidFlagsPair &uniquePair, guidFlagsPairs()) {
@@ -249,54 +297,30 @@ QList<QSerialPortInfo> QSerialPortInfo::availablePorts()
DWORD index = 0;
while (::SetupDiEnumDeviceInfo(deviceInfoSet, index++, &deviceInfoData)) {
- QSerialPortInfo serialPortInfo;
-
- QString s = devicePortName(deviceInfoSet, &deviceInfoData);
- if (s.isEmpty() || s.contains(QStringLiteral("LPT")))
+ const QString portName = devicePortName(deviceInfoSet, &deviceInfoData);
+ if (portName.isEmpty() || portName.contains(QStringLiteral("LPT")))
continue;
if (std::find_if(serialPortInfoList.begin(), serialPortInfoList.end(),
- SerialPortNameEqualFunctor(s)) != serialPortInfoList.end()) {
+ SerialPortNameEqualFunctor(portName)) != serialPortInfoList.end()) {
continue;
}
- serialPortInfo.d_ptr->portName = s;
- serialPortInfo.d_ptr->device = QSerialPortPrivate::portNameToSystemLocation(s);
- serialPortInfo.d_ptr->description =
- deviceRegistryProperty(deviceInfoSet, &deviceInfoData, SPDRP_DEVICEDESC);
- serialPortInfo.d_ptr->manufacturer =
- deviceRegistryProperty(deviceInfoSet, &deviceInfoData, SPDRP_MFG);
-
- s = deviceInstanceIdentifier(deviceInfoData.DevInst).toUpper();
- QString serialNumber = deviceSerialNumber(s);
- if (serialNumber.isEmpty()) {
- const DEVINST parentDevNumber = parentDeviceInstanceNumber(deviceInfoData.DevInst);
- const QString parentDevIdentifier = deviceInstanceIdentifier(parentDevNumber).toUpper();
- serialNumber = deviceSerialNumber(parentDevIdentifier);
- }
- serialPortInfo.d_ptr->serialNumber = serialNumber;
-
- int index = s.indexOf(usbVendorIdentifierPrefix);
- if (index != -1) {
- serialPortInfo.d_ptr->vendorIdentifier = s.mid(index + usbVendorIdentifierPrefix.size(), vendorIdentifierSize)
- .toInt(&serialPortInfo.d_ptr->hasVendorIdentifier, 16);
- } else {
- index = s.indexOf(pciVendorIdentifierPrefix);
- if (index != -1)
- serialPortInfo.d_ptr->vendorIdentifier = s.mid(index + pciVendorIdentifierPrefix.size(), vendorIdentifierSize)
- .toInt(&serialPortInfo.d_ptr->hasVendorIdentifier, 16);
- }
+ QSerialPortInfo serialPortInfo;
- index = s.indexOf(usbProductIdentifierPrefix);
- if (index != -1) {
- serialPortInfo.d_ptr->productIdentifier = s.mid(index + usbProductIdentifierPrefix.size(), productIdentifierSize)
- .toInt(&serialPortInfo.d_ptr->hasProductIdentifier, 16);
- } else {
- index = s.indexOf(pciDeviceIdentifierPrefix);
- if (index != -1)
- serialPortInfo.d_ptr->productIdentifier = s.mid(index + pciDeviceIdentifierPrefix.size(), productIdentifierSize)
- .toInt(&serialPortInfo.d_ptr->hasProductIdentifier, 16);
- }
+ serialPortInfo.d_ptr->portName = portName;
+ serialPortInfo.d_ptr->device = QSerialPortPrivate::portNameToSystemLocation(portName);
+ serialPortInfo.d_ptr->description = deviceDescription(deviceInfoSet, &deviceInfoData);
+ serialPortInfo.d_ptr->manufacturer = deviceManufacturer(deviceInfoSet, &deviceInfoData);
+
+ const QString instanceIdentifier = deviceInstanceIdentifier(deviceInfoData.DevInst).toUpper();
+
+ serialPortInfo.d_ptr->serialNumber =
+ deviceSerialNumber(instanceIdentifier, deviceInfoData.DevInst);
+ serialPortInfo.d_ptr->vendorIdentifier =
+ deviceVendorIdentifier(instanceIdentifier, serialPortInfo.d_ptr->hasVendorIdentifier);
+ serialPortInfo.d_ptr->productIdentifier =
+ deviceProductIdentifier(instanceIdentifier, serialPortInfo.d_ptr->hasProductIdentifier);
serialPortInfoList.append(serialPortInfo);
}