summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron McCarthy <aaron.mccarthy@jollamobile.com>2013-11-19 14:57:24 +1000
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-11-19 12:49:07 +0100
commit7d3d2498ae79b96f53fd960532ae81bfedf088c1 (patch)
treee6df74abf99ea60b68b385ab4b491ff20cb43986
parent38452e70bbe93f361260c6f894237bbc8acb340d (diff)
downloadqtlocation-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.cpp42
-rw-r--r--src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster_p.h1
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,