summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Angelelli <paolo.angelelli@qt.io>2019-05-02 18:53:35 +0200
committerpaolo <paolo.angelelli@qt.io>2019-07-24 16:25:44 +0200
commitf8694e1f3430b7851fc90e26c6d778a86219379a (patch)
treefbe92684c4458431bf29d8b68d8cddea7b8e496a
parent17e3f08377c34d301401fbd3c40b525790fcd9a5 (diff)
downloadqtlocation-f8694e1f3430b7851fc90e26c6d778a86219379a.tar.gz
Allow setting backend properties of positioning plugins
This change adds a pair of setter/getter to specify positioning backend properties at runtime, both in QGeoPositionInfoSource and QDeclarativePositionSource. Task-number: QTBUG-66304 Change-Id: Iea9421fb708879bee5c62c4afaf45cbda57f50bb Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
-rw-r--r--src/positioning/qgeopositioninfosource.cpp54
-rw-r--r--src/positioning/qgeopositioninfosource.h6
-rw-r--r--src/positioning/qgeopositioninfosource_p.h6
-rw-r--r--src/positioningquick/qdeclarativepositionsource.cpp38
-rw-r--r--src/positioningquick/qdeclarativepositionsource_p.h3
-rw-r--r--tests/auto/declarative_core/tst_positionsource.qml8
-rw-r--r--tests/auto/positionplugin/plugin.cpp29
-rw-r--r--tests/auto/positionplugin/positionplugin.pro2
8 files changed, 139 insertions, 7 deletions
diff --git a/src/positioning/qgeopositioninfosource.cpp b/src/positioning/qgeopositioninfosource.cpp
index 29a0d019..69fcdef0 100644
--- a/src/positioning/qgeopositioninfosource.cpp
+++ b/src/positioning/qgeopositioninfosource.cpp
@@ -108,6 +108,11 @@ QGeoPositionInfoSourcePrivate *QGeoPositionInfoSourcePrivate::get(const QGeoPosi
return source.d;
}
+QGeoPositionInfoSourcePrivate::~QGeoPositionInfoSourcePrivate()
+{
+
+}
+
void QGeoPositionInfoSourcePrivate::loadMeta()
{
metaData = plugins().value(providerName);
@@ -128,6 +133,16 @@ void QGeoPositionInfoSourcePrivate::loadPlugin()
factory = factoryV2;
}
+bool QGeoPositionInfoSourcePrivate::setBackendProperty(const QString &/*name*/, QVariant /*value*/)
+{
+ return false;
+}
+
+QVariant QGeoPositionInfoSourcePrivate::backendProperty(const QString &/*name*/) const
+{
+ return QVariant();
+}
+
QHash<QString, QJsonObject> QGeoPositionInfoSourcePrivate::plugins(bool reload)
{
static QHash<QString, QJsonObject> plugins;
@@ -216,6 +231,36 @@ QString QGeoPositionInfoSource::sourceName() const
}
/*!
+ Sets the backend-specific property named \a name to \a value.
+ Returns \c true on success, \c false otherwise.
+ Backend-specific properties can be used to configure the positioning subsystem behavior
+ at runtime.
+ Supported backend-specific properties are listed and described in
+ \l {Qt Positioning plugins#Default plugins}.
+
+ \sa backendProperty
+ \since Qt 5.14
+*/
+bool QGeoPositionInfoSource::setBackendProperty(const QString &name, QVariant value)
+{
+ return d->setBackendProperty(name, value);
+}
+
+/*!
+ Returns the value of the backend-specific property named \a name, if present.
+ Otherwise, the returned value will be invalid.
+ Supported backend-specific properties are listed and described in
+ \l {Qt Positioning plugins#Default plugins}.
+
+ \sa setBackendProperty
+ \since Qt 5.14
+*/
+QVariant QGeoPositionInfoSource::backendProperty(const QString &name) const
+{
+ return d->backendProperty(name);
+}
+
+/*!
\property QGeoPositionInfoSource::updateInterval
\brief This property holds the requested interval in milliseconds between each update.
@@ -382,6 +427,15 @@ QStringList QGeoPositionInfoSource::availableSources()
return plugins;
}
+QGeoPositionInfoSource::QGeoPositionInfoSource(QGeoPositionInfoSourcePrivate &dd, QObject *parent)
+: QObject(parent),
+ d(&dd)
+{
+ qRegisterMetaType<QGeoPositionInfo>();
+ d->interval = 0;
+ d->methods = NoPositioningMethods;
+}
+
/*!
\fn QGeoPositionInfo QGeoPositionInfoSource::lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const = 0;
diff --git a/src/positioning/qgeopositioninfosource.h b/src/positioning/qgeopositioninfosource.h
index 23b3ac46..eaf5e106 100644
--- a/src/positioning/qgeopositioninfosource.h
+++ b/src/positioning/qgeopositioninfosource.h
@@ -87,6 +87,9 @@ public:
QString sourceName() const;
+ bool setBackendProperty(const QString &name, QVariant value);
+ QVariant backendProperty(const QString &name) const;
+
static QGeoPositionInfoSource *createDefaultSource(QObject *parent);
static QGeoPositionInfoSource *createDefaultSource(const QVariantMap &parameters, QObject *parent);
static QGeoPositionInfoSource *createSource(const QString &sourceName, QObject *parent);
@@ -106,6 +109,9 @@ Q_SIGNALS:
void error(QGeoPositionInfoSource::Error);
void supportedPositioningMethodsChanged();
+protected:
+ QGeoPositionInfoSource(QGeoPositionInfoSourcePrivate &dd, QObject *parent);
+
private:
Q_DISABLE_COPY(QGeoPositionInfoSource)
QGeoPositionInfoSourcePrivate *d;
diff --git a/src/positioning/qgeopositioninfosource_p.h b/src/positioning/qgeopositioninfosource_p.h
index f5f85ec9..ccd92a4e 100644
--- a/src/positioning/qgeopositioninfosource_p.h
+++ b/src/positioning/qgeopositioninfosource_p.h
@@ -51,6 +51,7 @@
// We mean it.
//
+#include <QtPositioning/private/qpositioningglobal_p.h>
#include "qgeopositioninfosource.h"
#include "qgeopositioninfosourcefactory.h"
#include <QJsonObject>
@@ -60,10 +61,11 @@
QT_BEGIN_NAMESPACE
-class QGeoPositionInfoSourcePrivate
+class Q_POSITIONING_PRIVATE_EXPORT QGeoPositionInfoSourcePrivate
{
public:
static QGeoPositionInfoSourcePrivate *get(const QGeoPositionInfoSource &source);
+ virtual ~QGeoPositionInfoSourcePrivate();
int interval;
QGeoPositionInfoSource::PositioningMethods methods;
@@ -74,6 +76,8 @@ public:
void loadMeta();
void loadPlugin();
+ virtual bool setBackendProperty(const QString &name, QVariant value);
+ virtual QVariant backendProperty(const QString &name) const;
static QHash<QString, QJsonObject> plugins(bool reload = false);
static void loadPluginMetadata(QHash<QString, QJsonObject> &list);
diff --git a/src/positioningquick/qdeclarativepositionsource.cpp b/src/positioningquick/qdeclarativepositionsource.cpp
index 3bf39081..cfbcc9da 100644
--- a/src/positioningquick/qdeclarativepositionsource.cpp
+++ b/src/positioningquick/qdeclarativepositionsource.cpp
@@ -862,6 +862,44 @@ void QDeclarativePositionSource::componentComplete()
}
/*!
+ \qmlmethod bool QtLocation::PositionSource::setBackendProperty(string name, Variant value)
+
+ Sets the backend-specific property named \a name to \a value.
+ Returns true on success, false otherwise, including if called on an uninitialized PositionSource.
+ Supported backend-specific properties are listed and described in
+ \l {Qt Positioning plugins#Default plugins}.
+
+ \since Qt Positioning 5.14
+
+ \sa backendProperty, QGeoPositionInfoSource::setBackendProperty
+*/
+bool QDeclarativePositionSource::setBackendProperty(const QString &name, QVariant value)
+{
+ if (m_positionSource)
+ return m_positionSource->setBackendProperty(name, value);
+ return false;
+}
+
+/*!
+ \qmlmethod Variant QtLocation::PositionSource::backendProperty(string name)
+
+ Returns the value of the backend-specific property named \a name, if present.
+ Otherwise, including if called on an uninitialized PositionSource, the return value will be invalid.
+ Supported backend-specific properties are listed and described in
+ \l {Qt Positioning plugins#Default plugins}.
+
+ \since Qt Positioning 5.14
+
+ \sa backendProperty, QGeoPositionInfoSource::setBackendProperty
+*/
+QVariant QDeclarativePositionSource::backendProperty(const QString &name) const
+{
+ if (m_positionSource)
+ return m_positionSource->backendProperty(name);
+ return QVariant();
+}
+
+/*!
\internal
*/
void QDeclarativePositionSource::sourceErrorReceived(const QGeoPositionInfoSource::Error error)
diff --git a/src/positioningquick/qdeclarativepositionsource_p.h b/src/positioningquick/qdeclarativepositionsource_p.h
index 7e389b85..dff0006c 100644
--- a/src/positioningquick/qdeclarativepositionsource_p.h
+++ b/src/positioningquick/qdeclarativepositionsource_p.h
@@ -131,6 +131,9 @@ public:
void classBegin() { }
void componentComplete();
+ Q_INVOKABLE bool setBackendProperty(const QString &name, QVariant value);
+ Q_INVOKABLE QVariant backendProperty(const QString &name) const;
+
public Q_SLOTS:
void update(); // TODO Qt 6 change to void update(int)
void start();
diff --git a/tests/auto/declarative_core/tst_positionsource.qml b/tests/auto/declarative_core/tst_positionsource.qml
index 9b78936b..7b787a0c 100644
--- a/tests/auto/declarative_core/tst_positionsource.qml
+++ b/tests/auto/declarative_core/tst_positionsource.qml
@@ -187,7 +187,7 @@ TestCase {
compare(directionValidSpyWParams.count, 0)
compare(directionSpyWParams.count, 0)
-
+ compare(testingSourceWParams.backendProperty("altitude"), altitudeParameter.value)
testingSourceWParams.active = true;
tryCompare(updateSpyWParams, "count", 1, 1500);
@@ -199,23 +199,25 @@ TestCase {
fuzzyCompare(testingSourceWParams.position.direction, 45, 0.1)
verify(!testingSourceWParams.position.speedValid)
verify(isNaN(testingSourceWParams.position.speed))
+ testingSourceWParams.setBackendProperty("altitude", 24.24)
tryCompare(updateSpyWParams, "count", 2, 1500);
compare(testingSourceWParams.position.coordinate.longitude, 0.2);
compare(testingSourceWParams.position.coordinate.latitude, 0.2);
- compare(testingSourceWParams.position.coordinate.altitude, altitudeParameter.value);
+ compare(testingSourceWParams.position.coordinate.altitude, 24.24);
compare(directionValidSpyWParams.count, 1)
compare(directionSpyWParams.count, 2)
fuzzyCompare(testingSourceWParams.position.direction, 45, 0.1)
verify(testingSourceWParams.position.speedValid)
verify(testingSourceWParams.position.speed > 10000)
+ compare(testingSourceWParams.backendProperty("altitude"), 24.24)
testingSourceWParams.active = false;
wait(2500);
compare(updateSpyWParams.count, 2);
compare(testingSourceWParams.position.coordinate.longitude, 0.2);
compare(testingSourceWParams.position.coordinate.latitude, 0.2);
- compare(testingSourceWParams.position.coordinate.altitude, altitudeParameter.value);
+ compare(testingSourceWParams.position.coordinate.altitude, 24.24);
compare(directionValidSpyWParams.count, 1)
compare(directionSpyWParams.count, 2)
fuzzyCompare(testingSourceWParams.position.direction, 45, 0.1)
diff --git a/tests/auto/positionplugin/plugin.cpp b/tests/auto/positionplugin/plugin.cpp
index b6016b95..9d5c7dd5 100644
--- a/tests/auto/positionplugin/plugin.cpp
+++ b/tests/auto/positionplugin/plugin.cpp
@@ -27,6 +27,7 @@
****************************************************************************/
#include <QtPositioning/qgeopositioninfosource.h>
+#include <QtPositioning/private/qgeopositioninfosource_p.h>
#include <QtPositioning/qgeopositioninfosourcefactory.h>
#include <QObject>
#include <QtPlugin>
@@ -65,15 +66,38 @@ private slots:
void doTimeout();
};
+class DummySourcePrivate : public QGeoPositionInfoSourcePrivate
+{
+public:
+ bool setBackendProperty(const QString &name, QVariant value) override
+ {
+ if (name == QStringLiteral("altitude")) {
+ m_altitude = value.toReal();
+ return true;
+ }
+ return false;
+ }
+ QVariant backendProperty(const QString &name) const override
+ {
+ if (name == QStringLiteral("altitude"))
+ return m_altitude;
+ return QVariant();
+ }
+
+ qreal m_altitude = 0.0;
+};
+
DummySource::DummySource(const QVariantMap &parameters, QObject *parent) :
- QGeoPositionInfoSource(parent),
+ QGeoPositionInfoSource(*new DummySourcePrivate, parent),
timer(new QTimer(this)),
timeoutTimer(new QTimer(this)),
singleTimer(new QTimer(this)),
lastPosition(QGeoCoordinate(0,0), QDateTime::currentDateTime())
{
+ DummySourcePrivate *dd = static_cast<DummySourcePrivate *>(QGeoPositionInfoSourcePrivate::get(*this));
if (parameters.contains(QStringLiteral("test.source.altitude"))) {
const qreal alti = parameters.value(QStringLiteral("test.source.altitude")).toReal();
+ dd->m_altitude = alti;
QGeoCoordinate crd = lastPosition.coordinate();
crd.setAltitude(alti);
lastPosition.setCoordinate(crd);
@@ -157,6 +181,7 @@ DummySource::~DummySource()
void DummySource::updatePosition()
{
+ DummySourcePrivate *dd = static_cast<DummySourcePrivate *>(QGeoPositionInfoSourcePrivate::get(*this));
timeoutTimer->stop();
singleTimer->stop();
@@ -164,7 +189,7 @@ void DummySource::updatePosition()
QGeoCoordinate coord(lastPosition.coordinate().latitude() + 0.1,
lastPosition.coordinate().longitude() + 0.1,
- lastPosition.coordinate().altitude());
+ dd->m_altitude);
QGeoPositionInfo info(coord, now);
info.setAttribute(QGeoPositionInfo::Direction, lastPosition.coordinate().azimuthTo(coord));
diff --git a/tests/auto/positionplugin/positionplugin.pro b/tests/auto/positionplugin/positionplugin.pro
index 9ccd030f..84d08ac0 100644
--- a/tests/auto/positionplugin/positionplugin.pro
+++ b/tests/auto/positionplugin/positionplugin.pro
@@ -1,5 +1,5 @@
TARGET = qtposition_testplugin
-QT += positioning
+QT += positioning-private
PLUGIN_TYPE = position
PLUGIN_CLASS_NAME = QGeoPositionInfoSourceFactoryTest