diff options
author | Paolo Angelelli <paolo.angelelli@qt.io> | 2019-04-11 23:33:19 +0200 |
---|---|---|
committer | paolo <paolo.angelelli@qt.io> | 2019-05-11 15:37:53 +0200 |
commit | ac899dcc40bb3ad09307583fb7e6befd45a77b33 (patch) | |
tree | 6595c3c284d50471e92d47f0fe807ee15d6be0ec /src/positioning | |
parent | b1e78d739752a044765776a59161809011875a5c (diff) | |
download | qtlocation-ac899dcc40bb3ad09307583fb7e6befd45a77b33.tar.gz |
Introduce QGeoPositionInfoSourceFactoryV2
QGeoPositionInfoSourceFactoryV2 exposes factory methods that accept
plugin parameters as argument, and can be used to configure a given
plugin when requesting a source.
Task-number: QTBUG-66304
Change-Id: If93a0746fddc6ff4074e771db1376c3b3fc67122
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src/positioning')
-rw-r--r-- | src/positioning/qgeopositioninfosource.cpp | 95 | ||||
-rw-r--r-- | src/positioning/qgeopositioninfosource.h | 5 | ||||
-rw-r--r-- | src/positioning/qgeopositioninfosource_p.h | 5 | ||||
-rw-r--r-- | src/positioning/qgeopositioninfosourcefactory.cpp | 4 | ||||
-rw-r--r-- | src/positioning/qgeopositioninfosourcefactory.h | 15 |
5 files changed, 93 insertions, 31 deletions
diff --git a/src/positioning/qgeopositioninfosource.cpp b/src/positioning/qgeopositioninfosource.cpp index 2e126175..29a0d019 100644 --- a/src/positioning/qgeopositioninfosource.cpp +++ b/src/positioning/qgeopositioninfosource.cpp @@ -103,6 +103,11 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader, \value AllPositioningMethods Satellite-based positioning methods as soon as available. Otherwise non-satellite based methods. */ +QGeoPositionInfoSourcePrivate *QGeoPositionInfoSourcePrivate::get(const QGeoPositionInfoSource &source) +{ + return source.d; +} + void QGeoPositionInfoSourcePrivate::loadMeta() { metaData = plugins().value(providerName); @@ -113,7 +118,14 @@ void QGeoPositionInfoSourcePrivate::loadPlugin() int idx = int(metaData.value(QStringLiteral("index")).toDouble()); if (idx < 0) return; - factory = qobject_cast<QGeoPositionInfoSourceFactory *>(loader()->instance(idx)); + QObject *instance = loader()->instance(idx); + if (!instance) + return; + factoryV2 = qobject_cast<QGeoPositionInfoSourceFactoryV2 *>(instance); + if (!factoryV2) + factory = qobject_cast<QGeoPositionInfoSourceFactory *>(instance); + else + factory = factoryV2; } QHash<QString, QJsonObject> QGeoPositionInfoSourcePrivate::plugins(bool reload) @@ -271,6 +283,22 @@ QGeoPositionInfoSource::PositioningMethods QGeoPositionInfoSource::preferredPosi return d->methods; } +static QGeoPositionInfoSource* createSource_real(const QJsonObject &meta, const QVariantMap ¶meters, QObject *parent) +{ + QGeoPositionInfoSourcePrivate d; + d.metaData = meta; + d.loadPlugin(); + QGeoPositionInfoSource *s = nullptr; + if (!parameters.isEmpty() && d.factoryV2) + s = d.factoryV2->positionInfoSourceWithParameters(parent, parameters); + else if (d.factory) + s = d.factory->positionInfoSource(parent); + if (s) + QGeoPositionInfoSourcePrivate::get(*s)->metaData = d.metaData; + + return s; +} + /*! Creates and returns a position source with the given \a parent that reads from the system's default sources of location data, or the plugin @@ -281,27 +309,32 @@ QGeoPositionInfoSource::PositioningMethods QGeoPositionInfoSource::preferredPosi */ QGeoPositionInfoSource *QGeoPositionInfoSource::createDefaultSource(QObject *parent) { + return createDefaultSource(QVariantMap(), parent); +} + +/*! + Creates and returns a position source with the given \a parent that + reads from the system's default sources of location data, or the plugin + with the highest available priority. + + Returns nullptr if the system has no default position source, no valid plugins + could be found or the user does not have the permission to access the current position. + + This method passes \a parameters to the factory to configure the source. + + \since Qt 5.14 +*/ +QGeoPositionInfoSource *QGeoPositionInfoSource::createDefaultSource(const QVariantMap ¶meters, QObject *parent) +{ QList<QJsonObject> plugins = QGeoPositionInfoSourcePrivate::pluginsSorted(); foreach (const QJsonObject &obj, plugins) { if (obj.value(QStringLiteral("Position")).isBool() && obj.value(QStringLiteral("Position")).toBool()) - { - QGeoPositionInfoSourcePrivate d; - d.metaData = obj; - d.loadPlugin(); - QGeoPositionInfoSource *s = 0; - if (d.factory) - s = d.factory->positionInfoSource(parent); - if (s) { - s->d->metaData = d.metaData; - return s; - } - } + return createSource_real(obj, parameters, parent); } - return 0; + return nullptr; } - /*! Creates and returns a position source with the given \a parent, by loading the plugin named \a sourceName. @@ -310,25 +343,27 @@ QGeoPositionInfoSource *QGeoPositionInfoSource::createDefaultSource(QObject *par */ QGeoPositionInfoSource *QGeoPositionInfoSource::createSource(const QString &sourceName, QObject *parent) { + return createSource(sourceName, QVariantMap(), parent); +} + +/*! + Creates and returns a position source with the given \a parent, + by loading the plugin named \a sourceName. + + Returns nullptr if the plugin cannot be found. + + This method passes \a parameters to the factory to configure the source. + + \since Qt 5.14 +*/ +QGeoPositionInfoSource *QGeoPositionInfoSource::createSource(const QString &sourceName, const QVariantMap ¶meters, QObject *parent) +{ QHash<QString, QJsonObject> plugins = QGeoPositionInfoSourcePrivate::plugins(); if (plugins.contains(sourceName)) - { - QGeoPositionInfoSourcePrivate d; - d.metaData = plugins.value(sourceName); - d.loadPlugin(); - QGeoPositionInfoSource *src = 0; - if (d.factory) - src = d.factory->positionInfoSource(parent); - if (src) - { - src->d->metaData = d.metaData; - return src; - } - } - return 0; + return createSource_real(plugins.value(sourceName), parameters, parent); + return nullptr; } - /*! Returns a list of available source plugins. This includes any default backend plugin for the current platform. diff --git a/src/positioning/qgeopositioninfosource.h b/src/positioning/qgeopositioninfosource.h index 7fe02270..23b3ac46 100644 --- a/src/positioning/qgeopositioninfosource.h +++ b/src/positioning/qgeopositioninfosource.h @@ -36,6 +36,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ + #ifndef QGEOPOSITIONINFOSOURCE_H #define QGEOPOSITIONINFOSOURCE_H @@ -87,7 +88,9 @@ public: QString sourceName() const; static QGeoPositionInfoSource *createDefaultSource(QObject *parent); + static QGeoPositionInfoSource *createDefaultSource(const QVariantMap ¶meters, QObject *parent); static QGeoPositionInfoSource *createSource(const QString &sourceName, QObject *parent); + static QGeoPositionInfoSource *createSource(const QString &sourceName, const QVariantMap ¶meters, QObject *parent); static QStringList availableSources(); virtual Error error() const = 0; @@ -106,6 +109,8 @@ Q_SIGNALS: private: Q_DISABLE_COPY(QGeoPositionInfoSource) QGeoPositionInfoSourcePrivate *d; + + friend class QGeoPositionInfoSourcePrivate; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoPositionInfoSource::PositioningMethods) diff --git a/src/positioning/qgeopositioninfosource_p.h b/src/positioning/qgeopositioninfosource_p.h index 32fd23e6..f5f85ec9 100644 --- a/src/positioning/qgeopositioninfosource_p.h +++ b/src/positioning/qgeopositioninfosource_p.h @@ -63,10 +63,13 @@ QT_BEGIN_NAMESPACE class QGeoPositionInfoSourcePrivate { public: + static QGeoPositionInfoSourcePrivate *get(const QGeoPositionInfoSource &source); + int interval; QGeoPositionInfoSource::PositioningMethods methods; QJsonObject metaData; - QGeoPositionInfoSourceFactory *factory; + QGeoPositionInfoSourceFactory *factory = nullptr; + QGeoPositionInfoSourceFactoryV2 *factoryV2 = nullptr; QString providerName; void loadMeta(); diff --git a/src/positioning/qgeopositioninfosourcefactory.cpp b/src/positioning/qgeopositioninfosourcefactory.cpp index 6c6e9c73..76803566 100644 --- a/src/positioning/qgeopositioninfosourcefactory.cpp +++ b/src/positioning/qgeopositioninfosourcefactory.cpp @@ -84,4 +84,8 @@ QT_BEGIN_NAMESPACE QGeoPositionInfoSourceFactory::~QGeoPositionInfoSourceFactory() {} +QGeoPositionInfoSourceFactoryV2::~QGeoPositionInfoSourceFactoryV2() +{} + QT_END_NAMESPACE + diff --git a/src/positioning/qgeopositioninfosourcefactory.h b/src/positioning/qgeopositioninfosourcefactory.h index b30aaf7e..e55a1eb3 100644 --- a/src/positioning/qgeopositioninfosourcefactory.h +++ b/src/positioning/qgeopositioninfosourcefactory.h @@ -61,6 +61,21 @@ public: Q_DECLARE_INTERFACE(QGeoPositionInfoSourceFactory, "org.qt-project.qt.position.sourcefactory/5.0") +class Q_POSITIONING_EXPORT QGeoPositionInfoSourceFactoryV2 : public QGeoPositionInfoSourceFactory +{ +public: + virtual ~QGeoPositionInfoSourceFactoryV2(); + + virtual QGeoPositionInfoSource *positionInfoSourceWithParameters(QObject *parent, const QVariantMap ¶meters) = 0; + virtual QGeoSatelliteInfoSource *satelliteInfoSourceWithParameters(QObject *parent, const QVariantMap ¶meters) = 0; + virtual QGeoAreaMonitorSource *areaMonitorWithParameters(QObject *parent, const QVariantMap ¶meters) = 0; +}; + +// Although not actually used for constructing a specialized loader, this is required for +// casting a QObject * into QGeoPositionInfoSourceFactoryV2 * +Q_DECLARE_INTERFACE(QGeoPositionInfoSourceFactoryV2, + "org.qt-project.qt.position.sourcefactoryV2/5.0") + QT_END_NAMESPACE #endif // QGEOPOSITIONINFOSOURCEFACTORY_H |