1c3bedaf2d79c4ce272dc9e5135ffe7f9f75953d
[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() << "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::FiveResults) );
45   fullUrl.addQueryItem( "walkspeed", QString::number(Ytv::Fast) );
46   fullUrl.addQueryItem( "user", Ytv::Username );
47   fullUrl.addQueryItem( "pass", Ytv::Password );
48
49   manager->get( QNetworkRequest( fullUrl ) );
50   qDebug() << "waiting for reply from Ytv";
51 }
52
53 void Route::replyFinished( QNetworkReply * reply )
54 {
55   qDebug() << "have reply from Ytv";
56   QList<RouteData> routeData = q->parseReply( reply->readAll() );
57
58   emit( routeReady( routeData ) );
59 }
60
61 void Route::setFromLocation( const Location &location )
62 {
63   qDebug() << "setting new From location";
64
65   if ( location.isValid() ) {
66     q->setFromLocation( location );
67     if ( q->toValid() ) {
68         getRoute();
69     }
70   } else {
71     Location *locationPtr = qobject_cast<Location*>(sender());
72     if ( locationPtr ) {
73       q->setFromLocation( *locationPtr );
74       if ( q->toValid() ) {
75         getRoute();
76       }
77     } else {
78       qDebug() << "locationPtr is zero - cast didn't work";
79     }
80   }
81 }
82
83 const Location &Route::fromLocation()
84 {
85   return q->fromLocation();
86 }
87
88 void Route::setToLocation( const Location &location )
89 {
90   qDebug() << "setting new To location";
91
92   if ( location.isValid() ) {
93     qDebug() << "To is valid";
94     q->setToLocation( location );
95     if ( q->fromValid() ) {
96       qDebug() << "From is also valid";
97       getRoute();
98     } else {
99       qDebug() << "From not valid - waiting";
100     }
101   } else {
102     qDebug() << "To is not valid";
103     qDebug() << "getting To from signal sender";
104     Location *locationPtr = qobject_cast<Location*>(sender());
105     if ( locationPtr ) {
106       q->setToLocation( *locationPtr );
107       if ( q->fromValid() ) {
108         qDebug() << "From is also valid";
109         getRoute();
110       } else {
111         qDebug() << "From not valid - waiting";
112       }
113     } else {
114       qDebug() << "locationPtr is zero; cast failed";
115     }
116   }
117 }
118
119 const Location &Route::toLocation()
120 {
121   return q->toLocation();
122 }
123
124 void Route::toggleDirection()
125 {
126   Location oldFromLocation = fromLocation();
127   setFromLocation( toLocation() );
128   setToLocation( oldFromLocation );
129
130   getRoute();
131 }