diff options
Diffstat (limited to 'src')
14 files changed, 103 insertions, 29 deletions
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 |