diff options
author | Oliver Wolff <oliver.wolff@qt.io> | 2017-04-21 12:34:05 +0200 |
---|---|---|
committer | Oliver Wolff <oliver.wolff@qt.io> | 2017-04-24 12:50:00 +0000 |
commit | 3d43b398bc09319ba63afd45429c252b6d40b093 (patch) | |
tree | dc889ca7dcc172ded3c786d6e862350ca2eba3d7 /src/plugins | |
parent | c2691cf479c88ba0f74492195912cd9b62ce4e62 (diff) | |
download | qtlocation-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>
Diffstat (limited to 'src/plugins')
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) |