7#include <QtCore/QCoreApplication>
8#include <QtQml/qqmlinfo.h>
10#include <qdeclarativepluginparameter_p.h>
12#include <QtNetwork/QTcpSocket>
18
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
149QDeclarativePositionSource::QDeclarativePositionSource()
150 : m_singleUpdate(0), m_regularUpdates(0), m_componentComplete(0),
151 m_parametersInitialized(0), m_startRequested(0), m_defaultSourceUsed(0)
153 m_position.setValueBypassingBindings(
new QDeclarativePosition(
this));
156QDeclarativePositionSource::~QDeclarativePositionSource()
158 delete m_positionSource;
163
164
165
166
167
168
169
170
171
172
173
174
175
178QString QDeclarativePositionSource::name()
const
183void QDeclarativePositionSource::setName(
const QString &newName)
185 m_sourceName.removeBindingUnlessInWrapper();
186 if (m_positionSource && m_positionSource->sourceName() == newName)
189 if (newName.isEmpty() && m_defaultSourceUsed)
192 const QString previousName = m_sourceName.valueBypassingBindings();
194 if (!m_componentComplete || !m_parametersInitialized) {
195 if (previousName != newName) {
196 m_sourceName.setValueBypassingBindings(newName);
197 m_sourceName.notify();
203 tryAttach(newName,
false);
206QBindable<QString> QDeclarativePositionSource::bindableName()
208 return QBindable<QString>(&m_sourceName);
211QBindable<QDeclarativePosition *> QDeclarativePositionSource::bindablePosition()
const
213 return QBindable<QDeclarativePosition *>(&m_position);
217
218
219void QDeclarativePositionSource::tryAttach(
const QString &newName,
bool useFallback)
221 const QString previousName = name();
222 const bool sourceExisted = (m_positionSource !=
nullptr);
224 int previousUpdateInterval = updateInterval();
225 PositioningMethods previousPositioningMethods = supportedPositioningMethods();
226 PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
228 m_defaultSourceUsed =
false;
230 if (newName.isEmpty()) {
231 setSource(QGeoPositionInfoSource::createDefaultSource(parameterMap(),
this));
232 m_defaultSourceUsed =
true;
234 setSource(QGeoPositionInfoSource::createSource(newName, parameterMap(),
this));
235 if (!m_positionSource && useFallback) {
236 setSource(QGeoPositionInfoSource::createDefaultSource(parameterMap(),
this));
237 m_defaultSourceUsed =
true;
241 if (m_positionSource) {
242 m_sourceName.setValueBypassingBindings(m_positionSource->sourceName());
244 connect(m_positionSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
245 this, SLOT(positionUpdateReceived(QGeoPositionInfo)));
246 connect(m_positionSource, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error)),
247 this, SLOT(sourceErrorReceived(QGeoPositionInfoSource::Error)));
249 m_positionSource->setUpdateInterval(m_updateInterval);
250 m_positionSource->setPreferredPositioningMethods(
251 static_cast<QGeoPositionInfoSource::PositioningMethods>(
int(m_preferredPositioningMethods)));
253 if (m_startRequested) {
254 const QGeoPositionInfo &lastKnown = m_positionSource->lastKnownPosition();
255 if (lastKnown.isValid())
256 setPosition(lastKnown);
259 m_sourceName.setValueBypassingBindings(newName);
260 m_defaultSourceUsed =
false;
265 m_active.setValueBypassingBindings(
false);
270 if (previousUpdateInterval != updateInterval())
271 emit updateIntervalChanged();
273 if (previousPreferredPositioningMethods != preferredPositioningMethods())
274 emit preferredPositioningMethodsChanged();
276 if (previousPositioningMethods != supportedPositioningMethods())
277 notifySupportedPositioningMethodsChanged();
279 const bool sourceCurrentlyExists = (m_positionSource !=
nullptr);
280 if (sourceExisted != sourceCurrentlyExists) {
282 emit validityChanged();
287 Q_ASSERT(sourceExisted);
290 m_active.setValueBypassingBindings(
false);
292 }
else if (m_startRequested) {
293 m_startRequested =
false;
297 if (previousName != m_sourceName)
298 m_sourceName.notify();
302
303
304
305
306
307
308
309
310
311bool QDeclarativePositionSource::isValid()
const
313 return m_isValid.value();
316QBindable<
bool> QDeclarativePositionSource::bindableIsValid()
const
318 return QBindable<
bool>(&m_isValid);
321bool QDeclarativePositionSource::isValidActualComputation()
const
323 return m_positionSource !=
nullptr;
327
328
329void QDeclarativePositionSource::onParameterInitialized()
331 m_parametersInitialized =
true;
332 for (QDeclarativePluginParameter *p: std::as_const(m_parameters)) {
333 if (!p->isInitialized()) {
334 m_parametersInitialized =
false;
340 if (m_parametersInitialized)
341 tryAttach(m_sourceName.value());
344void QDeclarativePositionSource::notifySupportedPositioningMethodsChanged()
346 m_supportedPositioningMethods.notify();
347 emit supportedPositioningMethodsChanged();
350void QDeclarativePositionSource::setPosition(
const QGeoPositionInfo &pi)
352 m_position.value()->setPosition(pi);
354 emit positionChanged();
357void QDeclarativePositionSource::setSource(QGeoPositionInfoSource *source)
359 if (m_positionSource)
360 delete m_positionSource;
363 m_positionSource =
nullptr;
365 m_positionSource = source;
366 connect(m_positionSource, &QGeoPositionInfoSource::supportedPositioningMethodsChanged,
367 this, &QDeclarativePositionSource::notifySupportedPositioningMethodsChanged);
371bool QDeclarativePositionSource::parametersReady()
373 for (
const QDeclarativePluginParameter *p: std::as_const(m_parameters)) {
374 if (!p->isInitialized())
381
382
383QVariantMap QDeclarativePositionSource::parameterMap()
const
387 for (
const auto *parameter : m_parameters)
388 map.insert(parameter->name(), parameter->value());
394
395
396void QDeclarativePositionSource::setUpdateInterval(
int updateInterval)
398 if (m_positionSource) {
399 int previousUpdateInterval = m_positionSource->updateInterval();
401 m_updateInterval = updateInterval;
403 if (previousUpdateInterval != updateInterval) {
404 m_positionSource->setUpdateInterval(updateInterval);
405 if (previousUpdateInterval != m_positionSource->updateInterval())
406 emit updateIntervalChanged();
409 if (m_updateInterval != updateInterval) {
410 m_updateInterval = updateInterval;
411 emit updateIntervalChanged();
417
418
419
420
421
422
424int QDeclarativePositionSource::updateInterval()
const
426 if (!m_positionSource)
427 return m_updateInterval;
429 return m_positionSource->updateInterval();
433
434
435
436
437
438
439
440
441
442
443
444
445
446
448QDeclarativePositionSource::PositioningMethods
449QDeclarativePositionSource::supportedPositioningMethods()
const
451 return m_supportedPositioningMethods.value();
454QDeclarativePositionSource::PositioningMethods
455QDeclarativePositionSource::supportedMethodsActualComputation()
const
457 if (m_positionSource) {
458 return static_cast<QDeclarativePositionSource::PositioningMethods>(
459 int(m_positionSource->supportedPositioningMethods()));
461 return QDeclarativePositionSource::NoPositioningMethods;
464QBindable<QDeclarativePositionSource::PositioningMethods>
465QDeclarativePositionSource::bindableSupportedPositioningMethods()
const
467 return QBindable<PositioningMethods>(&m_supportedPositioningMethods);
471
472
473
474
475
476
477
478
479
480
481
482
483
484
486void QDeclarativePositionSource::setPreferredPositioningMethods(PositioningMethods methods)
488 if (m_positionSource) {
489 PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
491 m_preferredPositioningMethods = methods;
493 if (previousPreferredPositioningMethods != methods) {
494 m_positionSource->setPreferredPositioningMethods(
495 static_cast<QGeoPositionInfoSource::PositioningMethods>(
int(methods)));
496 if (previousPreferredPositioningMethods != m_positionSource->preferredPositioningMethods())
497 emit preferredPositioningMethodsChanged();
500 if (m_preferredPositioningMethods != methods) {
501 m_preferredPositioningMethods = methods;
502 emit preferredPositioningMethodsChanged();
507QDeclarativePositionSource::PositioningMethods QDeclarativePositionSource::preferredPositioningMethods()
const
509 if (m_positionSource) {
510 return static_cast<QDeclarativePositionSource::PositioningMethods>(
511 int(m_positionSource->preferredPositioningMethods()));
513 return m_preferredPositioningMethods;
517
518
519
520
521
522
523
524
525
526
527
529void QDeclarativePositionSource::start()
531 if (m_positionSource) {
532 m_active.removeBindingUnlessInWrapper();
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
554void QDeclarativePositionSource::update(
int timeout)
556 if (m_positionSource) {
557 m_singleUpdate =
true;
562 m_active.setValueBypassingBindings(
true);
568 m_positionSource->requestUpdate(timeout);
573
574
575
576
577
578
579
580
581
582
583
585void QDeclarativePositionSource::stop()
587 if (m_positionSource) {
588 m_positionSource->stopUpdates();
589 m_regularUpdates =
false;
593 m_active.removeBindingUnlessInWrapper();
594 if (m_active && !m_singleUpdate) {
595 m_active.setValueBypassingBindings(
false);
602
603
604
605
606
607
608
609
610void QDeclarativePositionSource::setActive(
bool active)
614 m_active.removeBindingUnlessInWrapper();
615 if (active == m_active)
621 if (m_componentComplete && m_parametersInitialized)
624 m_startRequested =
true;
630bool QDeclarativePositionSource::isActive()
const
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
652QDeclarativePosition *QDeclarativePositionSource::position()
654 return m_position.value();
657void QDeclarativePositionSource::positionUpdateReceived(
const QGeoPositionInfo &update)
661 if (m_singleUpdate && m_active) {
663 m_singleUpdate =
false;
664 if (!m_regularUpdates) {
667 m_active.setValueBypassingBindings(
false);
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
694QDeclarativePositionSource::SourceError QDeclarativePositionSource::sourceError()
const
696 return m_sourceError;
699QBindable<QDeclarativePositionSource::SourceError>
700QDeclarativePositionSource::bindableSourceError()
const
702 return QBindable<QDeclarativePositionSource::SourceError>(&m_sourceError);
705QGeoPositionInfoSource *QDeclarativePositionSource::positionSource()
const
707 return m_positionSource;
711
712
713
714
715
716
717
718QQmlListProperty<QDeclarativePluginParameter> QDeclarativePositionSource::parameters()
720 return QQmlListProperty<QDeclarativePluginParameter>(
this,
729
730
731void QDeclarativePositionSource::parameter_append(QQmlListProperty<QDeclarativePluginParameter> *prop, QDeclarativePluginParameter *parameter)
733 QDeclarativePositionSource *p =
static_cast<QDeclarativePositionSource *>(prop->object);
734 p->m_parameters.append(parameter);
738
739
740qsizetype QDeclarativePositionSource::parameter_count(QQmlListProperty<QDeclarativePluginParameter> *prop)
742 return static_cast<QDeclarativePositionSource *>(prop->object)->m_parameters.size();
746
747
748QDeclarativePluginParameter *QDeclarativePositionSource::parameter_at(QQmlListProperty<QDeclarativePluginParameter> *prop, qsizetype index)
750 return static_cast<QDeclarativePositionSource *>(prop->object)->m_parameters[index];
754
755
756void QDeclarativePositionSource::parameter_clear(QQmlListProperty<QDeclarativePluginParameter> *prop)
758 QDeclarativePositionSource *p =
static_cast<QDeclarativePositionSource *>(prop->object);
759 p->m_parameters.clear();
762void QDeclarativePositionSource::executeStart()
764 if (m_positionSource) {
765 m_positionSource->startUpdates();
773 m_regularUpdates =
true;
775 m_active.setValueBypassingBindings(
true);
781void QDeclarativePositionSource::componentComplete()
783 m_componentComplete =
true;
784 m_parametersInitialized =
true;
785 for (QDeclarativePluginParameter *p: std::as_const(m_parameters)) {
786 if (!p->isInitialized()) {
787 m_parametersInitialized =
false;
788 connect(p, &QDeclarativePluginParameter::initialized,
789 this, &QDeclarativePositionSource::onParameterInitialized,
790 Qt::SingleShotConnection);
794 if (m_parametersInitialized)
795 tryAttach(m_sourceName.value());
799
800
801
802
803
804
805
806
807
808
809
810bool QDeclarativePositionSource::setBackendProperty(
const QString &name,
const QVariant &value)
812 if (m_positionSource)
813 return m_positionSource->setBackendProperty(name, value);
818
819
820
821
822
823
824
825
826
827
828
829QVariant QDeclarativePositionSource::backendProperty(
const QString &name)
const
831 if (m_positionSource)
832 return m_positionSource->backendProperty(name);
836QBindable<
bool> QDeclarativePositionSource::bindableActive()
838 return QBindable<
bool>(&m_active);
842
843
844void QDeclarativePositionSource::sourceErrorReceived(
const QGeoPositionInfoSource::Error error)
846 if (error == QGeoPositionInfoSource::AccessError)
847 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::AccessError);
848 else if (error == QGeoPositionInfoSource::ClosedError)
849 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::ClosedError);
850 else if (error == QGeoPositionInfoSource::UpdateTimeoutError)
851 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::UpdateTimeoutError);
852 else if (error == QGeoPositionInfoSource::NoError)
855 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::UnknownSourceError);
857 m_sourceError.notify();
858 emit sourceErrorChanged();
862 if (m_active && m_singleUpdate) {
863 m_singleUpdate =
false;
864 if (!m_regularUpdates) {
865 m_active.setValueBypassingBindings(
false);
873#include "moc_qdeclarativepositionsource_p.cpp"