diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2022-12-23 14:48:07 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-01-10 09:31:03 +0000 |
commit | 44c39530b83f466476720fcab9101697ef524a67 (patch) | |
tree | 48962e7dca899623c5cfa943fdf891db0afcdb8d | |
parent | 564be6021544e8fcbf7909d3a74655872e47e6f7 (diff) |
NMEA plugin: support builds without Qt::SerialPort
In Qt 6 we modified the NMEA plugin to take care not only about NMEA
data received via serial port, but also handle TCP connections and data
from local files.
This was done in order to use this plugin for testing and debugging
purposes.
However, the NMEA plugin was strictly depending on Qt::SerialPort, which
was not really necessary for the new data types.
Because of this dependency the plugin could not be used on iOS, because
the Qt::SerialPort in not built for this target.
This patch makes the dependency on Qt::SerialPort optional. If the
plugin is built without serial port support, and the user provides
parameters to access to serial port, a nullptr will be returned from
QGeoPositionInfoSourceFactory's methods, and a warning message will
be printed.
Fixes: QTBUG-107553
Change-Id: I6e8727491b08eaa29094666374bd86518e8ea5b5
Reviewed-by: Juha Vuolle <juha.vuolle@qt.io>
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
(cherry picked from commit e48beda0804dc03846758b91305669f4d4819fa3)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/plugins/position/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/plugins/position/nmea/CMakeLists.txt | 9 | ||||
-rw-r--r-- | src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.cpp | 32 |
3 files changed, 39 insertions, 4 deletions
diff --git a/src/plugins/position/CMakeLists.txt b/src/plugins/position/CMakeLists.txt index 9ec78b81..ce734539 100644 --- a/src/plugins/position/CMakeLists.txt +++ b/src/plugins/position/CMakeLists.txt @@ -19,6 +19,6 @@ endif() if(ANDROID) add_subdirectory(android) endif() -if(TARGET Qt::SerialPort AND TARGET Qt::Network) +if(TARGET Qt::Network) add_subdirectory(nmea) endif() diff --git a/src/plugins/position/nmea/CMakeLists.txt b/src/plugins/position/nmea/CMakeLists.txt index 120c5878..76a83db0 100644 --- a/src/plugins/position/nmea/CMakeLists.txt +++ b/src/plugins/position/nmea/CMakeLists.txt @@ -17,9 +17,16 @@ qt_internal_add_plugin(QGeoPositionInfoSourceFactoryNmeaPlugin LIBRARIES Qt::CorePrivate Qt::Positioning - Qt::SerialPort Qt::Network ) +qt_internal_extend_target(QGeoPositionInfoSourceFactoryNmeaPlugin + CONDITION (TARGET Qt::SerialPort) + LIBRARIES + Qt::SerialPort + DEFINES + QT_NMEA_PLUGIN_HAS_SERIALPORT +) + #### Keys ignored in scope 1:.:.:serialnmea.pro:<TRUE>: # OTHER_FILES = "plugin.json" diff --git a/src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.cpp b/src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.cpp index 9ff6cd85..bc38c8a7 100644 --- a/src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.cpp +++ b/src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.cpp @@ -4,8 +4,6 @@ #include "qgeopositioninfosourcefactory_nmea.h" #include <QtPositioning/QNmeaPositionInfoSource> #include <QtPositioning/QNmeaSatelliteInfoSource> -#include <QtSerialPort/QSerialPort> -#include <QtSerialPort/QSerialPortInfo> #include <QtNetwork/QTcpSocket> #include <QLoggingCategory> #include <QSet> @@ -14,6 +12,12 @@ #include <QSharedPointer> #include "qiopipe_p.h" +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT +# include <QtSerialPort/QSerialPort> +# include <QtSerialPort/QSerialPortInfo> +#endif + + Q_LOGGING_CATEGORY(lcNmea, "qt.positioning.nmea") QT_BEGIN_NAMESPACE @@ -22,6 +26,8 @@ static const auto sourceParameterName = QStringLiteral("nmea.source"); static const auto socketScheme = QStringLiteral("socket:"); static const auto serialScheme = QStringLiteral("serial:"); +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT + // This class is used only for SerialPort devices, because we can't open the // same serial port twice. // In case of files and sockets it's easier to explicitly create a QIODevice for @@ -95,6 +101,8 @@ private: Q_GLOBAL_STATIC(IODeviceContainer, deviceContainer) +#endif // QT_NMEA_PLUGIN_HAS_SERIALPORT + // We use a string prefix to distinguish between the different data sources. // "socket:" means that we use a socket connection // "serial:" means that we use a serial port connection @@ -145,8 +153,10 @@ NmeaSource::NmeaSource(QObject *parent, const QString &fileName) NmeaSource::~NmeaSource() { +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT if (deviceContainer.exists()) deviceContainer->releaseSerial(m_sourceName, m_dataSource); +#endif } void NmeaSource::onSocketError(QAbstractSocket::SocketError error) @@ -183,6 +193,7 @@ void NmeaSource::parseSourceParameter(const QString &source) } } +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT static QString tryFindSerialDevice(const QString &requestedPort) { QString portName; @@ -215,9 +226,11 @@ static QString tryFindSerialDevice(const QString &requestedPort) } return portName; } +#endif // QT_NMEA_PLUGIN_HAS_SERIALPORT void NmeaSource::addSerialDevice(const QString &requestedPort) { +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT m_sourceName = tryFindSerialDevice(requestedPort); if (m_sourceName.isEmpty()) return; @@ -227,6 +240,12 @@ void NmeaSource::addSerialDevice(const QString &requestedPort) return; setDevice(m_dataSource.data()); +#else + // As we are not calling setDevice(), the source will be invalid, so + // the factory methods will return nullptr. + qWarning() << "Plugin was built without serialport support!" + << requestedPort << "cannot be used!"; +#endif } void NmeaSource::setFileName(const QString &fileName) @@ -314,8 +333,10 @@ NmeaSatelliteSource::NmeaSatelliteSource(QObject *parent, const QString &fileNam NmeaSatelliteSource::~NmeaSatelliteSource() { +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT if (deviceContainer.exists()) deviceContainer->releaseSerial(m_sourceName, m_port); +#endif } void NmeaSatelliteSource::onSocketError(QAbstractSocket::SocketError error) @@ -360,6 +381,7 @@ void NmeaSatelliteSource::parseRealtimeSource(const QString &source) qWarning("nmea: incorrect socket parameters %s:%d", qPrintable(host), port); } } else { +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT // Last chance - this can be serial device. m_sourceName = tryFindSerialDevice(source); if (m_sourceName.isEmpty()) @@ -370,6 +392,12 @@ void NmeaSatelliteSource::parseRealtimeSource(const QString &source) return; setDevice(m_port.data()); +#else + // As we are not calling setDevice(), the source will be invalid, so + // the factory methods will return nullptr. + qWarning() << "Plugin was built without serialport support!" + << source << "cannot be used!"; +#endif // QT_NMEA_PLUGIN_HAS_SERIALPORT } } |