Added 'optimize' parameter set to 'leastwalking' to route server to give same results...
[ptas] / zouba.madde / src / route.cpp
1 #include "route_p.h"
2 #include "route.h"
3
4 #include "routedata.h"
5 #include "location.h"
6
7 #include <QNetworkAccessManager>
8 #include <QNetworkReply>
9 #include <QUrl>
10 #include <QObject>
11 #include <QDebug>
12 #include <QStringList>
13 #include <QString>
14 #include <QXmlStreamReader>
15
16 #include "ytv.h"
17
18 Route::Route() :
19   q( new RoutePrivate( this ) ),
20   manager( new QNetworkAccessManager(this) )
21 {
22   connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
23 }
24
25 Route::~Route()
26 {
27   delete manager;
28   manager = 0;
29 }
30
31 void Route::getRoute()
32 {
33   qDebug() << "getting route from Ytv";
34
35   QUrl fullUrl( Ytv::Url );
36
37   QStringList a;
38   a << q->fromLocation()->x() << q->fromLocation()->y();
39   QStringList b;
40   b << q->toLocation()->x() << q->toLocation()->y();
41
42   fullUrl.addQueryItem( "a", a.join(",") );
43   fullUrl.addQueryItem( "b", b.join(",") );
44   fullUrl.addQueryItem( "show", QString::number(Ytv::ShowFiveResults) );
45   fullUrl.addQueryItem( "walkspeed", QString::number(Ytv::WalkSpeedFast) );
46   fullUrl.addQueryItem( "optimize", QString::number(Ytv::OptimizeLeastWalking) );
47   fullUrl.addQueryItem( "user", Ytv::Username );
48   fullUrl.addQueryItem( "pass", Ytv::Password );
49
50   manager->get( QNetworkRequest( fullUrl ) );
51   qDebug() << "getting url" << fullUrl.toEncoded();
52   qDebug() << "waiting for reply from Ytv";
53 }
54
55 void Route::replyFinished( QNetworkReply * reply )
56 {
57   qDebug() << "have reply from Ytv";
58   QList<RouteData> routeData = q->parseReply( reply->readAll() );
59
60   emit( routeReady( routeData ) );
61 }
62
63 void Route::setFromLocation( Location *location )
64 {
65   qDebug() << "setting new From location";
66
67   if ( location && location->isValid() ) {
68     qDebug() << "From is valid";
69     q->setFromLocation( location );
70     if ( q->toValid() ) {
71       qDebug() << "To is also valid";
72       getRoute();
73     } else {
74       qDebug() << "To not valid - waiting";
75     }
76   } else {
77     qDebug() << "From is not valid";
78     qDebug() << "getting From from signal sender";
79     location = qobject_cast<Location*>(sender());
80     if ( location ) {
81       q->setFromLocation( location );
82       if ( q->toValid() ) {
83         qDebug() << "To is also valid";
84         getRoute();
85       } else {
86         qDebug() << "To not valid - waiting";
87       }
88     } else {
89       qDebug() << "location is zero - cast didn't work";
90     }
91   }
92 }
93
94 Location *Route::fromLocation() const
95 {
96   return q->fromLocation();
97 }
98
99 void Route::setToLocation( Location *location )
100 {
101   qDebug() << "setting new To location";
102
103   if ( location && location->isValid() ) {
104     qDebug() << "To is valid";
105     q->setToLocation( location );
106     if ( q->fromValid() ) {
107       qDebug() << "From is also valid";
108       getRoute();
109     } else {
110       qDebug() << "From not valid - waiting";
111     }
112   } else {
113     qDebug() << "To is not valid";
114     qDebug() << "getting To from signal sender";
115     Location *location = qobject_cast<Location*>(sender());
116     if ( location ) {
117       q->setToLocation( location );
118       if ( q->fromValid() ) {
119         qDebug() << "From is also valid";
120         getRoute();
121       } else {
122         qDebug() << "From not valid - waiting";
123       }
124     } else {
125       qDebug() << "location is zero; cast failed";
126     }
127   }
128 }
129
130 Location *Route::toLocation() const
131 {
132   return q->toLocation();
133 }