summaryrefslogtreecommitdiff
path: root/src/plugins/geoservices/nokia/qgeoroutereply_nokia.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/geoservices/nokia/qgeoroutereply_nokia.cpp')
-rw-r--r--src/plugins/geoservices/nokia/qgeoroutereply_nokia.cpp104
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