diff options
Diffstat (limited to 'src/plugins/geoservices/nokia/qgeoroutereply_nokia.cpp')
-rw-r--r-- | src/plugins/geoservices/nokia/qgeoroutereply_nokia.cpp | 104 |
1 files changed, 58 insertions, 46 deletions
diff --git a/src/plugins/geoservices/nokia/qgeoroutereply_nokia.cpp b/src/plugins/geoservices/nokia/qgeoroutereply_nokia.cpp index 2245b208..72f2c60d 100644 --- a/src/plugins/geoservices/nokia/qgeoroutereply_nokia.cpp +++ b/src/plugins/geoservices/nokia/qgeoroutereply_nokia.cpp @@ -51,22 +51,21 @@ #include <qgeorouterequest.h> +Q_DECLARE_METATYPE(QList<QGeoRoute>) + QT_BEGIN_NAMESPACE -QGeoRouteReplyNokia::QGeoRouteReplyNokia(const QGeoRouteRequest &request, const QList<QNetworkReply*> &replies, QObject *parent) - : QGeoRouteReply(request, parent), - m_replies(replies) +QGeoRouteReplyNokia::QGeoRouteReplyNokia(const QGeoRouteRequest &request, + const QList<QNetworkReply *> &replies, + QObject *parent) +: QGeoRouteReply(request, parent), m_replies(replies), m_parsers(0) { + qRegisterMetaType<QList<QGeoRoute> >(); + foreach (QNetworkReply *reply, m_replies) { - connect(reply, - SIGNAL(finished()), - this, - SLOT(networkFinished())); - - connect(reply, - SIGNAL(error(QNetworkReply::NetworkError)), - this, - SLOT(networkError(QNetworkReply::NetworkError))); + connect(reply, SIGNAL(finished()), this, SLOT(networkFinished())); + connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), + this, SLOT(networkError(QNetworkReply::NetworkError))); } } @@ -77,7 +76,7 @@ QGeoRouteReplyNokia::~QGeoRouteReplyNokia() void QGeoRouteReplyNokia::abort() { - if (m_replies.isEmpty()) + if (m_replies.isEmpty() && !m_parsers) return; foreach (QNetworkReply *reply, m_replies) { @@ -85,6 +84,7 @@ void QGeoRouteReplyNokia::abort() reply->deleteLater(); } m_replies.clear(); + m_parsers = 0; } void QGeoRouteReplyNokia::networkFinished() @@ -93,53 +93,65 @@ void QGeoRouteReplyNokia::networkFinished() if (!reply) return; - if (reply->error() != QNetworkReply::NoError) { - // Removed because this is already done in networkError, which previously caused _two_ errors to be raised for every error. - //setError(QGeoRouteReply::CommunicationError, m_reply->errorString()); - //m_reply->deleteLater(); - //m_reply = 0; + if (reply->error() != QNetworkReply::NoError) return; - } - QGeoRouteXmlParser parser(request()); - if (parser.parse(reply)) { - addRoutes(parser.results()); - reply->deleteLater(); - m_replies.removeOne(reply); - if (m_replies.isEmpty()) - setFinished(true); - } else { - // add a qWarning with the actual parser.errorString() - setError(QGeoRouteReply::ParseError, "The response from the service was not in a recognisable format."); - abort(); - } + QGeoRouteXmlParser *parser = new QGeoRouteXmlParser(request()); + connect(parser, SIGNAL(results(QList<QGeoRoute>)), + this, SLOT(appendResults(QList<QGeoRoute>))); + connect(parser, SIGNAL(error(QString)), this, SLOT(parserError(QString))); + + ++m_parsers; + parser->parse(reply->readAll()); + + m_replies.removeOne(reply); + reply->deleteLater(); } void QGeoRouteReplyNokia::networkError(QNetworkReply::NetworkError error) { - Q_UNUSED(error) - QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender()); if (!reply) return; - bool resolvedError = false; - if (QNetworkReply::UnknownContentError == error) { - QGeoRouteXmlParser parser(request()); - if (parser.parse(reply)) { - addRoutes(parser.results()); - reply->deleteLater(); - m_replies.removeOne(reply); - resolvedError = true; - if (m_replies.isEmpty()) - setFinished(true); - } - } + if (error == QNetworkReply::UnknownContentError) { + QGeoRouteXmlParser *parser = new QGeoRouteXmlParser(request()); + connect(parser, SIGNAL(results(QList<QGeoRoute>)), + this, SLOT(appendResults(QList<QGeoRoute>))); + connect(parser, SIGNAL(error(QString)), this, SLOT(parserError(QString))); + + ++m_parsers; + parser->parse(reply->readAll()); - if (!resolvedError) { + m_replies.removeOne(reply); + reply->deleteLater(); + } else { setError(QGeoRouteReply::CommunicationError, reply->errorString()); abort(); } } +void QGeoRouteReplyNokia::appendResults(const QList<QGeoRoute> &routes) +{ + if (!m_parsers) + return; + + --m_parsers; + addRoutes(routes); + + if (!m_parsers && m_replies.isEmpty()) + setFinished(true); +} + +void QGeoRouteReplyNokia::parserError(const QString &errorString) +{ + Q_UNUSED(errorString) + + --m_parsers; + + setError(QGeoRouteReply::ParseError, + tr("The response from the service was not in a recognisable format.")); + abort(); +} + QT_END_NAMESPACE |