diff options
Diffstat (limited to 'src/positioningquick/qdeclarativepositionsource.cpp')
-rw-r--r-- | src/positioningquick/qdeclarativepositionsource.cpp | 913 |
1 files changed, 0 insertions, 913 deletions
diff --git a/src/positioningquick/qdeclarativepositionsource.cpp b/src/positioningquick/qdeclarativepositionsource.cpp deleted file mode 100644 index 5a84c788..00000000 --- a/src/positioningquick/qdeclarativepositionsource.cpp +++ /dev/null @@ -1,913 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtPositioning module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qdeclarativepositionsource_p.h" -#include "qdeclarativeposition_p.h" - -#include <QtCore/QCoreApplication> -#include <QtQml/qqmlinfo.h> -#include <QtQml/qqml.h> -#include <qdeclarativepluginparameter_p.h> -#include <QFile> -#include <QtNetwork/QTcpSocket> -#include <QTimer> - -QT_BEGIN_NAMESPACE - -/*! - \qmltype PositionSource - //! \instantiates QDeclarativePositionSource - \inqmlmodule QtPositioning - \since 5.2 - - \brief The PositionSource type provides the device's current position. - - The PositionSource type provides information about the user device's - current position. The position is available as a \l{Position} type, which - contains all the standard parameters typically available from GPS and other - similar systems, including longitude, latitude, speed and accuracy details. - - As different position sources are available on different platforms and - devices, these are categorized by their basic type (Satellite, NonSatellite, - and AllPositioningMethods). The available methods for the current platform - can be enumerated in the \l{supportedPositioningMethods} property. - - To indicate which methods are suitable for your application, set the - \l{preferredPositioningMethods} property. If the preferred methods are not - available, the default source of location data for the platform will be - chosen instead. If no default source is available (because none are installed - for the runtime platform, or because it is disabled), the \l{valid} property - will be set to false. - - The \l updateInterval property can then be used to indicate how often your - application wishes to receive position updates. The \l{start}(), - \l{stop}() and \l{update}() methods can be used to control the operation - of the PositionSource, as well as the \l{active} property, which when set - is equivalent to calling \l{start}() or \l{stop}(). - - When the PositionSource is active, position updates can be retrieved - either by simply using the \l{position} property in a binding (as the - value of another item's property), or by providing an implementation of - the \c {onPositionChanged} signal-handler. - - \section2 Example Usage - - The following example shows a simple PositionSource used to receive - updates every second and print the longitude and latitude out to - the console. - - \code - PositionSource { - id: src - updateInterval: 1000 - active: true - - onPositionChanged: { - var coord = src.position.coordinate; - console.log("Coordinate:", coord.longitude, coord.latitude); - } - } - \endcode - - The \l{geoflickr}{GeoFlickr} example application shows how to use - a PositionSource in your application to retrieve local data for users - from a REST web service. - - \section2 Controlling Operation State - - As it's mentioned above, PositionSource provides two ways to control its - operation state: - - \list - \li By using the \l active \l {Qt Bindable Properties}{bindable} property. - \li By using \l start() and \l stop() methods. - \endlist - - \note It's very important not to mix these approaches. If a bindable - \l active property is used to control the PositionSource object, but later - \l start() or \l stop() is called from the other part of the code, the - binding is broken, which may result in, for example, a UI element that is - not connected to any underlying object anymore. - - Consider the following example of \b {bad code} where the \c active property - is bound to the CheckBox state, and calling \l stop() in the \c onClicked - signal handler breaks that binding. - - \qml - Window { - width: 640 - height: 480 - visible: true - - PositionSource { - id: posSource - name: "geoclue2" - active: cb.checked - } - - Column { - anchors.centerIn: parent - spacing: 20 - CheckBox { - id: cb - } - Button { - id: btn - text: "Stop" - onClicked: { - posSource.stop() - } - } - } - } - \endqml - - Once the \e Stop button is clicked, \l stop() is executed, and the binding - for the \l active property is broken. At this point the CheckBox UI element - is no longer controlling the PositionSource object. - - A straightforward fix in this case is to update the CheckBox state from - the \c onClicked handler. As soon as the CheckBox is unchecked, the - \l active property will be notified, and the PositionSource object's state - will update accordingly. The UI will also be in a consistent state. - - \qml - Button { - id: btn - text: "Stop" - onClicked: { - cb.checked = false - } - } - \endqml - - \note Using \l update() to request a single position update \e {does not} - have any effect on the \l active property's bindings, so they can be used - together without any problems. - - \sa {QtPositioning::Position}, {QGeoPositionInfoSource}, {PluginParameter}, - {Qt Bindable Properties} - -*/ - -QDeclarativePositionSource::QDeclarativePositionSource() -{ - m_position.setValueBypassingBindings(new QDeclarativePosition(this)); -} - -QDeclarativePositionSource::~QDeclarativePositionSource() -{ - delete m_positionSource; -} - - -/*! - \qmlproperty string PositionSource::name - - This property holds the unique internal name for the plugin currently - providing position information. - - Setting the property causes the PositionSource to use a particular positioning provider. If - the PositionSource is active at the time that the name property is changed, it will become - inactive. If the specified positioning provider cannot be loaded the position source will - become invalid. - - Changing the name property may cause the \l {updateInterval}, \l {supportedPositioningMethods} - and \l {preferredPositioningMethods} properties to change as well. -*/ - - -QString QDeclarativePositionSource::name() const -{ - return m_sourceName; -} - -void QDeclarativePositionSource::setName(const QString &newName) -{ - m_sourceName.removeBindingUnlessInWrapper(); - if (m_positionSource && m_positionSource->sourceName() == newName) - return; - - if (newName.isEmpty() && m_defaultSourceUsed) - return; // previously attached to a default source, now requesting the same. - - const QString previousName = name(); - - if (!m_componentComplete || !m_parametersInitialized) { - if (previousName != newName) { - m_sourceName.setValueBypassingBindings(newName); - m_sourceName.notify(); - } - return; - } - - // tryAttach() will update the m_sourceName correctly - tryAttach(newName, false); -} - -QBindable<QString> QDeclarativePositionSource::bindableName() -{ - return QBindable<QString>(&m_sourceName); -} - -QBindable<QDeclarativePosition *> QDeclarativePositionSource::bindablePosition() const -{ - return QBindable<QDeclarativePosition *>(&m_position); -} - -/*! - \internal -*/ -void QDeclarativePositionSource::tryAttach(const QString &newName, bool useFallback) -{ - const QString previousName = name(); - const bool sourceExisted = (m_positionSource != nullptr); - - int previousUpdateInterval = updateInterval(); - PositioningMethods previousPositioningMethods = supportedPositioningMethods(); - PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods(); - - m_defaultSourceUsed = false; - - if (newName.isEmpty()) { - setSource(QGeoPositionInfoSource::createDefaultSource(parameterMap(), this)); - m_defaultSourceUsed = true; - } else { - setSource(QGeoPositionInfoSource::createSource(newName, parameterMap(), this)); - if (!m_positionSource && useFallback) { - setSource(QGeoPositionInfoSource::createDefaultSource(parameterMap(), this)); - m_defaultSourceUsed = true; - } - } - - if (m_positionSource) { - m_sourceName.setValueBypassingBindings(m_positionSource->sourceName()); - - connect(m_positionSource, SIGNAL(positionUpdated(QGeoPositionInfo)), - this, SLOT(positionUpdateReceived(QGeoPositionInfo))); - connect(m_positionSource, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error)), - this, SLOT(sourceErrorReceived(QGeoPositionInfoSource::Error))); - - m_positionSource->setUpdateInterval(m_updateInterval); - m_positionSource->setPreferredPositioningMethods( - static_cast<QGeoPositionInfoSource::PositioningMethods>(int(m_preferredPositioningMethods))); - - const QGeoPositionInfo &lastKnown = m_positionSource->lastKnownPosition(); - if (lastKnown.isValid()) - setPosition(lastKnown); - } else { - m_sourceName.setValueBypassingBindings(newName); - m_defaultSourceUsed = false; - if (m_active) { - // We do not want to break the binding here, because we just want to - // give the user an opportunity to select another plugin and keep - // working. - m_active.setValueBypassingBindings(false); - m_active.notify(); - } - } - - if (previousUpdateInterval != updateInterval()) - emit updateIntervalChanged(); - - if (previousPreferredPositioningMethods != preferredPositioningMethods()) - emit preferredPositioningMethodsChanged(); - - if (previousPositioningMethods != supportedPositioningMethods()) - notifySupportedPositioningMethodsChanged(); - - const bool sourceCurrentlyExists = (m_positionSource != nullptr); - if (sourceExisted != sourceCurrentlyExists) { - m_isValid.notify(); - emit validityChanged(); - } - - if (m_active) { // implies m_positionSource - if (!sourceExisted) { - // delay ensures all properties have been set - QTimer::singleShot(0, this, [this]() { executeStart(); }); - } else { - // New source is set. It should be inactive by default. - // But we do not want to break the binding. - m_active.setValueBypassingBindings(false); - m_active.notify(); - } - } - - if (previousName != m_sourceName) - m_sourceName.notify(); -} - -/*! - \qmlproperty bool PositionSource::valid - - This property is true if the PositionSource object has acquired a valid - backend plugin to provide data. If false, other methods on the PositionSource - will have no effect. - - Applications should check this property to determine whether positioning is - available and enabled on the runtime platform, and react accordingly. -*/ -bool QDeclarativePositionSource::isValid() const -{ - return m_isValid.value(); -} - -QBindable<bool> QDeclarativePositionSource::bindableIsValid() const -{ - return QBindable<bool>(&m_isValid); -} - -bool QDeclarativePositionSource::isValidActualComputation() const -{ - return m_positionSource != nullptr; -} - -void QDeclarativePositionSource::handleUpdateTimeout() -{ - // notify will be called by the calling method - m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::UpdateTimeoutError); - - if (!m_active) - return; - - if (m_singleUpdate) { - m_singleUpdate = false; - - if (!m_regularUpdates) { - // only singleUpdate based timeouts change activity - // continuous updates may resume again - // (see QGeoPositionInfoSource::startUpdates()) - m_active.setValueBypassingBindings(false); - m_active.notify(); - } - } -} - -/*! - \internal -*/ -void QDeclarativePositionSource::onParameterInitialized() -{ - m_parametersInitialized = true; - for (QDeclarativePluginParameter *p: qAsConst(m_parameters)) { - if (!p->isInitialized()) { - m_parametersInitialized = false; - break; - } - } - - // If here, componentComplete has been called. - if (m_parametersInitialized) - tryAttach(m_sourceName.value()); -} - -void QDeclarativePositionSource::notifySupportedPositioningMethodsChanged() -{ - m_supportedPositioningMethods.notify(); - emit supportedPositioningMethodsChanged(); -} - -void QDeclarativePositionSource::setPosition(const QGeoPositionInfo &pi) -{ - m_position.value()->setPosition(pi); - m_position.notify(); - emit positionChanged(); -} - -void QDeclarativePositionSource::setSource(QGeoPositionInfoSource *source) -{ - if (m_positionSource) - delete m_positionSource; - - if (!source) { - m_positionSource = nullptr; - } else { - m_positionSource = source; - connect(m_positionSource, &QGeoPositionInfoSource::supportedPositioningMethodsChanged, - this, &QDeclarativePositionSource::notifySupportedPositioningMethodsChanged); - } -} - -bool QDeclarativePositionSource::parametersReady() -{ - for (const QDeclarativePluginParameter *p: qAsConst(m_parameters)) { - if (!p->isInitialized()) - return false; - } - return true; -} - -/*! - \internal -*/ -QVariantMap QDeclarativePositionSource::parameterMap() const -{ - QVariantMap map; - - for (int i = 0; i < m_parameters.size(); ++i) { - QDeclarativePluginParameter *parameter = m_parameters.at(i); - map.insert(parameter->name(), parameter->value()); - } - - return map; -} - -/*! - \internal -*/ -void QDeclarativePositionSource::setUpdateInterval(int updateInterval) -{ - if (m_positionSource) { - int previousUpdateInterval = m_positionSource->updateInterval(); - - m_updateInterval = updateInterval; - - if (previousUpdateInterval != updateInterval) { - m_positionSource->setUpdateInterval(updateInterval); - if (previousUpdateInterval != m_positionSource->updateInterval()) - emit updateIntervalChanged(); - } - } else { - if (m_updateInterval != updateInterval) { - m_updateInterval = updateInterval; - emit updateIntervalChanged(); - } - } -} - -/*! - \qmlproperty int PositionSource::updateInterval - - This property holds the desired interval between updates (milliseconds). - - \sa {QGeoPositionInfoSource::updateInterval()} -*/ - -int QDeclarativePositionSource::updateInterval() const -{ - if (!m_positionSource) - return m_updateInterval; - - return m_positionSource->updateInterval(); -} - -/*! - \qmlproperty enumeration PositionSource::supportedPositioningMethods - - This property holds the supported positioning methods of the - current source. - - \list - \li PositionSource.NoPositioningMethods - No positioning methods supported (no source). - \li PositionSource.SatellitePositioningMethods - Satellite-based positioning methods such as GPS are supported. - \li PositionSource.NonSatellitePositioningMethods - Non-satellite-based methods are supported. - \li PositionSource.AllPositioningMethods - Both satellite-based and non-satellite positioning methods are supported. - \endlist - -*/ - -QDeclarativePositionSource::PositioningMethods -QDeclarativePositionSource::supportedPositioningMethods() const -{ - return m_supportedPositioningMethods.value(); -} - -QDeclarativePositionSource::PositioningMethods -QDeclarativePositionSource::supportedMethodsActualComputation() const -{ - if (m_positionSource) { - return static_cast<QDeclarativePositionSource::PositioningMethods>( - int(m_positionSource->supportedPositioningMethods())); - } - return QDeclarativePositionSource::NoPositioningMethods; -} - -QBindable<QDeclarativePositionSource::PositioningMethods> -QDeclarativePositionSource::bindableSupportedPositioningMethods() const -{ - return QBindable<PositioningMethods>(&m_supportedPositioningMethods); -} - -/*! - \qmlproperty enumeration PositionSource::preferredPositioningMethods - - This property holds the preferred positioning methods of the - current source. - - \list - \li PositionSource.NoPositioningMethods - No positioning method is preferred. - \li PositionSource.SatellitePositioningMethods - Satellite-based positioning methods such as GPS should be preferred. - \li PositionSource.NonSatellitePositioningMethods - Non-satellite-based methods should be preferred. - \li PositionSource.AllPositioningMethods - Any positioning methods are acceptable. - \endlist - -*/ - -void QDeclarativePositionSource::setPreferredPositioningMethods(PositioningMethods methods) -{ - if (m_positionSource) { - PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods(); - - m_preferredPositioningMethods = methods; - - if (previousPreferredPositioningMethods != methods) { - m_positionSource->setPreferredPositioningMethods( - static_cast<QGeoPositionInfoSource::PositioningMethods>(int(methods))); - if (previousPreferredPositioningMethods != m_positionSource->preferredPositioningMethods()) - emit preferredPositioningMethodsChanged(); - } - } else { - if (m_preferredPositioningMethods != methods) { - m_preferredPositioningMethods = methods; - emit preferredPositioningMethodsChanged(); - } - } -} - -QDeclarativePositionSource::PositioningMethods QDeclarativePositionSource::preferredPositioningMethods() const -{ - if (m_positionSource) { - return static_cast<QDeclarativePositionSource::PositioningMethods>( - int(m_positionSource->preferredPositioningMethods())); - } - return m_preferredPositioningMethods; -} - -/*! - \qmlmethod PositionSource::start() - - Requests updates from the location source. - Uses \l updateInterval if set, default interval otherwise. - If there is no source available, this method has no effect. - - \note Calling this method breaks the bindings of - \l {PositionSource::}{active} property. - - \sa stop, update, active -*/ - -void QDeclarativePositionSource::start() -{ - if (m_positionSource) { - m_active.removeBindingUnlessInWrapper(); - executeStart(); - } -} - -/*! - \qmlmethod PositionSource::update(int timeout) - - A convenience method to request single update from the location source. - If there is no source available, this method has no effect. - - If the position source is not active, it will be activated for as - long as it takes to receive an update, or until the request times - out. The request timeout period is source-specific. - - The \a timeout is specified in milliseconds. If the \a timeout is zero - (the default value), it defaults to a reasonable timeout period as - appropriate for the source. - - \sa start, stop, active -*/ - -void QDeclarativePositionSource::update(int timeout) -{ - if (m_positionSource) { - m_singleUpdate = true; - if (!m_active) { - // Questionable: we do not want this method to break the binding. - // Mostly because it can be called while the updates are already - // running. - m_active.setValueBypassingBindings(true); - m_active.notify(); - } - // Use default timeout value. Set active before calling the - // update request because on some platforms there may - // be results immediately. - m_positionSource->requestUpdate(timeout); - } -} - -/*! - \qmlmethod PositionSource::stop() - - Stops updates from the location source. - If there is no source available or it is not active, - this method has no effect. - - \note Calling this method breaks the bindings of - \l {PositionSource::}{active} property. - - \sa start, update, active -*/ - -void QDeclarativePositionSource::stop() -{ - if (m_positionSource) { - m_positionSource->stopUpdates(); - m_regularUpdates = false; - // Try to break the binding even if we do not actually need to update - // the active state. The m_active can be updated later, when the - // single update request finishes. - m_active.removeBindingUnlessInWrapper(); - if (m_active && !m_singleUpdate) { - m_active.setValueBypassingBindings(false); - m_active.notify(); - } - } -} - -/*! - \qmlproperty bool PositionSource::active - - This property indicates whether the position source is active. - Setting this property to false equals calling \l stop, and - setting this property true equals calling \l start. - - \sa start, stop, update -*/ -void QDeclarativePositionSource::setActive(bool active) -{ - // We need to remove binding, if this method is called explicitly. - // Other changes to m_active are done inside start() and stop() methods. - m_active.removeBindingUnlessInWrapper(); - if (active == m_active) - return; - - if (active) { - // delay ensures all properties have been set - QTimer::singleShot(0, this, [this]() { executeStart(); }); - } else { - stop(); - } -} - -bool QDeclarativePositionSource::isActive() const -{ - return m_active; -} - -/*! - \qmlproperty Position PositionSource::position - - This property holds the last known positional data. - It is a read-only property. - - The Position type has different positional member variables, - whose validity can be checked with appropriate validity functions - (for example sometimes an update does not have speed or altitude data). - - However, whenever a \c {positionChanged} signal has been received, at least - position::coordinate::latitude, position::coordinate::longitude, and position::timestamp can - be assumed to be valid. - - \sa start, stop, update -*/ - -QDeclarativePosition *QDeclarativePositionSource::position() -{ - return m_position.value(); -} - -void QDeclarativePositionSource::positionUpdateReceived(const QGeoPositionInfo &update) -{ - setPosition(update); - - if (m_singleUpdate && m_active) { - // we need to reset m_singleUpdate because we got one - m_singleUpdate = false; - if (!m_regularUpdates) { - // but we change the active state only if the regular updates are - // also stopped - m_active.setValueBypassingBindings(false); - m_active.notify(); - } - } -} - - -/*! - \qmlproperty enumeration PositionSource::sourceError - - This property holds the error which last occurred with the PositionSource. - - \list - \li PositionSource.AccessError - The connection setup to the remote positioning backend failed because the - application lacked the required privileges. - \li PositionSource.ClosedError - The positioning backend closed the connection, which happens for example in case - the user is switching location services to off. As soon as the location service is re-enabled - regular updates will resume. - \li PositionSource.NoError - No error has occurred. - \li PositionSource.UnknownSourceError - An unidentified error occurred. - \li PositionSource.UpdateTimeoutError - The current position could not be - retrieved within the specified timeout, or this PositionSource determined - that it will not be able to provide further regular updates. - \endlist - -*/ - -QDeclarativePositionSource::SourceError QDeclarativePositionSource::sourceError() const -{ - return m_sourceError; -} - -QBindable<QDeclarativePositionSource::SourceError> -QDeclarativePositionSource::bindableSourceError() const -{ - return QBindable<QDeclarativePositionSource::SourceError>(&m_sourceError); -} - -QGeoPositionInfoSource *QDeclarativePositionSource::positionSource() const -{ - return m_positionSource; -} - -/*! - \qmlproperty list<PluginParameter> PositionSource::parameters - \qmldefault - - This property holds the list of plugin parameters. - - \since QtPositioning 5.14 -*/ -QQmlListProperty<QDeclarativePluginParameter> QDeclarativePositionSource::parameters() -{ - return QQmlListProperty<QDeclarativePluginParameter>(this, - 0, - parameter_append, - parameter_count, - parameter_at, - parameter_clear); -} - -/*! - \internal -*/ -void QDeclarativePositionSource::parameter_append(QQmlListProperty<QDeclarativePluginParameter> *prop, QDeclarativePluginParameter *parameter) -{ - QDeclarativePositionSource *p = static_cast<QDeclarativePositionSource *>(prop->object); - p->m_parameters.append(parameter); -} - -/*! - \internal -*/ -qsizetype QDeclarativePositionSource::parameter_count(QQmlListProperty<QDeclarativePluginParameter> *prop) -{ - return static_cast<QDeclarativePositionSource *>(prop->object)->m_parameters.count(); -} - -/*! - \internal -*/ -QDeclarativePluginParameter *QDeclarativePositionSource::parameter_at(QQmlListProperty<QDeclarativePluginParameter> *prop, qsizetype index) -{ - return static_cast<QDeclarativePositionSource *>(prop->object)->m_parameters[index]; -} - -/*! - \internal -*/ -void QDeclarativePositionSource::parameter_clear(QQmlListProperty<QDeclarativePluginParameter> *prop) -{ - QDeclarativePositionSource *p = static_cast<QDeclarativePositionSource *>(prop->object); - p->m_parameters.clear(); -} - -void QDeclarativePositionSource::executeStart() -{ - if (m_positionSource) { - m_positionSource->startUpdates(); - - // If this method is called directly from start(), the binding is - // already broken there (for the consistency with stop()). - // If this method is called by a timer, started in setActive(), we do - // not need to break the binding, because it was already done (if - // needed). - - m_regularUpdates = true; - if (!m_active) { - m_active.setValueBypassingBindings(true); - m_active.notify(); - } - } -} - -void QDeclarativePositionSource::componentComplete() -{ - m_componentComplete = true; - m_parametersInitialized = true; - for (QDeclarativePluginParameter *p: qAsConst(m_parameters)) { - if (!p->isInitialized()) { - m_parametersInitialized = false; - connect(p, &QDeclarativePluginParameter::initialized, - this, &QDeclarativePositionSource::onParameterInitialized); - } - } - - if (m_parametersInitialized) - tryAttach(m_sourceName.value()); -} - -/*! - \qmlmethod bool 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, const QVariant &value) -{ - if (m_positionSource) - return m_positionSource->setBackendProperty(name, value); - return false; -} - -/*! - \qmlmethod Variant 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(); -} - -QBindable<bool> QDeclarativePositionSource::bindableActive() -{ - return QBindable<bool>(&m_active); -} - -/*! - \internal -*/ -void QDeclarativePositionSource::sourceErrorReceived(const QGeoPositionInfoSource::Error error) -{ - if (error == QGeoPositionInfoSource::AccessError) - m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::AccessError); - else if (error == QGeoPositionInfoSource::ClosedError) - m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::ClosedError); - else if (error == QGeoPositionInfoSource::UpdateTimeoutError) - handleUpdateTimeout(); // also sets m_sourceError - else if (error == QGeoPositionInfoSource::NoError) - return; //nothing to do - else - m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::UnknownSourceError); - - m_sourceError.notify(); - emit sourceErrorChanged(); -} - -QT_END_NAMESPACE |