12#include <QtCore/QJsonDocument>
13#include <QtCore/QJsonObject>
14#include <QtCore/QJsonArray>
15#include <QtCore/QUrlQuery>
16#include <QtPositioning/qgeopath.h>
18#include <QtCore/private/qobject_p.h>
19#include <QtPositioning/private/qlocationutils_p.h>
31 bool parsingLatitude =
true;
39 unsigned char c =
data.at(
i) - 63;
50 if (parsingLatitude) {
51 coord.setLatitude(
coord.latitude() + (double)diff/1e6);
53 coord.setLongitude(
coord.longitude() + (double)diff/1e6);
57 parsingLatitude = !parsingLatitude;
72 return QGeoRouteParserOsrmV5::tr(
"North");
74 return QGeoRouteParserOsrmV5::tr(
"East");
76 return QGeoRouteParserOsrmV5::tr(
"South");
78 return QGeoRouteParserOsrmV5::tr(
"West");
88 if (!ordinals.
size()) {
91 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"first",
"roundabout exit"));
92 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"second",
"roundabout exit"));
93 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"third",
"roundabout exit"));
94 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"fourth",
"roundabout exit"));
95 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"fifth",
"roundabout exit"));
96 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"sixth",
"roundabout exit"));
97 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"seventh",
"roundabout exit"));
98 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"eighth",
"roundabout exit"));
99 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"ninth",
"roundabout exit"));
100 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"tenth",
"roundabout exit"));
101 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"eleventh",
"roundabout exit"));
102 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"twelfth",
"roundabout exit"));
103 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"thirteenth",
"roundabout exit"));
104 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"fourteenth",
"roundabout exit"));
105 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"fifteenth",
"roundabout exit"));
106 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"sixteenth",
"roundabout exit"));
107 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"seventeenth",
"roundabout exit"));
108 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"eighteenth",
"roundabout exit"));
109 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"nineteenth",
"roundabout exit"));
110 ordinals.
append(QGeoRouteParserOsrmV5::tr(
"twentieth",
"roundabout exit"));
113 if (exit < 1 || exit > ordinals.
size())
115 return ordinals[exit];
125 static QString directionExit = QGeoRouteParserOsrmV5::tr(
" and take the %1 exit");
126 static QString directionExitOnto = QGeoRouteParserOsrmV5::tr(
" and take the %1 exit onto %2");
128 if (exit < 1 || exit > 20)
140 return QGeoRouteParserOsrmV5::tr(
"You have arrived at your destination, straight ahead");
146 return QGeoRouteParserOsrmV5::tr(
"You have arrived at your destination, on the left");
152 return QGeoRouteParserOsrmV5::tr(
"You have arrived at your destination, on the right");
154 return QGeoRouteParserOsrmV5::tr(
"You have arrived at your destination");
163 return QGeoRouteParserOsrmV5::tr(
"Continue straight");
165 return QGeoRouteParserOsrmV5::tr(
"Continue straight on %1").arg(wayName);
169 return QGeoRouteParserOsrmV5::tr(
"Continue left");
171 return QGeoRouteParserOsrmV5::tr(
"Continue left onto %1").arg(wayName);
175 return QGeoRouteParserOsrmV5::tr(
"Continue slightly left");
177 return QGeoRouteParserOsrmV5::tr(
"Continue slightly left on %1").arg(wayName);
181 return QGeoRouteParserOsrmV5::tr(
"Continue right");
183 return QGeoRouteParserOsrmV5::tr(
"Continue right onto %1").arg(wayName);
187 return QGeoRouteParserOsrmV5::tr(
"Continue slightly right");
189 return QGeoRouteParserOsrmV5::tr(
"Continue slightly right on %1").arg(wayName);
193 return QGeoRouteParserOsrmV5::tr(
"Make a U-turn");
195 return QGeoRouteParserOsrmV5::tr(
"Make a U-turn onto %1").arg(wayName);
198 return QGeoRouteParserOsrmV5::tr(
"Continue");
200 return QGeoRouteParserOsrmV5::tr(
"Continue on %1").arg(wayName);
207 if (bearing >= 0.0) {
215 return QGeoRouteParserOsrmV5::tr(
"Depart");
217 return QGeoRouteParserOsrmV5::tr(
"Depart onto %1").arg(wayName);
229 return QGeoRouteParserOsrmV5::tr(
"At the end of the road, turn left");
231 return QGeoRouteParserOsrmV5::tr(
"At the end of the road, turn left onto %1").arg(wayName);
237 return QGeoRouteParserOsrmV5::tr(
"At the end of the road, turn right");
239 return QGeoRouteParserOsrmV5::tr(
"At the end of the road, turn right onto %1").arg(wayName);
243 return QGeoRouteParserOsrmV5::tr(
"At the end of the road, make a U-turn");
245 return QGeoRouteParserOsrmV5::tr(
"At the end of the road, make a U-turn onto %1").arg(wayName);
248 return QGeoRouteParserOsrmV5::tr(
"At the end of the road, continue straight");
250 return QGeoRouteParserOsrmV5::tr(
"At the end of the road, continue straight onto %1").arg(wayName);
253 return QGeoRouteParserOsrmV5::tr(
"At the end of the road, continue");
255 return QGeoRouteParserOsrmV5::tr(
"At the end of the road, continue onto %1").arg(wayName);
261 QString instruction = QGeoRouteParserOsrmV5::tr(
"Take the ferry");
273 return QGeoRouteParserOsrmV5::tr(
"At the fork, take a sharp left");
275 return QGeoRouteParserOsrmV5::tr(
"At the fork, take a sharp left onto %1").arg(wayName);
278 return QGeoRouteParserOsrmV5::tr(
"At the fork, turn left");
280 return QGeoRouteParserOsrmV5::tr(
"At the fork, turn left onto %1").arg(wayName);
284 return QGeoRouteParserOsrmV5::tr(
"At the fork, keep left");
286 return QGeoRouteParserOsrmV5::tr(
"At the fork, keep left onto %1").arg(wayName);
289 return QGeoRouteParserOsrmV5::tr(
"At the fork, take a sharp right");
291 return QGeoRouteParserOsrmV5::tr(
"At the fork, take a sharp right onto %1").arg(wayName);
294 return QGeoRouteParserOsrmV5::tr(
"At the fork, turn right");
296 return QGeoRouteParserOsrmV5::tr(
"At the fork, turn right onto %1").arg(wayName);
300 return QGeoRouteParserOsrmV5::tr(
"At the fork, keep right");
302 return QGeoRouteParserOsrmV5::tr(
"At the fork, keep right onto %1").arg(wayName);
306 return QGeoRouteParserOsrmV5::tr(
"Make a U-turn");
308 return QGeoRouteParserOsrmV5::tr(
"Make a U-turn onto %1").arg(wayName);
311 return QGeoRouteParserOsrmV5::tr(
"At the fork, continue straight ahead");
313 return QGeoRouteParserOsrmV5::tr(
"At the fork, continue straight ahead onto %1").arg(wayName);
316 return QGeoRouteParserOsrmV5::tr(
"At the fork, continue");
318 return QGeoRouteParserOsrmV5::tr(
"At the fork, continue onto %1").arg(wayName);
328 return QGeoRouteParserOsrmV5::tr(
"Merge sharply left");
330 return QGeoRouteParserOsrmV5::tr(
"Merge sharply left onto %1").arg(wayName);
333 return QGeoRouteParserOsrmV5::tr(
"Merge left");
335 return QGeoRouteParserOsrmV5::tr(
"Merge left onto %1").arg(wayName);
339 return QGeoRouteParserOsrmV5::tr(
"Merge slightly left");
341 return QGeoRouteParserOsrmV5::tr(
"Merge slightly left on %1").arg(wayName);
345 return QGeoRouteParserOsrmV5::tr(
"Merge sharply right");
347 return QGeoRouteParserOsrmV5::tr(
"Merge sharply right onto %1").arg(wayName);
350 return QGeoRouteParserOsrmV5::tr(
"Merge right");
352 return QGeoRouteParserOsrmV5::tr(
"Merge right onto %1").arg(wayName);
356 return QGeoRouteParserOsrmV5::tr(
"Merge slightly right");
358 return QGeoRouteParserOsrmV5::tr(
"Merge slightly right on %1").arg(wayName);
361 return QGeoRouteParserOsrmV5::tr(
"Merge straight");
363 return QGeoRouteParserOsrmV5::tr(
"Merge straight on %1").arg(wayName);
366 return QGeoRouteParserOsrmV5::tr(
"Merge");
368 return QGeoRouteParserOsrmV5::tr(
"Merge onto %1").arg(wayName);
377 return QGeoRouteParserOsrmV5::tr(
"Take a sharp left");
379 return QGeoRouteParserOsrmV5::tr(
"Take a sharp left onto %1").arg(wayName);
382 return QGeoRouteParserOsrmV5::tr(
"Turn left");
384 return QGeoRouteParserOsrmV5::tr(
"Turn left onto %1").arg(wayName);
388 return QGeoRouteParserOsrmV5::tr(
"Continue slightly left");
390 return QGeoRouteParserOsrmV5::tr(
"Continue slightly left onto %1").arg(wayName);
393 return QGeoRouteParserOsrmV5::tr(
"Take a sharp right");
395 return QGeoRouteParserOsrmV5::tr(
"Take a sharp right onto %1").arg(wayName);
398 return QGeoRouteParserOsrmV5::tr(
"Turn right");
400 return QGeoRouteParserOsrmV5::tr(
"Turn right onto %1").arg(wayName);
404 return QGeoRouteParserOsrmV5::tr(
"Continue slightly right");
406 return QGeoRouteParserOsrmV5::tr(
"Continue slightly right onto %1").arg(wayName);
410 return QGeoRouteParserOsrmV5::tr(
"Make a U-turn");
412 return QGeoRouteParserOsrmV5::tr(
"Make a U-turn onto %1").arg(wayName);
415 return QGeoRouteParserOsrmV5::tr(
"Continue straight");
417 return QGeoRouteParserOsrmV5::tr(
"Continue straight onto %1").arg(wayName);
420 return QGeoRouteParserOsrmV5::tr(
"Continue");
422 return QGeoRouteParserOsrmV5::tr(
"Continue onto %1").arg(wayName);
435 return QGeoRouteParserOsrmV5::tr(
"Continue on the left");
437 return QGeoRouteParserOsrmV5::tr(
"Continue on the left on %1").arg(wayName);
444 return QGeoRouteParserOsrmV5::tr(
"Continue on the right");
446 return QGeoRouteParserOsrmV5::tr(
"Continue on the right on %1").arg(wayName);
450 return QGeoRouteParserOsrmV5::tr(
"Continue");
452 return QGeoRouteParserOsrmV5::tr(
"Continue on %1").arg(wayName);
465 return QGeoRouteParserOsrmV5::tr(
"Take the ramp on the left");
467 return QGeoRouteParserOsrmV5::tr(
"Take the ramp on the left onto %1").arg(wayName);
474 return QGeoRouteParserOsrmV5::tr(
"Take the ramp on the right");
476 return QGeoRouteParserOsrmV5::tr(
"Take the ramp on the right onto %1").arg(wayName);
480 return QGeoRouteParserOsrmV5::tr(
"Take the ramp");
482 return QGeoRouteParserOsrmV5::tr(
"Take the ramp onto %1").arg(wayName);
494 return QGeoRouteParserOsrmV5::tr(
"Get off the bike and push");
496 return QGeoRouteParserOsrmV5::tr(
"Get off the bike and push onto %1").arg(wayName);
507 instruction += QGeoRouteParserOsrmV5::tr(
"Enter the rotary");
521 instruction += QGeoRouteParserOsrmV5::tr(
"Enter the roundabout");
531 return QGeoRouteParserOsrmV5::tr(
"At the roundabout, continue straight");
533 return QGeoRouteParserOsrmV5::tr(
"At the roundabout, continue straight on %1").arg(wayName);
539 return QGeoRouteParserOsrmV5::tr(
"At the roundabout, turn left");
541 return QGeoRouteParserOsrmV5::tr(
"At the roundabout, turn left onto %1").arg(wayName);
547 return QGeoRouteParserOsrmV5::tr(
"At the roundabout, turn right");
549 return QGeoRouteParserOsrmV5::tr(
"At the roundabout, turn right onto %1").arg(wayName);
553 return QGeoRouteParserOsrmV5::tr(
"At the roundabout, turn around");
555 return QGeoRouteParserOsrmV5::tr(
"At the roundabout, turn around onto %1").arg(wayName);
558 return QGeoRouteParserOsrmV5::tr(
"At the roundabout, continue");
560 return QGeoRouteParserOsrmV5::tr(
"At the roundabout, continue onto %1").arg(wayName);
567 ? QGeoRouteParserOsrmV5::tr(
"Take the train")
568 : QGeoRouteParserOsrmV5::tr(
"Take the train [%1]").arg(wayName);
576 return QGeoRouteParserOsrmV5::tr(
"Go straight");
578 return QGeoRouteParserOsrmV5::tr(
"Go straight onto %1").arg(wayName);
582 return QGeoRouteParserOsrmV5::tr(
"Turn left");
584 return QGeoRouteParserOsrmV5::tr(
"Turn left onto %1").arg(wayName);
588 return QGeoRouteParserOsrmV5::tr(
"Turn slightly left");
590 return QGeoRouteParserOsrmV5::tr(
"Turn slightly left onto %1").arg(wayName);
594 return QGeoRouteParserOsrmV5::tr(
"Turn right");
596 return QGeoRouteParserOsrmV5::tr(
"Turn right onto %1").arg(wayName);
600 return QGeoRouteParserOsrmV5::tr(
"Turn slightly right");
602 return QGeoRouteParserOsrmV5::tr(
"Turn slightly right onto %1").arg(wayName);
606 return QGeoRouteParserOsrmV5::tr(
"Make a U-turn");
608 return QGeoRouteParserOsrmV5::tr(
"Make a U-turn onto %1").arg(wayName);
611 return QGeoRouteParserOsrmV5::tr(
"Turn");
613 return QGeoRouteParserOsrmV5::tr(
"Turn onto %1").arg(wayName);
629 laneInstruction =
QLatin1String(
"Use the left or the right lane");
631 if (laneInstruction.
isEmpty()) {
633 return QGeoRouteParserOsrmV5::tr(
"Continue straight");
635 return QGeoRouteParserOsrmV5::tr(
"Continue straight onto %1").arg(wayName);
642 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and continue straight");
644 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and continue straight onto %1").
arg(wayName);
647 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and make a sharp left");
649 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and make a sharp left onto %1").
arg(wayName);
652 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and turn left");
654 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and turn left onto %1").
arg(wayName);
658 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and make a slight left");
660 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and make a slight left onto %1").
arg(wayName);
663 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and make a sharp right");
665 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and make a sharp right onto %1").
arg(wayName);
668 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and turn right");
670 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and turn right onto %1").
arg(wayName);
674 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and make a slight right");
676 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and make a slight right onto %1").
arg(wayName);
680 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and make a U-turn");
682 return laneInstruction + QGeoRouteParserOsrmV5::tr(
" and make a U-turn onto %1").
arg(wayName);
684 return laneInstruction;
757 switch (trafficSide) {
825 double latitude =
position[1].toDouble();
826 double longitude =
position[0].toDouble();
852 if (maneuver.
find(
e) != maneuver.
end())
865 segment.setManeuver(geoManeuver);
876 if (document.isObject()) {
881 errorString = status;
909 for (
int legIndex = 0; legIndex < legs.
size(); ++legIndex) {
926 for (
int stepIndex = 0; stepIndex < steps.
size(); ++stepIndex) {
948 path.append(
s.path());
953 if (!
path.isEmpty()) {
957 routeLegs << routeLeg;
965 path.append(
s.path());
972 if (!
path.isEmpty()) {
void setWaypoint(const QGeoCoordinate &coordinate)
void setInstructionText(const QString &instructionText)
void setTimeToNextInstruction(int secs)
void setDirection(InstructionDirection direction)
void setDistanceToNextInstruction(qreal distance)
void setPosition(const QGeoCoordinate &position)
void setExtendedAttributes(const QVariantMap &extendedAttributes)
virtual void updateQuery(QUrlQuery &query) const =0
virtual void updateSegment(QGeoRouteSegment &segment, const QJsonObject &step, const QJsonObject &maneuver) const =0
QGeoRouteReply::Error parseReply(QList< QGeoRoute > &routes, QString &errorString, const QByteArray &reply) const override
QVariantMap m_vendorParams
const QGeoRouteParserOsrmV5Extension * m_extension
QGeoRouteParserOsrmV5Private()
QUrl requestUrl(const QGeoRouteRequest &request, const QString &prefix) const override
virtual ~QGeoRouteParserOsrmV5Private()
QGeoRouteSegment parseStep(const QJsonObject &step, int legIndex, int stepIndex) const
virtual ~QGeoRouteParserOsrmV5()
void setExtension(const QGeoRouteParserOsrmV5Extension *extension)
QGeoRouteParserOsrmV5(QObject *parent=nullptr)
QGeoRouteParser::TrafficSide trafficSide
Error
Describes an error which prevented the completion of the operation.
void setLegLastSegment(bool lastSegment)
static QGeoRouteSegmentPrivate * get(QGeoRouteSegment &segment)
void setOverallRoute(const QGeoRoute &route)
void setLegIndex(int idx)
void setFirstRouteSegment(const QGeoRouteSegment &routeSegment)
Sets the first route segment in the route to routeSegment.
void setDistance(qreal distance)
void setTravelTime(int secs)
void setPath(const QList< QGeoCoordinate > &path)
void setRouteLegs(const QList< QGeoRoute > &legs)
void setBounds(const QGeoRectangle &bounds)
Q_INVOKABLE QGeoRectangle boundingGeoRectangle() const
Returns a QGeoRectangle representing the geographical bounding rectangle of the geo shape,...
\inmodule QtCore\reentrant
qsizetype size() const
Returns the number of values stored in the array.
QJsonValue at(qsizetype i) const
Returns a QJsonValue representing the value for index i.
\inmodule QtCore\reentrant
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=nullptr)
Parses json as a UTF-8 encoded JSON document, and creates a QJsonDocument from it.
\inmodule QtCore\reentrant
iterator end()
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the last ...
iterator find(const QString &key)
Returns an iterator pointing to the item with key key in the map.
QJsonValue value(const QString &key) const
Returns a QJsonValue representing the value for the key key.
\inmodule QtCore\reentrant
bool isDouble() const
Returns true if the value contains a double.
int toInt(int defaultValue=0) const
QJsonObject toObject() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
QJsonArray toArray() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
double toDouble(double defaultValue=0) const
Converts the value to a double and returns it.
bool isArray() const
Returns true if the value contains an array.
QString toString() const
Converts the value to a QString and returns it.
bool isObject() const
Returns true if the value contains an object.
QVariant toVariant() const
Converts the value to a \l {QVariant::}{QVariant()}.
qsizetype size() const noexcept
const_reference at(qsizetype i) const noexcept
void append(parameter_type t)
static CardinalDirection azimuthToCardinalDirection4(double azimuth)
iterator insert(const Key &key, const T &value)
\macro QT_RESTRICTED_CAST_FROM_ASCII
QByteArray toLatin1() const &
QString arg(qlonglong a, int fieldwidth=0, int base=10, QChar fillChar=u' ') const
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString & append(QChar c)
void setQuery(const QString &query, ParsingMode mode=TolerantMode)
Sets the query string of the URL to query.
Combined button and popup list for selecting options.
static QT_WARNING_DISABLE_FLOAT_COMPARE ShiftResult shift(const QBezier *orig, QBezier *shifted, qreal offset, qreal threshold)
DBusConnection const char DBusError * error
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static QString instructionArrive(QGeoManeuver::InstructionDirection direction)
static QString instructionRoundaboutTurn(const QString &wayName, QGeoManeuver::InstructionDirection direction)
static QString instructionNotification(const QString &wayName, QGeoManeuver::InstructionDirection direction)
static QT_BEGIN_NAMESPACE QList< QGeoCoordinate > decodePolyline(const QString &polylineString)
static QString instructionNewName(const QString &wayName, QGeoManeuver::InstructionDirection direction)
static QString instructionUseLane(const QJsonObject &maneuver, const QString &wayName, QGeoManeuver::InstructionDirection direction)
static QString instructionTrain(const QString &wayName)
static QString instructionOffRamp(const QString &wayName, QGeoManeuver::InstructionDirection direction)
static QGeoManeuver::InstructionDirection instructionDirection(const QJsonObject &maneuver, QGeoRouteParser::TrafficSide trafficSide)
static QString exitDirection(int exit, const QString &wayName)
static QString instructionDepart(const QJsonObject &maneuver, const QString &wayName)
static QString instructionRoundabout(const QJsonObject &maneuver, const QString &wayName)
static QString instructionPushingBike(const QString &wayName)
static QString cardinalDirection4(QLocationUtils::CardinalDirection direction)
static QString instructionMerge(const QString &wayName, QGeoManeuver::InstructionDirection direction)
static QString instructionRotary(const QJsonObject &step, const QJsonObject &maneuver, const QString &wayName)
static QString instructionOnRamp(const QString &wayName, QGeoManeuver::InstructionDirection direction)
static QString instructionFork(const QString &wayName, QGeoManeuver::InstructionDirection direction)
static QString exitOrdinal(int exit)
static QString instructionContinue(const QString &wayName, QGeoManeuver::InstructionDirection direction)
static QString instructionTurn(const QString &wayName, QGeoManeuver::InstructionDirection direction)
static QString instructionText(const QJsonObject &step, const QJsonObject &maneuver, QGeoManeuver::InstructionDirection direction)
static QString instructionEndOfRoad(const QString &wayName, QGeoManeuver::InstructionDirection direction)
static QString instructionFerry(const QString &wayName)
GLsizei GLsizei GLfloat distance
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLsizei const GLchar *const * path
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
QLatin1StringView QLatin1String
static double toDouble(Value v)
QUrl url("example.com")
[constructor-url-reference]
QNetworkRequest request(url)
\inmodule QtCore \reentrant
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent