summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2021-01-27 15:40:17 +0100
committerIvan Solovev <ivan.solovev@qt.io>2021-01-29 10:40:46 +0100
commit26b53660fc916c543759e7add964ab696582120a (patch)
tree98f3de6180609447a4a7b14362aa3031b4b496ab
parenta8496e8d52e261a5a9206c4963adf43f6083de9e (diff)
downloadqtlocation-26b53660fc916c543759e7add964ab696582120a.tar.gz
QtPositioning: reset errors properly
Calling startUpdates(), startMonitoring() or requestUpdate() on QGeoPositionInfoSource/QGeoSatelliteInfoSource/QGeoAreaMonitorSource subclasses effectively means starting a new work session, which means that we should not care about the previous errors. This patch resets the errors to Error::NoError in all subclasses when calling these methods. Task-number: QTBUG-90491 Change-Id: Ia9cf0345e8c672d47814d8d0a865cd23541af61a Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
-rw-r--r--examples/positioning/logfilepositionsource/logfilepositionsource.cpp2
-rw-r--r--src/plugins/position/android/src/qgeopositioninfosource_android.cpp21
-rw-r--r--src/plugins/position/android/src/qgeosatelliteinfosource_android.cpp4
-rw-r--r--src/plugins/position/corelocation/qgeopositioninfosource_cl.mm5
-rw-r--r--src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp16
-rw-r--r--src/plugins/position/geoclue/qgeosatelliteinfosource_geocluemaster.cpp10
-rw-r--r--src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp16
-rw-r--r--src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy.cpp6
-rw-r--r--src/plugins/position/positionpoll/qgeoareamonitor_polling.cpp5
-rw-r--r--src/plugins/position/positionpoll/qgeoareamonitor_polling.h2
-rw-r--r--src/plugins/position/serialnmea/qnmeasatelliteinfosource.cpp7
-rw-r--r--src/positioning/qgeoareamonitorsource.cpp9
-rw-r--r--src/positioning/qgeopositioninfosource.cpp9
-rw-r--r--src/positioning/qgeosatelliteinfosource.cpp11
-rw-r--r--src/positioning/qnmeapositioninfosource.cpp11
-rw-r--r--tests/auto/positionplugin/plugin.cpp2
-rw-r--r--tests/auto/qgeoareamonitor/logfilepositionsource.cpp2
17 files changed, 109 insertions, 29 deletions
diff --git a/examples/positioning/logfilepositionsource/logfilepositionsource.cpp b/examples/positioning/logfilepositionsource/logfilepositionsource.cpp
index 6c6c3180..31bb0cc3 100644
--- a/examples/positioning/logfilepositionsource/logfilepositionsource.cpp
+++ b/examples/positioning/logfilepositionsource/logfilepositionsource.cpp
@@ -80,6 +80,7 @@ int LogFilePositionSource::minimumUpdateInterval() const
void LogFilePositionSource::startUpdates()
{
+ lastError = QGeoPositionInfoSource::NoError;
int interval = updateInterval();
if (interval < minimumUpdateInterval())
interval = minimumUpdateInterval();
@@ -96,6 +97,7 @@ void LogFilePositionSource::requestUpdate(int /*timeout*/)
{
// For simplicity, ignore timeout - assume that if data is not available
// now, no data will be added to the file later
+ lastError = QGeoPositionInfoSource::NoError;
if (logFile->canReadLine()) {
readNextPosition();
} else {
diff --git a/src/plugins/position/android/src/qgeopositioninfosource_android.cpp b/src/plugins/position/android/src/qgeopositioninfosource_android.cpp
index 4bff1da6..1f071e33 100644
--- a/src/plugins/position/android/src/qgeopositioninfosource_android.cpp
+++ b/src/plugins/position/android/src/qgeopositioninfosource_android.cpp
@@ -119,12 +119,9 @@ QGeoPositionInfoSource::Error QGeoPositionInfoSourceAndroid::error() const
void QGeoPositionInfoSourceAndroid::setError(Error error)
{
- // qDebug() << "setError: " << error;
+ m_error = error;
if (error != QGeoPositionInfoSource::NoError)
- {
- m_error = error;
emit QGeoPositionInfoSource::errorOccurred(m_error);
- }
}
void QGeoPositionInfoSourceAndroid::startUpdates()
@@ -132,6 +129,8 @@ void QGeoPositionInfoSourceAndroid::startUpdates()
if (updatesRunning)
return;
+ m_error = QGeoPositionInfoSource::NoError;
+
if (preferredPositioningMethods() == 0) {
setError(UnknownSourceError);
return;
@@ -139,10 +138,10 @@ void QGeoPositionInfoSourceAndroid::startUpdates()
updatesRunning = true;
QGeoPositionInfoSource::Error error = AndroidPositioning::startUpdates(androidClassKeyForUpdate);
- if (error != QGeoPositionInfoSource::NoError)
+ if (error != QGeoPositionInfoSource::NoError) {
updatesRunning = false;
-
- setError(error);
+ setError(error);
+ }
}
void QGeoPositionInfoSourceAndroid::stopUpdates()
@@ -159,6 +158,8 @@ void QGeoPositionInfoSourceAndroid::requestUpdate(int timeout)
if (m_requestTimer.isActive())
return;
+ m_error = QGeoPositionInfoSource::NoError;
+
if (timeout != 0 && timeout < minimumUpdateInterval()) {
setError(QGeoPositionInfoSource::UpdateTimeoutError);
return;
@@ -176,10 +177,10 @@ void QGeoPositionInfoSourceAndroid::requestUpdate(int timeout)
return;
QGeoPositionInfoSource::Error error = AndroidPositioning::requestUpdate(androidClassKeyForSingleRequest);
- if (error != QGeoPositionInfoSource::NoError)
+ if (error != QGeoPositionInfoSource::NoError) {
m_requestTimer.stop();
-
- setError(error);
+ setError(error);
+ }
}
void QGeoPositionInfoSourceAndroid::processPositionUpdate(const QGeoPositionInfo &pInfo)
diff --git a/src/plugins/position/android/src/qgeosatelliteinfosource_android.cpp b/src/plugins/position/android/src/qgeosatelliteinfosource_android.cpp
index 65821bd8..efa634ee 100644
--- a/src/plugins/position/android/src/qgeosatelliteinfosource_android.cpp
+++ b/src/plugins/position/android/src/qgeosatelliteinfosource_android.cpp
@@ -105,6 +105,8 @@ void QGeoSatelliteInfoSourceAndroid::startUpdates()
updatesRunning = true;
+ m_error = QGeoSatelliteInfoSource::NoError;
+
QGeoSatelliteInfoSource::Error error = AndroidPositioning::startSatelliteUpdates(
androidClassKeyForUpdate, false, updateInterval());
if (error != QGeoSatelliteInfoSource::NoError) {
@@ -127,6 +129,8 @@ void QGeoSatelliteInfoSourceAndroid::requestUpdate(int timeout)
if (requestTimer.isActive())
return;
+ m_error = QGeoSatelliteInfoSource::NoError;
+
if (timeout != 0 && timeout < minimumUpdateInterval()) {
setError(QGeoSatelliteInfoSource::UpdateTimeoutError);
return;
diff --git a/src/plugins/position/corelocation/qgeopositioninfosource_cl.mm b/src/plugins/position/corelocation/qgeopositioninfosource_cl.mm
index a4d1753a..c7e02443 100644
--- a/src/plugins/position/corelocation/qgeopositioninfosource_cl.mm
+++ b/src/plugins/position/corelocation/qgeopositioninfosource_cl.mm
@@ -232,6 +232,7 @@ void QGeoPositionInfoSourceCL::setTimeoutInterval(int msec)
void QGeoPositionInfoSourceCL::startUpdates()
{
+ m_positionError = QGeoPositionInfoSource::NoError;
if (enableLocationManager()) {
#ifdef Q_OS_TVOS
[m_locationManager requestLocation]; // service will run long enough for one location update
@@ -258,6 +259,7 @@ void QGeoPositionInfoSourceCL::stopUpdates()
void QGeoPositionInfoSourceCL::requestUpdate(int timeout)
{
// Get a single update within timeframe
+ m_positionError = QGeoPositionInfoSource::NoError;
if (timeout < minimumUpdateInterval() && timeout != 0)
setError(QGeoPositionInfoSource::UpdateTimeoutError);
else if (enableLocationManager()) {
@@ -325,7 +327,8 @@ QGeoPositionInfoSource::Error QGeoPositionInfoSourceCL::error() const
void QGeoPositionInfoSourceCL::setError(QGeoPositionInfoSource::Error positionError)
{
m_positionError = positionError;
- emit QGeoPositionInfoSource::errorOccurred(positionError);
+ if (m_positionError != QGeoPositionInfoSource::NoError)
+ emit QGeoPositionInfoSource::errorOccurred(positionError);
}
QT_END_NAMESPACE
diff --git a/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp b/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp
index 8fbd0a78..ff7064e4 100644
--- a/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp
+++ b/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp
@@ -185,7 +185,8 @@ void QGeoPositionInfoSourceGeoclueMaster::velocityUpdateFailed()
void QGeoPositionInfoSourceGeoclueMaster::setError(QGeoPositionInfoSource::Error error)
{
m_error = error;
- emit errorOccurred(m_error);
+ if (m_error != QGeoPositionInfoSource::NoError)
+ emit errorOccurred(m_error);
}
void QGeoPositionInfoSourceGeoclueMaster::updateVelocity(VelocityFields fields, int timestamp,
@@ -282,6 +283,8 @@ void QGeoPositionInfoSourceGeoclueMaster::startUpdates()
return;
}
+ m_error = QGeoPositionInfoSource::NoError;
+
m_running = true;
qCDebug(lcPositioningGeoclue) << "starting updates";
@@ -334,15 +337,18 @@ void QGeoPositionInfoSourceGeoclueMaster::stopUpdates()
void QGeoPositionInfoSourceGeoclueMaster::requestUpdate(int timeout)
{
- if (timeout < minimumUpdateInterval() && timeout != 0) {
- setError(QGeoPositionInfoSource::UpdateTimeoutError);
- return;
- }
if (m_requestTimer.isActive()) {
qCDebug(lcPositioningGeoclue) << "request timer was active, ignoring startUpdates.";
return;
}
+ m_error = QGeoPositionInfoSource::NoError;
+
+ if (timeout < minimumUpdateInterval() && timeout != 0) {
+ setError(QGeoPositionInfoSource::UpdateTimeoutError);
+ return;
+ }
+
if (!m_master->hasMasterClient()) {
configurePositionSource();
setOptions();
diff --git a/src/plugins/position/geoclue/qgeosatelliteinfosource_geocluemaster.cpp b/src/plugins/position/geoclue/qgeosatelliteinfosource_geocluemaster.cpp
index 9986dd3b..80394ce6 100644
--- a/src/plugins/position/geoclue/qgeosatelliteinfosource_geocluemaster.cpp
+++ b/src/plugins/position/geoclue/qgeosatelliteinfosource_geocluemaster.cpp
@@ -90,6 +90,8 @@ void QGeoSatelliteInfoSourceGeoclueMaster::startUpdates()
if (m_running)
return;
+ m_error = QGeoSatelliteInfoSource::NoError;
+
m_running = true;
// Start Geoclue provider.
@@ -120,14 +122,16 @@ void QGeoSatelliteInfoSourceGeoclueMaster::stopUpdates()
void QGeoSatelliteInfoSourceGeoclueMaster::requestUpdate(int timeout)
{
+ if (m_requestTimer.isActive())
+ return;
+
+ m_error = QGeoSatelliteInfoSource::NoError;
+
if (timeout < minimumUpdateInterval() && timeout != 0) {
setError(QGeoSatelliteInfoSource::UpdateTimeoutError);
return;
}
- if (m_requestTimer.isActive())
- return;
-
if (!m_master->hasMasterClient())
configureSatelliteSource();
diff --git a/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp b/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp
index 622c074f..34a1a035 100644
--- a/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp
+++ b/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp
@@ -159,6 +159,9 @@ void QGeoPositionInfoSourceGeoclue2::startUpdates()
}
qCDebug(lcPositioningGeoclue2) << "Starting updates";
+
+ m_error = QGeoPositionInfoSource::NoError;
+
m_running = true;
startClient();
@@ -184,13 +187,15 @@ void QGeoPositionInfoSourceGeoclue2::stopUpdates()
void QGeoPositionInfoSourceGeoclue2::requestUpdate(int timeout)
{
- if (timeout < minimumUpdateInterval() && timeout != 0) {
- setError(QGeoPositionInfoSource::UpdateTimeoutError);
+ if (m_requestTimer->isActive()) {
+ qCDebug(lcPositioningGeoclue2) << "Request timer was active, ignoring startUpdates";
return;
}
- if (m_requestTimer->isActive()) {
- qCDebug(lcPositioningGeoclue2) << "Request timer was active, ignoring startUpdates";
+ m_error = QGeoPositionInfoSource::NoError;
+
+ if (timeout < minimumUpdateInterval() && timeout != 0) {
+ setError(QGeoPositionInfoSource::UpdateTimeoutError);
return;
}
@@ -201,7 +206,8 @@ void QGeoPositionInfoSourceGeoclue2::requestUpdate(int timeout)
void QGeoPositionInfoSourceGeoclue2::setError(QGeoPositionInfoSource::Error error)
{
m_error = error;
- emit QGeoPositionInfoSource::errorOccurred(m_error);
+ if (m_error != QGeoPositionInfoSource::NoError)
+ emit QGeoPositionInfoSource::errorOccurred(m_error);
}
void QGeoPositionInfoSourceGeoclue2::restoreLastPosition()
diff --git a/src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy.cpp b/src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy.cpp
index 6b1b430a..1c588916 100644
--- a/src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy.cpp
+++ b/src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy.cpp
@@ -298,6 +298,9 @@ void QGeoSatelliteInfoSourceGypsy::startUpdates()
{
if (m_updatesOngoing)
return;
+
+ m_error = QGeoSatelliteInfoSource::NoError;
+
// If there is a request timer ongoing, we've connected to the signal already
if (!m_requestTimer.isActive()) {
m_engine->eng_g_signal_connect (m_satellite, "satellites-changed",
@@ -322,6 +325,9 @@ void QGeoSatelliteInfoSourceGypsy::requestUpdate(int timeout)
{
if (m_requestOngoing)
return;
+
+ m_error = QGeoSatelliteInfoSource::NoError;
+
if (timeout < 0) {
setError(QGeoSatelliteInfoSource::UpdateTimeoutError);
return;
diff --git a/src/plugins/position/positionpoll/qgeoareamonitor_polling.cpp b/src/plugins/position/positionpoll/qgeoareamonitor_polling.cpp
index 0c2912f7..fbe26d63 100644
--- a/src/plugins/position/positionpoll/qgeoareamonitor_polling.cpp
+++ b/src/plugins/position/positionpoll/qgeoareamonitor_polling.cpp
@@ -321,7 +321,6 @@ QGeoAreaMonitorPolling::QGeoAreaMonitorPolling(QObject *parent)
: QGeoAreaMonitorSource(parent), signalsAreConnected(false)
{
d = pollingPrivate();
- lastError = QGeoAreaMonitorSource::NoError;
d->registerClient(this);
//hookup to default source if existing
if (!positionInfoSource())
@@ -362,6 +361,8 @@ bool QGeoAreaMonitorPolling::startMonitoring(const QGeoAreaMonitorInfo &monitor)
if (monitor.isPersistent())
return false;
+ lastError = QGeoAreaMonitorSource::NoError;
+
//update or insert
d->startMonitoring(monitor);
@@ -403,6 +404,8 @@ bool QGeoAreaMonitorPolling::requestUpdate(const QGeoAreaMonitorInfo &monitor, c
return false;
}
+ lastError = QGeoAreaMonitorSource::NoError;
+
d->requestUpdate(monitor, signalId);
return true;
diff --git a/src/plugins/position/positionpoll/qgeoareamonitor_polling.h b/src/plugins/position/positionpoll/qgeoareamonitor_polling.h
index 11161869..4690c333 100644
--- a/src/plugins/position/positionpoll/qgeoareamonitor_polling.h
+++ b/src/plugins/position/positionpoll/qgeoareamonitor_polling.h
@@ -83,7 +83,7 @@ private Q_SLOTS:
private:
QGeoAreaMonitorPollingPrivate* d;
- QGeoAreaMonitorSource::Error lastError;
+ QGeoAreaMonitorSource::Error lastError = QGeoAreaMonitorSource::NoError;
void connectNotify(const QMetaMethod &signal) override;
void disconnectNotify(const QMetaMethod &signal) override;
diff --git a/src/plugins/position/serialnmea/qnmeasatelliteinfosource.cpp b/src/plugins/position/serialnmea/qnmeasatelliteinfosource.cpp
index cb127218..c33eb146 100644
--- a/src/plugins/position/serialnmea/qnmeasatelliteinfosource.cpp
+++ b/src/plugins/position/serialnmea/qnmeasatelliteinfosource.cpp
@@ -272,6 +272,8 @@ void QNmeaSatelliteInfoSourcePrivate::startUpdates()
if (m_invokedStart)
return;
+ m_satelliteError = QGeoSatelliteInfoSource::NoError;
+
m_invokedStart = true;
m_pendingUpdate.clear();
m_noUpdateLastInterval = false;
@@ -320,6 +322,8 @@ void QNmeaSatelliteInfoSourcePrivate::requestUpdate(int msec)
if (m_requestTimer && m_requestTimer->isActive())
return;
+ m_satelliteError = QGeoSatelliteInfoSource::NoError;
+
if (msec <= 0 || msec < m_source->minimumUpdateInterval()) {
m_source->setError(QGeoSatelliteInfoSource::UpdateTimeoutError);
return;
@@ -549,7 +553,8 @@ void QNmeaSatelliteInfoSource::requestUpdate(int msec)
void QNmeaSatelliteInfoSource::setError(QGeoSatelliteInfoSource::Error satelliteError)
{
d->m_satelliteError = satelliteError;
- emit QGeoSatelliteInfoSource::errorOccurred(satelliteError);
+ if (d->m_satelliteError != QGeoSatelliteInfoSource::NoError)
+ emit QGeoSatelliteInfoSource::errorOccurred(satelliteError);
}
diff --git a/src/positioning/qgeoareamonitorsource.cpp b/src/positioning/qgeoareamonitorsource.cpp
index fd01a370..ab09c28e 100644
--- a/src/positioning/qgeoareamonitorsource.cpp
+++ b/src/positioning/qgeoareamonitorsource.cpp
@@ -117,6 +117,9 @@ public:
\fn virtual QGeoAreaMonitorSource::Error QGeoAreaMonitorSource::error() const
Returns the type of error that last occurred.
+
+ \note Since Qt6 the last error is always reset when calling
+ startMonitoring() or requestUpdate().
*/
/*!
@@ -276,6 +279,9 @@ void QGeoAreaMonitorSource::setPositionInfoSource(QGeoPositionInfoSource *newSou
Requesting persistent monitoring on a QGeoAreaMonitorSource instance fails if the area monitoring
backend doesn't support \l QGeoAreaMonitorSource::PersistentAreaMonitorFeature.
+ \note Since Qt6 this method always resets the last error to
+ \l {QGeoAreaMonitorSource::Error::}{NoError} before starting monitoring.
+
\sa stopMonitoring()
*/
@@ -310,6 +316,9 @@ void QGeoAreaMonitorSource::setPositionInfoSource(QGeoPositionInfoSource *newSou
If \a monitor was already registered via \l startMonitoring() it is converted to a single
shot behavior.
+ \note Since Qt6 this method always resets the last error to
+ \l {QGeoAreaMonitorSource::Error::}{NoError} before starting monitoring.
+
\sa startMonitoring(), stopMonitoring()
*/
diff --git a/src/positioning/qgeopositioninfosource.cpp b/src/positioning/qgeopositioninfosource.cpp
index 42e2bdae..bad15cec 100644
--- a/src/positioning/qgeopositioninfosource.cpp
+++ b/src/positioning/qgeopositioninfosource.cpp
@@ -509,6 +509,9 @@ QGeoPositionInfoSource::QGeoPositionInfoSource(QGeoPositionInfoSourcePrivate &dd
The \l {QGeoPositionInfoSource::Error::}{UpdateTimeoutError} error will not
be emitted again until after the periodic updates resume.
+ \note Since Qt6 this method always resets the last error to
+ \l {QGeoPositionInfoSource::Error::}{NoError} before starting the updates.
+
On iOS, starting from version 8, Core Location framework requires additional
entries in the application's Info.plist with keys NSLocationAlwaysUsageDescription or
NSLocationWhenInUseUsageDescription and a string to be displayed in the authorization prompt.
@@ -545,6 +548,10 @@ QGeoPositionInfoSource::QGeoPositionInfoSource(QGeoPositionInfoSourcePrivate &dd
If the source uses multiple positioning methods, it tries to get the
current position from the most accurate positioning method within the
given timeout.
+
+ \note Since Qt6 this method always resets the last error to
+ \l {QGeoPositionInfoSource::Error::}{NoError} before requesting
+ the position.
*/
/*!
@@ -552,6 +559,8 @@ QGeoPositionInfoSource::QGeoPositionInfoSource(QGeoPositionInfoSourcePrivate &dd
Returns the type of error that last occurred.
+ \note Since Qt6 the last error is always reset when calling startUpdates()
+ or requestUpdate().
*/
/*!
diff --git a/src/positioning/qgeosatelliteinfosource.cpp b/src/positioning/qgeosatelliteinfosource.cpp
index 02c81361..b3586395 100644
--- a/src/positioning/qgeosatelliteinfosource.cpp
+++ b/src/positioning/qgeosatelliteinfosource.cpp
@@ -314,6 +314,10 @@ QStringList QGeoSatelliteInfoSource::availableSources()
and satellitesInUseUpdated() signals may be emitted with
empty parameter lists.
+ \note Since Qt6 this method always resets the last error to
+ \l {QGeoSatelliteInfoSource::Error::}{NoError} before starting
+ the updates.
+
\sa satellitesInViewUpdated(), satellitesInUseUpdated()
*/
@@ -340,12 +344,19 @@ QStringList QGeoSatelliteInfoSource::availableSources()
This does nothing if another update request is in progress. However
it can be called even if startUpdates() has already been called and
regular updates are in progress.
+
+ \note Since Qt6 this method always resets the last error to
+ \l {QGeoSatelliteInfoSource::Error::}{NoError} before requesting
+ the satellite information.
*/
/*!
\fn QGeoSatelliteInfoSource::Error QGeoSatelliteInfoSource::error() const = 0
Returns the last error that occurred.
+
+ \note Since Qt6 the last error is always reset when calling startUpdates()
+ or requestUpdate().
*/
/*!
diff --git a/src/positioning/qnmeapositioninfosource.cpp b/src/positioning/qnmeapositioninfosource.cpp
index fa4dffd2..cb0e1543 100644
--- a/src/positioning/qnmeapositioninfosource.cpp
+++ b/src/positioning/qnmeapositioninfosource.cpp
@@ -573,13 +573,17 @@ void QNmeaPositionInfoSourcePrivate::startUpdates()
if (m_invokedStart)
return;
+ m_positionError = QGeoPositionInfoSource::NoError;
+
m_invokedStart = true;
m_pendingUpdate = QGeoPositionInfo();
m_noUpdateLastInterval = false;
bool initialized = initialize();
- if (!initialized)
+ if (!initialized) {
+ m_source->setError(QGeoPositionInfoSource::AccessError);
return;
+ }
if (m_updateMode == QNmeaPositionInfoSource::RealTimeMode) {
// skip over any buffered data - we only want the newest data.
@@ -619,6 +623,8 @@ void QNmeaPositionInfoSourcePrivate::requestUpdate(int msec)
if (m_requestTimer && m_requestTimer->isActive())
return;
+ m_positionError = QGeoPositionInfoSource::NoError;
+
if (msec <= 0 || msec < m_source->minimumUpdateInterval()) {
m_source->setError(QGeoPositionInfoSource::UpdateTimeoutError);
return;
@@ -955,7 +961,8 @@ QGeoPositionInfoSource::Error QNmeaPositionInfoSource::error() const
void QNmeaPositionInfoSource::setError(QGeoPositionInfoSource::Error positionError)
{
d->m_positionError = positionError;
- emit QGeoPositionInfoSource::errorOccurred(positionError);
+ if (d->m_positionError != QGeoPositionInfoSource::NoError)
+ emit QGeoPositionInfoSource::errorOccurred(positionError);
}
QT_END_NAMESPACE
diff --git a/tests/auto/positionplugin/plugin.cpp b/tests/auto/positionplugin/plugin.cpp
index 441bbf45..6e0b0b57 100644
--- a/tests/auto/positionplugin/plugin.cpp
+++ b/tests/auto/positionplugin/plugin.cpp
@@ -150,6 +150,7 @@ QGeoPositionInfoSource::PositioningMethods DummySource::supportedPositioningMeth
void DummySource::startUpdates()
{
+ lastError = QGeoPositionInfoSource::NoError;
timer->start();
}
@@ -160,6 +161,7 @@ void DummySource::stopUpdates()
void DummySource::requestUpdate(int timeout)
{
+ lastError = QGeoPositionInfoSource::NoError;
if (timeout == 0)
timeout = 5000;
if (timeout < 0)
diff --git a/tests/auto/qgeoareamonitor/logfilepositionsource.cpp b/tests/auto/qgeoareamonitor/logfilepositionsource.cpp
index 94c463a4..443afcba 100644
--- a/tests/auto/qgeoareamonitor/logfilepositionsource.cpp
+++ b/tests/auto/qgeoareamonitor/logfilepositionsource.cpp
@@ -60,6 +60,7 @@ int LogFilePositionSource::minimumUpdateInterval() const
void LogFilePositionSource::startUpdates()
{
+ lastError = QGeoPositionInfoSource::NoError;
int interval = updateInterval();
if (interval < minimumUpdateInterval())
interval = minimumUpdateInterval();
@@ -76,6 +77,7 @@ void LogFilePositionSource::requestUpdate(int /*timeout*/)
{
// For simplicity, ignore timeout - assume that if data is not available
// now, no data will be added to the file later
+ lastError = QGeoPositionInfoSource::NoError;
if (logFile->canReadLine()) {
readNextPosition();
} else {