Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qgeopositioninfosource_wasm.cpp
Go to the documentation of this file.
1
// Copyright (C) 2024 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
#
include
"qgeopositioninfosource_wasm_p.h"
6
#
include
"qgeopositioninfosourcedispatcher_wasm_p.h"
7
8
#
include
<
QtCore
/
QDebug
>
9
#
include
<
QtCore
/
QPermission
>
10
#
include
<
QtCore
/
QCoreApplication
>
11
12
#
include
<
emscripten
/
val
.
h
>
13
#
include
<
emscripten
/
bind
.
h
>
14
15
16
// QGeoPositionInfoSource implemented using the Web Geolocation API
17
18
QT_BEGIN_NAMESPACE
19
20
typedef
emscripten
::
val
GeolocationCoordinates
;
21
22
QGeoPositionInfoSourceWasm
::
QGeoPositionInfoSourceWasm
(QObject *parent)
23
:
QGeoPositionInfoSource
(
parent
)
24
{
25
// QGeoPositionInfoSourceWasm should not be constructed if
26
// geolocation support is missing.
27
Q_ASSERT(!geolocation().isUndefined());
28
29
m_dispatcher =
QGeoPositionInfoDispatcherWasm
::
instance
(
)
;
30
m_instanceId = m_dispatcher->registerInfoSourceInstance(
this
);
31
32
successCallback = val::module_property(
"qtGeolocationPositionSuccess"
).call<val>(
"bind"
, val::undefined(), m_instanceId);
33
errorCallback = val::module_property(
"qtGeolocationPositionError"
).call<val>(
"bind"
, val::undefined(), m_instanceId);
34
35
}
36
37
Geolocation
QGeoPositionInfoSourceWasm
::geolocation()
38
{
39
return
val::global(
"navigator"
)[
"geolocation"
];
40
}
41
42
QGeoPositionInfoSourceWasm
::~
QGeoPositionInfoSourceWasm
()
43
{
44
stopUpdates
(
)
;
45
m_dispatcher
->
unregisterInfoSourceInstance
(m_instanceId);
46
}
47
48
void
QGeoPositionInfoSourceWasm
::
setUpdateInterval
(
int
msec)
49
{
50
// If msec is 0 we send updates as data becomes available, otherwise we force msec to be equal
51
// to or larger than the minimum update interval.
52
if
(msec != 0 && msec <
minimumUpdateInterval
(
)
)
53
msec =
minimumUpdateInterval
(
)
;
54
55
QGeoPositionInfoSource::setUpdateInterval(msec);
56
}
57
58
void
QGeoPositionInfoSourceWasm
::startUpdates()
59
{
60
if
(m_updates_running) {
61
qDebug() <<
"startUpdates() is called, but an update is already running."
;
62
return
;
63
}
64
65
if
(preferredPositioningMethods() == 0) {
66
m_lastError = QGeoPositionInfoSource::UnknownSourceError;
67
return
;
68
}
69
70
m_updates_running =
true
;
71
m_lastError = QGeoPositionInfoSource::NoError;
72
73
val options = val::object();
74
options.set(
"maximumAge"
, 0);
75
76
if
(preferredPositioningMethods() & PositioningMethod::SatellitePositioningMethods)
77
options.set(
"enableHighAccuracy"
,
true
);
78
79
m_handlerId = geolocation().call<val>(
"watchPosition"
, successCallback, errorCallback, options);
80
}
81
82
void
QGeoPositionInfoSourceWasm
::
stopUpdates
()
83
{
84
geolocation().call<
void
>(
"clearWatch"
, m_handlerId);
85
m_updates_running =
false
;
86
}
87
88
void
QGeoPositionInfoSourceWasm
::
requestUpdate
(
int
timeout)
89
{
90
if
(timeout <
minimumUpdateInterval
(
)
) {
91
emit errorOccurred(UpdateTimeoutError);
92
return
;
93
}
94
95
if
(m_singleUpdatePending) {
96
qDebug() <<
"requestUpdate() called while a previous update is still pending. Ignoring."
;
97
return
;
98
}
99
100
m_singleUpdatePending =
true
;
101
m_lastError = QGeoPositionInfoSource::NoError;
102
103
val options = val::object();
104
options.set(
"maximumAge"
, 0);
// maximum cache age: 0: don't use cache
105
options.set(
"timeout"
, timeout);
106
107
if
(preferredPositioningMethods() & PositioningMethod::SatellitePositioningMethods)
108
options.set(
"enableHighAccuracy"
,
true
);
109
110
geolocation().call<
void
>(
"getCurrentPosition"
, successCallback, errorCallback, options);
111
}
112
113
QGeoPositionInfoSource
::
PositioningMethods
QGeoPositionInfoSourceWasm
::
supportedPositioningMethods
()
const
114
{
115
return
QGeoPositionInfoSource::AllPositioningMethods;
116
}
117
118
void
QGeoPositionInfoSourceWasm
::
setPreferredPositioningMethods
(PositioningMethods methods)
119
{
120
PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
121
QGeoPositionInfoSource::setPreferredPositioningMethods(methods);
122
if
(previousPreferredPositioningMethods == preferredPositioningMethods())
123
return
;
124
125
if
(m_updates_running)
126
reconfigureRunningSystem();
127
}
128
129
130
int
QGeoPositionInfoSourceWasm
::
minimumUpdateInterval
()
const
131
{
132
return
1000;
133
}
134
135
QGeoPositionInfo
QGeoPositionInfoSourceWasm
::
lastKnownPosition
(
bool
fromSatellitePositioningMethodsOnly)
const
136
{
137
Q_UNUSED(fromSatellitePositioningMethodsOnly);
138
return
m_lastKnownPosition;
139
}
140
141
QGeoPositionInfoSource
::
Error
QGeoPositionInfoSourceWasm
::
error
()
const
142
{
143
qDebug() <<
"QGeoPositionInfoSourceWasm::error"
;
144
return
m_lastError;
145
}
146
147
void
QGeoPositionInfoSourceWasm
::
geolocationSuccess
(
GeolocationPosition
position)
148
{
149
// Populate a QGeoPositionInfo from the native GeolocationPosition. Some
150
// attributes are optional and may be null.
151
QGeoPositionInfo info;
152
info.setTimestamp(QDateTime::fromMSecsSinceEpoch(position[
"timestamp"
].as<
double
>()));
153
154
GeolocationCoordinates
coords = position[
"coords"
];
155
val latitude = coords[
"latitude"
];
156
val longitude = coords[
"longitude"
];
157
val altitude = coords[
"altitude"
];
158
info.setCoordinate(altitude.isNull() ?
159
QGeoCoordinate(latitude.as<
double
>(), longitude.as<
double
>()) :
160
QGeoCoordinate(latitude.as<
double
>(), longitude.as<
double
>(), altitude.as<
double
>())
161
);
162
163
if
(val speed = coords[
"speed"
]; !speed.isNull())
164
info.setAttribute(QGeoPositionInfo::GroundSpeed, speed.as<
double
>());
165
if
(val heading = coords[
"heading"
]; !heading.isNull())
166
info.setAttribute(QGeoPositionInfo::Direction, heading.as<
double
>());
167
168
info.setAttribute(QGeoPositionInfo::HorizontalAccuracy, coords[
"accuracy"
].as<
double
>());
169
if
(val altitudeAccuracy = coords[
"altitudeAccuracy"
]; !altitudeAccuracy.isNull())
170
info.setAttribute(QGeoPositionInfo::VerticalAccuracy, altitudeAccuracy.as<
double
>());
171
172
m_lastKnownPosition = info;
173
m_singleUpdatePending =
false
;
174
175
emit positionUpdated(info);
176
}
177
178
void
QGeoPositionInfoSourceWasm
::
geolocationError
(
GeolocationPositionError
error)
179
{
180
qDebug() <<
"geolocationError"
;
181
qDebug() <<
"Handler ID:"
<< m_handlerId.as<
int
>();
182
183
int
code = error[
"code"
].as<
int
>();
184
QString message = error[
"message"
].as<QString>();
185
186
QGeoPositionInfoSource::Error qtError = QGeoPositionInfoSource::UnknownSourceError;
187
188
switch
(code) {
189
case
1:
190
qtError = QGeoPositionInfoSource::AccessError;
// -> PERMISSION_DENIED
191
break
;
192
case
2:
193
qtError = QGeoPositionInfoSource::UnknownSourceError;
// -> POSITION_UNAVAILABLE
194
break
;
195
case
3:
196
qtError = QGeoPositionInfoSource::UpdateTimeoutError;
// -> TIMEOUT
197
break
;
198
}
199
200
qDebug() <<
"Message: "
<< message;
201
202
m_lastError = qtError;
203
m_singleUpdatePending =
false
;
204
205
emit errorOccurred(qtError);
206
}
207
208
void
QGeoPositionInfoSourceWasm
::reconfigureRunningSystem()
209
{
210
if
(!m_updates_running)
211
return
;
212
213
stopUpdates
(
)
;
214
startUpdates();
215
}
216
217
218
QT_END_NAMESPACE
219
220
#
include
"moc_qgeopositioninfosource_wasm_p.cpp"
QGeoPositionInfoDispatcherWasm
Definition
qgeopositioninfosourcedispatcher_wasm_p.h:24
QGeoPositionInfoDispatcherWasm::instance
static QGeoPositionInfoDispatcherWasm * instance()
Definition
qgeopositioninfosourcedispatcher_wasm.cpp:53
QGeoPositionInfoDispatcherWasm::unregisterInfoSourceInstance
void unregisterInfoSourceInstance(int instanceId)
Definition
qgeopositioninfosourcedispatcher_wasm.cpp:37
QGeoPositionInfoSourceWasm
Definition
qgeopositioninfosource_wasm_p.h:37
QGeoPositionInfoSourceWasm::stopUpdates
void stopUpdates() override
Definition
qgeopositioninfosource_wasm.cpp:82
QGeoPositionInfoSourceWasm::geolocationError
void geolocationError(GeolocationPositionError error)
Definition
qgeopositioninfosource_wasm.cpp:178
QGeoPositionInfoSourceWasm::error
Error error() const override
Returns the type of error that last occurred.
Definition
qgeopositioninfosource_wasm.cpp:141
QGeoPositionInfoSourceWasm::setPreferredPositioningMethods
void setPreferredPositioningMethods(PositioningMethods methods) override
Definition
qgeopositioninfosource_wasm.cpp:118
QGeoPositionInfoSourceWasm::~QGeoPositionInfoSourceWasm
~QGeoPositionInfoSourceWasm()
Definition
qgeopositioninfosource_wasm.cpp:42
QGeoPositionInfoSourceWasm::requestUpdate
void requestUpdate(int timeout=0) override
Definition
qgeopositioninfosource_wasm.cpp:88
QGeoPositionInfoSourceWasm::supportedPositioningMethods
PositioningMethods supportedPositioningMethods() const override
Returns the positioning methods available to this source.
Definition
qgeopositioninfosource_wasm.cpp:113
QGeoPositionInfoSourceWasm::geolocationSuccess
void geolocationSuccess(GeolocationPosition position)
Definition
qgeopositioninfosource_wasm.cpp:147
QGeoPositionInfoSourceWasm::setUpdateInterval
void setUpdateInterval(int msec) override
Definition
qgeopositioninfosource_wasm.cpp:48
QGeoPositionInfoSourceWasm::minimumUpdateInterval
int minimumUpdateInterval() const override
Definition
qgeopositioninfosource_wasm.cpp:130
QGeoPositionInfoSourceWasm::QGeoPositionInfoSourceWasm
QGeoPositionInfoSourceWasm(QObject *parent=0)
Definition
qgeopositioninfosource_wasm.cpp:22
QGeoPositionInfoSourceWasm::lastKnownPosition
QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly=false) const override
Returns an update containing the last known position, or a null update if none is available.
Definition
qgeopositioninfosource_wasm.cpp:135
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
GeolocationCoordinates
QT_BEGIN_NAMESPACE typedef emscripten::val GeolocationCoordinates
Definition
qgeopositioninfosource_wasm.cpp:20
Geolocation
emscripten::val Geolocation
Definition
qgeopositioninfosource_wasm_p.h:30
GeolocationPositionError
emscripten::val GeolocationPositionError
Definition
qgeopositioninfosource_wasm_p.h:31
GeolocationPosition
emscripten::val GeolocationPosition
Definition
qgeopositioninfosource_wasm_p.h:29
qtpositioning
src
plugins
position
wasm
qgeopositioninfosource_wasm.cpp
Generated on
for Qt by
1.18.0