8#include <QtCore/QCoreApplication>
9#include <QtQml/qqmlinfo.h>
10#include <QtQml/qqml.h>
11#include <qdeclarativepluginparameter_p.h>
13#include <QtNetwork/QTcpSocket>
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
150QDeclarativePositionSource::QDeclarativePositionSource()
151 : m_singleUpdate(0), m_regularUpdates(0), m_componentComplete(0),
152 m_parametersInitialized(0), m_startRequested(0), m_defaultSourceUsed(0)
154 m_position.setValueBypassingBindings(
new QDeclarativePosition(
this));
157QDeclarativePositionSource::~QDeclarativePositionSource()
159 delete m_positionSource;
164
165
166
167
168
169
170
171
172
173
174
175
176
179QString QDeclarativePositionSource::name()
const
184void QDeclarativePositionSource::setName(
const QString &newName)
186 m_sourceName.removeBindingUnlessInWrapper();
187 if (m_positionSource && m_positionSource->sourceName() == newName)
190 if (newName.isEmpty() && m_defaultSourceUsed)
193 const QString previousName = m_sourceName.valueBypassingBindings();
195 if (!m_componentComplete || !m_parametersInitialized) {
196 if (previousName != newName) {
197 m_sourceName.setValueBypassingBindings(newName);
198 m_sourceName.notify();
204 tryAttach(newName,
false);
207QBindable<QString> QDeclarativePositionSource::bindableName()
209 return QBindable<QString>(&m_sourceName);
212QBindable<QDeclarativePosition *> QDeclarativePositionSource::bindablePosition()
const
214 return QBindable<QDeclarativePosition *>(&m_position);
218
219
220void QDeclarativePositionSource::tryAttach(
const QString &newName,
bool useFallback)
222 const QString previousName = name();
223 const bool sourceExisted = (m_positionSource !=
nullptr);
225 int previousUpdateInterval = updateInterval();
226 PositioningMethods previousPositioningMethods = supportedPositioningMethods();
227 PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
229 m_defaultSourceUsed =
false;
231 if (newName.isEmpty()) {
232 setSource(QGeoPositionInfoSource::createDefaultSource(parameterMap(),
this));
233 m_defaultSourceUsed =
true;
235 setSource(QGeoPositionInfoSource::createSource(newName, parameterMap(),
this));
236 if (!m_positionSource && useFallback) {
237 setSource(QGeoPositionInfoSource::createDefaultSource(parameterMap(),
this));
238 m_defaultSourceUsed =
true;
242 if (m_positionSource) {
243 m_sourceName.setValueBypassingBindings(m_positionSource->sourceName());
245 connect(m_positionSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
246 this, SLOT(positionUpdateReceived(QGeoPositionInfo)));
247 connect(m_positionSource, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error)),
248 this, SLOT(sourceErrorReceived(QGeoPositionInfoSource::Error)));
250 m_positionSource->setUpdateInterval(m_updateInterval);
251 m_positionSource->setPreferredPositioningMethods(
252 static_cast<QGeoPositionInfoSource::PositioningMethods>(
int(m_preferredPositioningMethods)));
254 if (m_startRequested) {
255 const QGeoPositionInfo &lastKnown = m_positionSource->lastKnownPosition();
256 if (lastKnown.isValid())
257 setPosition(lastKnown);
260 m_sourceName.setValueBypassingBindings(newName);
261 m_defaultSourceUsed =
false;
266 m_active.setValueBypassingBindings(
false);
271 if (previousUpdateInterval != updateInterval())
272 emit updateIntervalChanged();
274 if (previousPreferredPositioningMethods != preferredPositioningMethods())
275 emit preferredPositioningMethodsChanged();
277 if (previousPositioningMethods != supportedPositioningMethods())
278 notifySupportedPositioningMethodsChanged();
280 const bool sourceCurrentlyExists = (m_positionSource !=
nullptr);
281 if (sourceExisted != sourceCurrentlyExists) {
283 emit validityChanged();
288 Q_ASSERT(sourceExisted);
291 m_active.setValueBypassingBindings(
false);
293 }
else if (m_startRequested) {
294 m_startRequested =
false;
298 if (previousName != m_sourceName)
299 m_sourceName.notify();
303
304
305
306
307
308
309
310
311
312bool QDeclarativePositionSource::isValid()
const
314 return m_isValid.value();
317QBindable<
bool> QDeclarativePositionSource::bindableIsValid()
const
319 return QBindable<
bool>(&m_isValid);
322bool QDeclarativePositionSource::isValidActualComputation()
const
324 return m_positionSource !=
nullptr;
328
329
330void QDeclarativePositionSource::onParameterInitialized()
332 m_parametersInitialized =
true;
333 for (QDeclarativePluginParameter *p: std::as_const(m_parameters)) {
334 if (!p->isInitialized()) {
335 m_parametersInitialized =
false;
341 if (m_parametersInitialized)
342 tryAttach(m_sourceName.value());
345void QDeclarativePositionSource::notifySupportedPositioningMethodsChanged()
347 m_supportedPositioningMethods.notify();
348 emit supportedPositioningMethodsChanged();
351void QDeclarativePositionSource::setPosition(
const QGeoPositionInfo &pi)
353 m_position.value()->setPosition(pi);
355 emit positionChanged();
358void QDeclarativePositionSource::setSource(QGeoPositionInfoSource *source)
360 if (m_positionSource)
361 delete m_positionSource;
364 m_positionSource =
nullptr;
366 m_positionSource = source;
367 connect(m_positionSource, &QGeoPositionInfoSource::supportedPositioningMethodsChanged,
368 this, &QDeclarativePositionSource::notifySupportedPositioningMethodsChanged);
372bool QDeclarativePositionSource::parametersReady()
374 for (
const QDeclarativePluginParameter *p: std::as_const(m_parameters)) {
375 if (!p->isInitialized())
382
383
384QVariantMap QDeclarativePositionSource::parameterMap()
const
388 for (
const auto *parameter : m_parameters)
389 map.insert(parameter->name(), parameter->value());
395
396
397void QDeclarativePositionSource::setUpdateInterval(
int updateInterval)
399 if (m_positionSource) {
400 int previousUpdateInterval = m_positionSource->updateInterval();
402 m_updateInterval = updateInterval;
404 if (previousUpdateInterval != updateInterval) {
405 m_positionSource->setUpdateInterval(updateInterval);
406 if (previousUpdateInterval != m_positionSource->updateInterval())
407 emit updateIntervalChanged();
410 if (m_updateInterval != updateInterval) {
411 m_updateInterval = updateInterval;
412 emit updateIntervalChanged();
418
419
420
421
422
423
425int QDeclarativePositionSource::updateInterval()
const
427 if (!m_positionSource)
428 return m_updateInterval;
430 return m_positionSource->updateInterval();
434
435
436
437
438
439
440
441
442
443
444
445
446
447
449QDeclarativePositionSource::PositioningMethods
450QDeclarativePositionSource::supportedPositioningMethods()
const
452 return m_supportedPositioningMethods.value();
455QDeclarativePositionSource::PositioningMethods
456QDeclarativePositionSource::supportedMethodsActualComputation()
const
458 if (m_positionSource) {
459 return static_cast<QDeclarativePositionSource::PositioningMethods>(
460 int(m_positionSource->supportedPositioningMethods()));
462 return QDeclarativePositionSource::NoPositioningMethods;
465QBindable<QDeclarativePositionSource::PositioningMethods>
466QDeclarativePositionSource::bindableSupportedPositioningMethods()
const
468 return QBindable<PositioningMethods>(&m_supportedPositioningMethods);
472
473
474
475
476
477
478
479
480
481
482
483
484
485
487void QDeclarativePositionSource::setPreferredPositioningMethods(PositioningMethods methods)
489 if (m_positionSource) {
490 PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
492 m_preferredPositioningMethods = methods;
494 if (previousPreferredPositioningMethods != methods) {
495 m_positionSource->setPreferredPositioningMethods(
496 static_cast<QGeoPositionInfoSource::PositioningMethods>(
int(methods)));
497 if (previousPreferredPositioningMethods != m_positionSource->preferredPositioningMethods())
498 emit preferredPositioningMethodsChanged();
501 if (m_preferredPositioningMethods != methods) {
502 m_preferredPositioningMethods = methods;
503 emit preferredPositioningMethodsChanged();
508QDeclarativePositionSource::PositioningMethods QDeclarativePositionSource::preferredPositioningMethods()
const
510 if (m_positionSource) {
511 return static_cast<QDeclarativePositionSource::PositioningMethods>(
512 int(m_positionSource->preferredPositioningMethods()));
514 return m_preferredPositioningMethods;
518
519
520
521
522
523
524
525
526
527
528
530void QDeclarativePositionSource::start()
532 if (m_positionSource) {
533 m_active.removeBindingUnlessInWrapper();
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
555void QDeclarativePositionSource::update(
int timeout)
557 if (m_positionSource) {
558 m_singleUpdate =
true;
563 m_active.setValueBypassingBindings(
true);
569 m_positionSource->requestUpdate(timeout);
574
575
576
577
578
579
580
581
582
583
584
586void QDeclarativePositionSource::stop()
588 if (m_positionSource) {
589 m_positionSource->stopUpdates();
590 m_regularUpdates =
false;
594 m_active.removeBindingUnlessInWrapper();
595 if (m_active && !m_singleUpdate) {
596 m_active.setValueBypassingBindings(
false);
603
604
605
606
607
608
609
610
611void QDeclarativePositionSource::setActive(
bool active)
615 m_active.removeBindingUnlessInWrapper();
616 if (active == m_active)
622 if (m_componentComplete && m_parametersInitialized)
625 m_startRequested =
true;
631bool QDeclarativePositionSource::isActive()
const
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
653QDeclarativePosition *QDeclarativePositionSource::position()
655 return m_position.value();
658void QDeclarativePositionSource::positionUpdateReceived(
const QGeoPositionInfo &update)
662 if (m_singleUpdate && m_active) {
664 m_singleUpdate =
false;
665 if (!m_regularUpdates) {
668 m_active.setValueBypassingBindings(
false);
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
695QDeclarativePositionSource::SourceError QDeclarativePositionSource::sourceError()
const
697 return m_sourceError;
700QBindable<QDeclarativePositionSource::SourceError>
701QDeclarativePositionSource::bindableSourceError()
const
703 return QBindable<QDeclarativePositionSource::SourceError>(&m_sourceError);
706QGeoPositionInfoSource *QDeclarativePositionSource::positionSource()
const
708 return m_positionSource;
712
713
714
715
716
717
718
719QQmlListProperty<QDeclarativePluginParameter> QDeclarativePositionSource::parameters()
721 return QQmlListProperty<QDeclarativePluginParameter>(
this,
730
731
732void QDeclarativePositionSource::parameter_append(QQmlListProperty<QDeclarativePluginParameter> *prop, QDeclarativePluginParameter *parameter)
734 QDeclarativePositionSource *p =
static_cast<QDeclarativePositionSource *>(prop->object);
735 p->m_parameters.append(parameter);
739
740
741qsizetype QDeclarativePositionSource::parameter_count(QQmlListProperty<QDeclarativePluginParameter> *prop)
743 return static_cast<QDeclarativePositionSource *>(prop->object)->m_parameters.size();
747
748
749QDeclarativePluginParameter *QDeclarativePositionSource::parameter_at(QQmlListProperty<QDeclarativePluginParameter> *prop, qsizetype index)
751 return static_cast<QDeclarativePositionSource *>(prop->object)->m_parameters[index];
755
756
757void QDeclarativePositionSource::parameter_clear(QQmlListProperty<QDeclarativePluginParameter> *prop)
759 QDeclarativePositionSource *p =
static_cast<QDeclarativePositionSource *>(prop->object);
760 p->m_parameters.clear();
763void QDeclarativePositionSource::executeStart()
765 if (m_positionSource) {
766 m_positionSource->startUpdates();
774 m_regularUpdates =
true;
776 m_active.setValueBypassingBindings(
true);
782void QDeclarativePositionSource::componentComplete()
784 m_componentComplete =
true;
785 m_parametersInitialized =
true;
786 for (QDeclarativePluginParameter *p: std::as_const(m_parameters)) {
787 if (!p->isInitialized()) {
788 m_parametersInitialized =
false;
789 connect(p, &QDeclarativePluginParameter::initialized,
790 this, &QDeclarativePositionSource::onParameterInitialized,
791 Qt::SingleShotConnection);
795 if (m_parametersInitialized)
796 tryAttach(m_sourceName.value());
800
801
802
803
804
805
806
807
808
809
810
811bool QDeclarativePositionSource::setBackendProperty(
const QString &name,
const QVariant &value)
813 if (m_positionSource)
814 return m_positionSource->setBackendProperty(name, value);
819
820
821
822
823
824
825
826
827
828
829
830QVariant QDeclarativePositionSource::backendProperty(
const QString &name)
const
832 if (m_positionSource)
833 return m_positionSource->backendProperty(name);
837QBindable<
bool> QDeclarativePositionSource::bindableActive()
839 return QBindable<
bool>(&m_active);
843
844
845void QDeclarativePositionSource::sourceErrorReceived(
const QGeoPositionInfoSource::Error error)
847 if (error == QGeoPositionInfoSource::AccessError)
848 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::AccessError);
849 else if (error == QGeoPositionInfoSource::ClosedError)
850 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::ClosedError);
851 else if (error == QGeoPositionInfoSource::UpdateTimeoutError)
852 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::UpdateTimeoutError);
853 else if (error == QGeoPositionInfoSource::NoError)
856 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::UnknownSourceError);
858 m_sourceError.notify();
859 emit sourceErrorChanged();
863 if (m_active && m_singleUpdate) {
864 m_singleUpdate =
false;
865 if (!m_regularUpdates) {
866 m_active.setValueBypassingBindings(
false);
874#include "moc_qdeclarativepositionsource_p.cpp"