summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver Wolff <oliver.wolff@qt.io>2017-04-21 12:34:05 +0200
committerOliver Wolff <oliver.wolff@qt.io>2017-04-24 12:50:00 +0000
commit3d43b398bc09319ba63afd45429c252b6d40b093 (patch)
treedc889ca7dcc172ded3c786d6e862350ca2eba3d7
parentc2691cf479c88ba0f74492195912cd9b62ce4e62 (diff)
downloadqtlocation-3d43b398bc09319ba63afd45429c252b6d40b093.tar.gz
winrt: Add error handling for GeoPositionInfoSource creation
If something goes wrong while creating the source, the factory should return a nullptr (same as in QGeoPositionInfoSourceFactoryGipsy). One such error might be, that access to location is denied on first application start. Task-number: QTBUG-60299 Change-Id: I50e87895a74bcff856aa29a195762a83466bc5b9 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
-rw-r--r--src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp26
-rw-r--r--src/plugins/position/winrt/qgeopositioninfosource_winrt_p.h1
-rw-r--r--src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.cpp7
3 files changed, 26 insertions, 8 deletions
diff --git a/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp b/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp
index 32a20a16..87e350dd 100644
--- a/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp
+++ b/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp
@@ -97,8 +97,19 @@ QGeoPositionInfoSourceWinRT::QGeoPositionInfoSourceWinRT(QObject *parent)
d->updatesOngoing = false;
qRegisterMetaType<QGeoPositionInfo>();
+}
+
+QGeoPositionInfoSourceWinRT::~QGeoPositionInfoSourceWinRT()
+{
+}
- requestAccess();
+int QGeoPositionInfoSourceWinRT::init()
+{
+ Q_D(QGeoPositionInfoSourceWinRT);
+ if (!requestAccess()) {
+ qWarning ("Location access failed.");
+ return -1;
+ }
HRESULT hr = QEventDispatcherWinRT::runOnXamlThread([this, d]() {
HRESULT hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Devices_Geolocation_Geolocator).Get(),
&d->locator);
@@ -114,13 +125,17 @@ QGeoPositionInfoSourceWinRT::QGeoPositionInfoSourceWinRT(QObject *parent)
return hr;
});
- Q_ASSERT_SUCCEEDED(hr);
+ if (FAILED(hr)) {
+ setError(QGeoPositionInfoSource::UnknownSourceError);
+ qErrnoWarning(hr, "Could not register status changed callback");
+ return -1;
+ }
hr = d->locator->put_DesiredAccuracy(PositionAccuracy::PositionAccuracy_Default);
if (FAILED(hr)) {
setError(QGeoPositionInfoSource::UnknownSourceError);
qErrnoWarning(hr, "Could not initialize desired accuracy.");
- return;
+ return -1;
}
d->positionToken.value = 0;
@@ -135,10 +150,7 @@ QGeoPositionInfoSourceWinRT::QGeoPositionInfoSourceWinRT(QObject *parent)
setPreferredPositioningMethods(QGeoPositionInfoSource::AllPositioningMethods);
connect(this, &QGeoPositionInfoSourceWinRT::nativePositionUpdate, this, &QGeoPositionInfoSourceWinRT::updateSynchronized);
-}
-
-QGeoPositionInfoSourceWinRT::~QGeoPositionInfoSourceWinRT()
-{
+ return 0;
}
QGeoPositionInfo QGeoPositionInfoSourceWinRT::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const
diff --git a/src/plugins/position/winrt/qgeopositioninfosource_winrt_p.h b/src/plugins/position/winrt/qgeopositioninfosource_winrt_p.h
index b8820dd2..9f3a1c7f 100644
--- a/src/plugins/position/winrt/qgeopositioninfosource_winrt_p.h
+++ b/src/plugins/position/winrt/qgeopositioninfosource_winrt_p.h
@@ -78,6 +78,7 @@ class QGeoPositionInfoSourceWinRT : public QGeoPositionInfoSource
public:
QGeoPositionInfoSourceWinRT(QObject *parent = 0);
~QGeoPositionInfoSourceWinRT();
+ int init();
QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const;
PositioningMethods supportedPositioningMethods() const;
diff --git a/src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.cpp b/src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.cpp
index 81656c21..e58744a0 100644
--- a/src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.cpp
+++ b/src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.cpp
@@ -39,7 +39,12 @@
QGeoPositionInfoSource *QGeoPositionInfoSourceFactoryWinRT::positionInfoSource(QObject *parent)
{
- return new QGeoPositionInfoSourceWinRT(parent);
+ QGeoPositionInfoSourceWinRT *src = new QGeoPositionInfoSourceWinRT(parent);
+ if (src->init() < 0) {
+ delete src;
+ src = 0;
+ }
+ return src;
}
QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactoryWinRT::satelliteInfoSource(QObject *parent)