diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2016-02-14 17:01:12 +0000 |
---|---|---|
committer | Denis Shienkov <denis.shienkov@gmail.com> | 2016-02-15 14:31:43 +0000 |
commit | c32a064349ddce1149afd8c524ac43f30cdddc80 (patch) | |
tree | fdd04b5109ba9dcf55ed1f59fb4c960ec777bacd | |
parent | d516687a45954999255e4c4b26c55675e2efc376 (diff) | |
download | qtserialport-c32a064349ddce1149afd8c524ac43f30cdddc80.tar.gz |
Enumerate dial-in devices on FreeBSD
BSD-like systems divide serial ports into dial-in (tty) and dial-out
(cua) devices. QSPI did not return a list of dial-in devices, that now
has been fixed in this patch.
Change-Id: I593719429e3b6641012eb046851dd08b9dc829fb
Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
-rw-r--r-- | src/serialport/qserialportinfo_freebsd.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/src/serialport/qserialportinfo_freebsd.cpp b/src/serialport/qserialportinfo_freebsd.cpp index e65f09c..49612f1 100644 --- a/src/serialport/qserialportinfo_freebsd.cpp +++ b/src/serialport/qserialportinfo_freebsd.cpp @@ -47,13 +47,13 @@ QT_BEGIN_NAMESPACE -static QString deviceProperty(const QString &pnpinfo, const QByteArray &pattern) +static QString deviceProperty(const QString &source, const QByteArray &pattern) { - const int firstbound = pnpinfo.indexOf(QLatin1String(pattern)); + const int firstbound = source.indexOf(QLatin1String(pattern)); if (firstbound == -1) return QString(); - const int lastbound = pnpinfo.indexOf(QLatin1Char(' '), firstbound); - return pnpinfo.mid(firstbound + pattern.size(), lastbound - firstbound - pattern.size()); + const int lastbound = source.indexOf(QLatin1Char(' '), firstbound); + return source.mid(firstbound + pattern.size(), lastbound - firstbound - pattern.size()); } static QString deviceName(const QString &pnpinfo) @@ -202,8 +202,8 @@ static QList<NodeInfo> enumerateDesiredNodes(const QVector<int> &mib) const NodeInfo node = nodeForOid(nextoid); if (!node.name.isEmpty()) { - if (node.name.endsWith("\%desc") - || node.name.endsWith("\%pnpinfo")) { + if (node.name.endsWith(QLatin1String("\%desc")) + || node.name.endsWith(QLatin1String("\%pnpinfo"))) { nodes.append(node); } } @@ -228,10 +228,11 @@ QList<QSerialPortInfo> QSerialPortInfo::availablePorts() if (!(deviceDir.exists() && deviceDir.isReadable())) return QList<QSerialPortInfo>(); - deviceDir.setNameFilters(QStringList() << QLatin1String("cua*")); + deviceDir.setNameFilters(QStringList() << QLatin1String("cua*") << QLatin1String("tty*")); deviceDir.setFilter(QDir::Files | QDir::System | QDir::NoSymLinks); - QList<QSerialPortInfo> serialPortInfoList; + QList<QSerialPortInfo> cuaCandidates; + QList<QSerialPortInfo> ttyCandidates; foreach (const QString &portName, deviceDir.entryList()) { if (portName.endsWith(QLatin1String(".init")) @@ -304,7 +305,26 @@ QList<QSerialPortInfo> QSerialPortInfo::availablePorts() break; } - serialPortInfoList.append(priv); + if (portName.startsWith(QLatin1String("cua"))) + cuaCandidates.append(priv); + else if (portName.startsWith(QLatin1String("tty"))) + ttyCandidates.append(priv); + } + + QList<QSerialPortInfo> serialPortInfoList; + + foreach (const QSerialPortInfo &cuaCandidate, cuaCandidates) { + const QString cuaPortName = cuaCandidate.portName(); + const QString cuaToken = deviceProperty(cuaPortName, "cua"); + foreach (const QSerialPortInfo &ttyCandidate, ttyCandidates) { + const QString ttyPortName = ttyCandidate.portName(); + const QString ttyToken = deviceProperty(ttyPortName, "tty"); + if (cuaToken != ttyToken) + continue; + + serialPortInfoList.append(cuaCandidate); + serialPortInfoList.append(ttyCandidate); + } } return serialPortInfoList; |