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
447QDeclarativePositionSource::PositioningMethods
448QDeclarativePositionSource::supportedPositioningMethods()
const
450 return m_supportedPositioningMethods.value();
453QDeclarativePositionSource::PositioningMethods
454QDeclarativePositionSource::supportedMethodsActualComputation()
const
456 if (m_positionSource) {
457 return static_cast<QDeclarativePositionSource::PositioningMethods>(
458 int(m_positionSource->supportedPositioningMethods()));
460 return QDeclarativePositionSource::NoPositioningMethods;
463QBindable<QDeclarativePositionSource::PositioningMethods>
464QDeclarativePositionSource::bindableSupportedPositioningMethods()
const
466 return QBindable<PositioningMethods>(&m_supportedPositioningMethods);
470
471
472
473
474
475
476
477
478
479
480
481
482
484void QDeclarativePositionSource::setPreferredPositioningMethods(PositioningMethods methods)
486 if (m_positionSource) {
487 PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
489 m_preferredPositioningMethods = methods;
491 if (previousPreferredPositioningMethods != methods) {
492 m_positionSource->setPreferredPositioningMethods(
493 static_cast<QGeoPositionInfoSource::PositioningMethods>(
int(methods)));
494 if (previousPreferredPositioningMethods != m_positionSource->preferredPositioningMethods())
495 emit preferredPositioningMethodsChanged();
498 if (m_preferredPositioningMethods != methods) {
499 m_preferredPositioningMethods = methods;
500 emit preferredPositioningMethodsChanged();
505QDeclarativePositionSource::PositioningMethods QDeclarativePositionSource::preferredPositioningMethods()
const
507 if (m_positionSource) {
508 return static_cast<QDeclarativePositionSource::PositioningMethods>(
509 int(m_positionSource->preferredPositioningMethods()));
511 return m_preferredPositioningMethods;
515
516
517
518
519
520
521
522
523
524
525
527void QDeclarativePositionSource::start()
529 if (m_positionSource) {
530 m_active.removeBindingUnlessInWrapper();
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
552void QDeclarativePositionSource::update(
int timeout)
554 if (m_positionSource) {
555 m_singleUpdate =
true;
560 m_active.setValueBypassingBindings(
true);
566 m_positionSource->requestUpdate(timeout);
571
572
573
574
575
576
577
578
579
580
581
583void QDeclarativePositionSource::stop()
585 if (m_positionSource) {
586 m_positionSource->stopUpdates();
587 m_regularUpdates =
false;
591 m_active.removeBindingUnlessInWrapper();
592 if (m_active && !m_singleUpdate) {
593 m_active.setValueBypassingBindings(
false);
600
601
602
603
604
605
606
607
608void QDeclarativePositionSource::setActive(
bool active)
612 m_active.removeBindingUnlessInWrapper();
613 if (active == m_active)
619 if (m_componentComplete && m_parametersInitialized)
622 m_startRequested =
true;
628bool QDeclarativePositionSource::isActive()
const
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
650QDeclarativePosition *QDeclarativePositionSource::position()
652 return m_position.value();
655void QDeclarativePositionSource::positionUpdateReceived(
const QGeoPositionInfo &update)
659 if (m_singleUpdate && m_active) {
661 m_singleUpdate =
false;
662 if (!m_regularUpdates) {
665 m_active.setValueBypassingBindings(
false);
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
692QDeclarativePositionSource::SourceError QDeclarativePositionSource::sourceError()
const
694 return m_sourceError;
697QBindable<QDeclarativePositionSource::SourceError>
698QDeclarativePositionSource::bindableSourceError()
const
700 return QBindable<QDeclarativePositionSource::SourceError>(&m_sourceError);
703QGeoPositionInfoSource *QDeclarativePositionSource::positionSource()
const
705 return m_positionSource;
709
710
711
712
713
714
715
716QQmlListProperty<QDeclarativePluginParameter> QDeclarativePositionSource::parameters()
718 return QQmlListProperty<QDeclarativePluginParameter>(
this,
727
728
729void QDeclarativePositionSource::parameter_append(QQmlListProperty<QDeclarativePluginParameter> *prop, QDeclarativePluginParameter *parameter)
731 QDeclarativePositionSource *p =
static_cast<QDeclarativePositionSource *>(prop->object);
732 p->m_parameters.append(parameter);
736
737
738qsizetype QDeclarativePositionSource::parameter_count(QQmlListProperty<QDeclarativePluginParameter> *prop)
740 return static_cast<QDeclarativePositionSource *>(prop->object)->m_parameters.size();
744
745
746QDeclarativePluginParameter *QDeclarativePositionSource::parameter_at(QQmlListProperty<QDeclarativePluginParameter> *prop, qsizetype index)
748 return static_cast<QDeclarativePositionSource *>(prop->object)->m_parameters[index];
752
753
754void QDeclarativePositionSource::parameter_clear(QQmlListProperty<QDeclarativePluginParameter> *prop)
756 QDeclarativePositionSource *p =
static_cast<QDeclarativePositionSource *>(prop->object);
757 p->m_parameters.clear();
760void QDeclarativePositionSource::executeStart()
762 if (m_positionSource) {
763 m_positionSource->startUpdates();
771 m_regularUpdates =
true;
773 m_active.setValueBypassingBindings(
true);
779void QDeclarativePositionSource::componentComplete()
781 m_componentComplete =
true;
782 m_parametersInitialized =
true;
783 for (QDeclarativePluginParameter *p: std::as_const(m_parameters)) {
784 if (!p->isInitialized()) {
785 m_parametersInitialized =
false;
786 connect(p, &QDeclarativePluginParameter::initialized,
787 this, &QDeclarativePositionSource::onParameterInitialized,
788 Qt::SingleShotConnection);
792 if (m_parametersInitialized)
793 tryAttach(m_sourceName.value());
797
798
799
800
801
802
803
804
805
806
807
808bool QDeclarativePositionSource::setBackendProperty(
const QString &name,
const QVariant &value)
810 if (m_positionSource)
811 return m_positionSource->setBackendProperty(name, value);
816
817
818
819
820
821
822
823
824
825
826
827QVariant QDeclarativePositionSource::backendProperty(
const QString &name)
const
829 if (m_positionSource)
830 return m_positionSource->backendProperty(name);
834QBindable<
bool> QDeclarativePositionSource::bindableActive()
836 return QBindable<
bool>(&m_active);
840
841
842void QDeclarativePositionSource::sourceErrorReceived(
const QGeoPositionInfoSource::Error error)
844 if (error == QGeoPositionInfoSource::AccessError)
845 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::AccessError);
846 else if (error == QGeoPositionInfoSource::ClosedError)
847 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::ClosedError);
848 else if (error == QGeoPositionInfoSource::UpdateTimeoutError)
849 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::UpdateTimeoutError);
850 else if (error == QGeoPositionInfoSource::NoError)
853 m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::UnknownSourceError);
855 m_sourceError.notify();
856 emit sourceErrorChanged();
860 if (m_active && m_singleUpdate) {
861 m_singleUpdate =
false;
862 if (!m_regularUpdates) {
863 m_active.setValueBypassingBindings(
false);
871#include "moc_qdeclarativepositionsource_p.cpp"