Changes: changed UI, walking speed, time format
[ptas] / zouba / 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() << __PRETTY_FUNCTION__;
34   QUrl fullUrl( ytv );
35
36   QStringList a;
37   a << q->fromLocation().x() << q->fromLocation().y();
38   QStringList b;
39   b << q->toLocation().x() << q->toLocation().y();
40
41   fullUrl.addQueryItem( "a", a.join(",") );
42   fullUrl.addQueryItem( "b", b.join(",") );
43   fullUrl.addQueryItem( "show", "1" );
44   fullUrl.addQueryItem( "walkspeed", "3" );
45   fullUrl.addQueryItem( "user", username );
46   fullUrl.addQueryItem( "pass", password );
47
48   manager->get( QNetworkRequest( fullUrl ) );
49 }
50
51 void Route::replyFinished( QNetworkReply * reply )
52 {
53   qDebug() << __PRETTY_FUNCTION__;
54   RouteData routeData = q->parseReply( reply->readAll() );
55
56   emit( routeReady( routeData ) );
57 }
58
59 void Route::setFromLocation( const Location &location )
60 {
61   qDebug() << __PRETTY_FUNCTION__;
62   if ( location.isValid() ) {
63     qDebug() << "from location is valid";
64     q->setFromLocation( location );
65     if ( q->toValid() ) {
66         qDebug() << "to is also valid; getting route";
67         getRoute();
68     }
69   } else {
70     qDebug() << "location is NOT valid - obtaining from sender";
71     Location *locationPtr = qobject_cast<Location*>(sender());
72     if ( locationPtr ) {
73       q->setFromLocation( *locationPtr );
74       if ( q->toValid() ) {
75         qDebug() << "to is also valid; getting route";
76         getRoute();
77       } else {
78         qDebug() << "to is NOT valid";
79       }
80     } else {
81       qDebug() << "locationPtr is zero - cast didn't work";
82     }
83   }
84 }
85
86 const Location &Route::fromLocation()
87 {
88   return q->fromLocation();
89 }
90
91 void Route::setToLocation( const Location &location )
92 {
93   qDebug() << __PRETTY_FUNCTION__;
94   if ( location.isValid() ) {
95     qDebug() << "to is valid";
96     q->setToLocation( location );
97     if ( q->fromValid() ) {
98       qDebug() << "from is also valid; getting route";
99       getRoute();
100     } else {
101       qDebug() << "from is NOT valid";
102     }
103   } else {
104     qDebug() << "to is not valid; getting from sender";
105     Location *locationPtr = qobject_cast<Location*>(sender());
106     if ( locationPtr ) {
107       q->setToLocation( *locationPtr );
108       if ( q->fromValid() ) {
109         qDebug() << "from is also valid; getting route";
110         getRoute();
111       } else {
112         qDebug() << "from is not valid";
113       }
114     } else {
115       qDebug() << "locationPtr is zero; cast failed";
116     }
117   }
118 }
119
120 const Location &Route::toLocation()
121 {
122   return q->toLocation();
123 }
124
125 void Route::toggleDirection()
126 {
127   Location oldFromLocation = fromLocation();
128   setFromLocation( toLocation() );
129   setToLocation( oldFromLocation );
130
131   getRoute();
132 }