summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2022-12-23 14:48:07 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-01-10 09:31:03 +0000
commit44c39530b83f466476720fcab9101697ef524a67 (patch)
tree48962e7dca899623c5cfa943fdf891db0afcdb8d
parent564be6021544e8fcbf7909d3a74655872e47e6f7 (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.txt2
-rw-r--r--src/plugins/position/nmea/CMakeLists.txt9
-rw-r--r--src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.cpp32
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
}
}