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