USA.
*/
+#include <qjson/parser.h>
+
+#include <QCryptographicHash>
#include <QDebug>
-#include <QtGlobal>
-#include <QStringList>
#include <QNetworkReply>
-#include <QCryptographicHash>
+#include <QStringList>
+#include <QtGlobal>
#if defined(Q_WS_MAEMO_5) & defined(ARMEL)
#include <QDBusInterface>
#include <QDBusMessage>
#endif
-#include "common.h"
#include "coordinates/geocoordinate.h"
-#include "parser.h"
+#include "../error.h"
#include "location.h"
#include "network/networkaccessmanager.h"
#include "route.h"
const QString CLOUDMADE_AUTH_PART = "http://auth.cloudmade.com/token/";
const QString CLOUDMADE_API_KEY = "0cea0072adbf42ce823f4c78b974f12d";
-// geocode
-const QString GEOCODE = "http://maps.google.com/maps/api/geocode/json?address=";
-
-
RoutingService::RoutingService(QObject *parent)
: QObject(parent)
{
bool ok;
QVariantMap result = parser.parse (jsonReply, &ok).toMap();
if (!ok) {
- emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
+ emit error(ErrorContext::SITUARE, SituareError::ERROR_ROUTING_FAILED);
return;
- } else {
- if(result.value("status").toInt() == NO_ERROR) {
- QVariant routeSummary = result.value("route_summary");
- QMap<QString, QVariant> routeSummaryMap = routeSummary.toMap();
-
- Route route;
- route.setEndPointName(routeSummaryMap["end_point"].toString());
- route.setStartPointName(routeSummaryMap["start_point"].toString());
- route.setTotalDistance(routeSummaryMap["total_distance"].toInt());
- route.setTotalTime(routeSummaryMap["total_time"].toInt());
-
- foreach(QVariant routeGeometry, result["route_geometry"].toList()) {
- QStringList list = routeGeometry.toStringList();
- route.appendGeometryPoint(GeoCoordinate(list.at(0).toDouble(),
- list.at(1).toDouble()));
- }
+ } else if(result.value("status").toInt() == NO_ERROR) {
+ QVariant routeSummary = result.value("route_summary");
+ QMap<QString, QVariant> routeSummaryMap = routeSummary.toMap();
+
+ Route route;
+ route.setEndPointName(routeSummaryMap["end_point"].toString());
+ route.setStartPointName(routeSummaryMap["start_point"].toString());
+ route.setTotalDistance(routeSummaryMap["total_distance"].toInt());
+ route.setTotalTime(routeSummaryMap["total_time"].toInt());
+
+ foreach(QVariant routeGeometry, result["route_geometry"].toList()) {
+ QStringList list = routeGeometry.toStringList();
+ route.appendGeometryPoint(GeoCoordinate(list.at(0).toDouble(), list.at(1).toDouble()));
+ }
- foreach(QVariant routeInstructions, result["route_instructions"].toList()) {
- QStringList list = routeInstructions.toStringList();
- RouteSegment segment;
- segment.setInstruction(list.at(0));
- segment.setLength(list.at(1).toDouble());
- segment.setPositionIndex(list.at(2).toInt());
- segment.setTime(list.at(3).toInt());
- segment.setLengthCaption(list.at(4));
- segment.setEarthDirection(list.at(5));
- segment.setAzimuth(list.at(6).toDouble());
- if (list.count() == 8) {
- segment.setTurnType(list.at(7));
- segment.setTurnAngle(list.at(8).toDouble());
- }
- route.appendSegment(segment);
+ foreach(QVariant routeInstructions, result["route_instructions"].toList()) {
+ QStringList list = routeInstructions.toStringList();
+ RouteSegment segment;
+ segment.setInstruction(list.at(0));
+ segment.setLength(list.at(1).toDouble());
+ segment.setPositionIndex(list.at(2).toInt());
+ segment.setTime(list.at(3).toInt());
+ segment.setLengthCaption(list.at(4));
+ segment.setEarthDirection(list.at(5));
+ segment.setAzimuth(list.at(6).toDouble());
+ if (list.count() == 9) {
+ segment.setTurnType(list.at(7));
+ segment.setTurnAngle(list.at(8).toDouble());
}
-
- emit routeParsed(route);
+ route.appendSegment(segment);
}
- }
-}
-
-void RoutingService::parseSearchResults(const QByteArray &jsonReply)
-{
- qDebug() << __PRETTY_FUNCTION__;
-
- const QString NO_DATA = "ZERO_RESULTS";
- m_searchResults.clear();
-
- QJson::Parser parser;
- bool ok;
- QVariantMap result = parser.parse (jsonReply, &ok).toMap();
- if (!ok) {
- emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
- return;
+ emit routeParsed(route);
} else {
- if(result.value("status") != NO_DATA) {
- foreach(QVariant hitVariant, result["results"].toList()) {
- Location location;
- QMap<QString, QVariant> hitMap = hitVariant.toMap();
-
- location.setFormattedAddress(hitMap["formatted_address"].toString());
-
- QVariant geometryVariant = hitMap["geometry"];
- QMap<QString, QVariant> geometryMap = geometryVariant.toMap();
- QVariant locationVariant = geometryMap["location"];
- QMap<QString, QVariant> locationMap = locationVariant.toMap();
- location.setCoordinates(locationMap["lat"].toDouble(),
- locationMap["lng"].toDouble());
-
- QVariant boundsVariant = geometryMap["viewport"];
- QMap<QString, QVariant> boundsMap = boundsVariant.toMap();
- QVariant swVariant = boundsMap["southwest"];
- QMap<QString, QVariant> swMap = swVariant.toMap();
- location.setSWBound(swMap["lat"].toDouble(),
- swMap["lng"].toDouble());
- QVariant neVariant = boundsMap["northeast"];
- QMap<QString, QVariant> neMap = neVariant.toMap();
- location.setNEBound(neMap["lat"].toDouble(),
- neMap["lng"].toDouble());
-
- m_searchResults.append(location);
- }
- emit locationDataParsed(m_searchResults);
- }
+ emit error(ErrorContext::SITUARE, SituareError::ERROR_ROUTING_FAILED);
+ qCritical() << __PRETTY_FUNCTION__ << "routing failed, json status_message:"
+ << result.value("status_message").toString();
}
}
{
qDebug() << __PRETTY_FUNCTION__;
- if (m_currentRequests.contains(reply)) {
-
- QByteArray replyArray = reply->readAll();
- qDebug() << "Reply from: " << reply->url() << "reply " << replyArray;
-
- if (reply->error()) {
- emit error(ErrorContext::NETWORK, reply->error());
- } else if(reply->url().toString().contains(CLOUDMADE_AUTH_PART)) {
- m_token = replyArray;
- m_pendingRequest.append(m_token);
- sendRequest(m_pendingRequest);
- m_pendingRequest.clear();
- } else if(reply->url().toString().contains(GEOCODE)) {
- parseSearchResults(replyArray);
- } else {
- parseRouteData(replyArray);
- }
+ QByteArray replyArray = reply->readAll();
- m_currentRequests.removeAll(reply);
- reply->deleteLater();
+ if (reply->error()) {
+ emit error(ErrorContext::NETWORK, reply->error());
+ } else if(reply->url().toString().contains(CLOUDMADE_AUTH_PART)) {
+ m_token = replyArray;
+ m_pendingRequest.append(m_token);
+ sendRequest(m_pendingRequest);
+ m_pendingRequest.clear();
+ } else {
+ parseRouteData(replyArray);
}
-}
-
-void RoutingService::requestLocation(QString location)
-{
- qDebug() << __PRETTY_FUNCTION__;
- const QString urlEnd = "&sensor=false";
-
- QString url = GEOCODE;
- url.append(location);
- url.append(urlEnd);
-
- sendRequest(url);
+ reply->deleteLater();
}
-void RoutingService::requestRoute(GeoCoordinate from, GeoCoordinate to)
+void RoutingService::requestRoute(const GeoCoordinate &from, const GeoCoordinate &to)
{
qDebug() << __PRETTY_FUNCTION__;
request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
QByteArray ba;
- QNetworkReply *reply = m_networkManager->post(request, ba, false);
-
- m_currentRequests.append(reply);
+ m_networkManager->post(request, ba, false);
}