diff options
author | Aaron McCarthy <aaron.mccarthy@jollamobile.com> | 2013-11-19 14:57:24 +1000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-11-19 12:49:07 +0100 |
commit | 7d3d2498ae79b96f53fd960532ae81bfedf088c1 (patch) | |
tree | e6df74abf99ea60b68b385ab4b491ff20cb43986 | |
parent | 38452e70bbe93f361260c6f894237bbc8acb340d (diff) | |
download | qtlocation-7d3d2498ae79b96f53fd960532ae81bfedf088c1.tar.gz |
Fix requesting single updates from Geoclue plugin.
Geoclue providers are expected to return a position update straight
away, otherwise the geoclue-master blocks when positioning is started.
This means that a position update with no longitude and latitude values
is not an error.
Change the Geoclue plugin to ignore these position updates, instead
waiting for the specified timeout before aborting.
Change-Id: I80b3c4cfdc31da78660f7435fdfac03963688c5a
Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
-rw-r--r-- | src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp | 42 | ||||
-rw-r--r-- | src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster_p.h | 1 |
2 files changed, 11 insertions, 32 deletions
diff --git a/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp b/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp index 1afd3250..e9124bcb 100644 --- a/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp +++ b/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp @@ -100,26 +100,17 @@ static void velocity_changed (GeoclueVelocity *velocity, } // Callback for single async update -static void position_callback (GeocluePosition *pos, - GeocluePositionFields fields, - int timestamp, - double latitude, - double longitude, - double altitude, - GeoclueAccuracy *accuracy, - GError *error, - gpointer userdata) +static void position_callback (GeocluePosition *pos, GeocluePositionFields fields, int timestamp, + double latitude, double longitude, double altitude, + GeoclueAccuracy *accuracy, GError *error, gpointer userdata) { Q_UNUSED(pos); Q_UNUSED(accuracy); if (error) - g_error_free (error); - if (!(fields & GEOCLUE_POSITION_FIELDS_LATITUDE && - fields & GEOCLUE_POSITION_FIELDS_LONGITUDE)) { - static_cast<QGeoPositionInfoSourceGeoclueMaster *>(userdata)->singleUpdateFailed(); + g_error_free(error); - } else { + if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE && fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) { static_cast<QGeoPositionInfoSourceGeoclueMaster *>(userdata)->singleUpdateSucceeded( fields, timestamp, latitude, longitude, altitude, accuracy); } @@ -185,23 +176,6 @@ void QGeoPositionInfoSourceGeoclueMaster::velocityUpdateSucceeded(double speed) m_lastVelocityIsFresh = true; } -void QGeoPositionInfoSourceGeoclueMaster::singleUpdateFailed() -{ -#ifdef Q_LOCATION_GEOCLUE_DEBUG - qDebug() << "QGeoPositionInfoSourceGeoclueMaster single update failed (requestUpdate)"; -#endif - if (m_requestTimer.isActive()) - m_requestTimer.stop(); - // Send timeout even if time wasn't up yet, because we are not trying again - emit updateTimeout(); - - // Only stop positioning if regular updates not active. - if (!m_running) { - cleanupPositionSource(); - releaseMasterClient(); - } -} - void QGeoPositionInfoSourceGeoclueMaster::singleUpdateSucceeded(GeocluePositionFields fields, int timestamp, double latitude, @@ -440,6 +414,12 @@ void QGeoPositionInfoSourceGeoclueMaster::requestUpdateTimeout() #endif // If we end up here, there has not been valid position update. emit updateTimeout(); + + // Only stop positioning if regular updates not active. + if (!m_running) { + cleanupPositionSource(); + releaseMasterClient(); + } } void QGeoPositionInfoSourceGeoclueMaster::startUpdatesTimeout() diff --git a/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster_p.h b/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster_p.h index 9c24f87f..4ddf6603 100644 --- a/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster_p.h +++ b/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster_p.h @@ -80,7 +80,6 @@ public: int minimumUpdateInterval() const; bool init(); - void singleUpdateFailed(); void singleUpdateSucceeded(GeocluePositionFields fields, int timestamp, double latitude, |