Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qgeoroutereply_nokia.cpp
Go to the documentation of this file.
1// Copyright (C) 2015 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
7
8#include <qgeorouterequest.h>
9
10#include <QtCore/QCoreApplication>
11
12Q_DECLARE_METATYPE(QList<QGeoRoute>)
13
14QT_BEGIN_NAMESPACE
15
16QGeoRouteReplyNokia::QGeoRouteReplyNokia(const QGeoRouteRequest &request,
17 const QList<QNetworkReply *> &replies,
18 QObject *parent)
19: QGeoRouteReply(request, parent), m_parsers(0)
20{
21 qRegisterMetaType<QList<QGeoRoute> >();
22
23 bool failure = false;
24 for (QNetworkReply *reply : replies) {
25 if (!reply) {
26 failure = true;
27 continue;
28 }
29 connect(reply, &QNetworkReply::finished,
30 this, &QGeoRouteReplyNokia::networkFinished);
31 connect(reply, &QNetworkReply::errorOccurred,
32 this, &QGeoRouteReplyNokia::networkError);
33 connect(this, &QGeoRouteReply::aborted, reply, &QNetworkReply::abort);
34 connect(this, &QObject::destroyed, reply, &QObject::deleteLater);
35 }
36 if (failure)
37 setError(UnknownError, QStringLiteral("Null reply"));
38 else
39 connect(this, &QGeoRouteReply::aborted, [this](){ m_parsers = 0; });
40}
41
45
46void QGeoRouteReplyNokia::networkFinished()
47{
48 QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
49 reply->deleteLater();
50
51 if (reply->error() != QNetworkReply::NoError
52 && reply->error() != QNetworkReply::UnknownContentError) {
53 return;
54 }
55
56 QGeoRouteXmlParser *parser = new QGeoRouteXmlParser(request());
57 connect(parser, &QGeoRouteXmlParser::results,
58 this, &QGeoRouteReplyNokia::appendResults);
59 connect(parser, &QGeoRouteXmlParser::errorOccurred,
60 this, &QGeoRouteReplyNokia::parserError);
61
62 ++m_parsers;
63 parser->parse(reply->readAll());
64}
65
66void QGeoRouteReplyNokia::networkError(QNetworkReply::NetworkError error)
67{
68 if (error == QNetworkReply::UnknownContentError)
69 return;
70 QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
71 reply->deleteLater();
72 setError(QGeoRouteReply::CommunicationError, reply->errorString());
73 if (error != QNetworkReply::OperationCanceledError) // Any error not caused by abort()
74 emit aborted(); // aborts all unfinished replies and sets m_parsers to 0
75}
76
77void QGeoRouteReplyNokia::appendResults(const QList<QGeoRoute> &routes)
78{
79 if (!m_parsers)
80 return;
81
82 --m_parsers;
83 addRoutes(routes);
84
85 if (!m_parsers)
86 setFinished(true);
87}
88
89void QGeoRouteReplyNokia::parserError(const QString &errorString)
90{
91 Q_UNUSED(errorString);
92 emit aborted();
93 setError(QGeoRouteReply::ParseError,
94 QCoreApplication::translate(NOKIA_PLUGIN_CONTEXT_NAME, RESPONSE_NOT_RECOGNIZABLE));
95}
96
97QT_END_NAMESPACE