summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Angelelli <paolo.angelelli@qt.io>2019-04-11 23:33:19 +0200
committerpaolo <paolo.angelelli@qt.io>2019-05-11 15:37:53 +0200
commitac899dcc40bb3ad09307583fb7e6befd45a77b33 (patch)
tree6595c3c284d50471e92d47f0fe807ee15d6be0ec
parentb1e78d739752a044765776a59161809011875a5c (diff)
downloadqtlocation-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>
-rw-r--r--src/positioning/qgeopositioninfosource.cpp95
-rw-r--r--src/positioning/qgeopositioninfosource.h5
-rw-r--r--src/positioning/qgeopositioninfosource_p.h5
-rw-r--r--src/positioning/qgeopositioninfosourcefactory.cpp4
-rw-r--r--src/positioning/qgeopositioninfosourcefactory.h15
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 &parameters, 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 &parameters, 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 &parameters, 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 &parameters, QObject *parent);
static QGeoPositionInfoSource *createSource(const QString &sourceName, QObject *parent);
+ static QGeoPositionInfoSource *createSource(const QString &sourceName, const QVariantMap &parameters, 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 &parameters) = 0;
+ virtual QGeoSatelliteInfoSource *satelliteInfoSourceWithParameters(QObject *parent, const QVariantMap &parameters) = 0;
+ virtual QGeoAreaMonitorSource *areaMonitorWithParameters(QObject *parent, const QVariantMap &parameters) = 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