77feaed3c0a4f6a3d1c0ab078cf86882d8a54cfb
[googlelatitude] / src / glatitude.cpp
1 #include "glatitude.h"
2
3 GoogleLatitude::GoogleLatitude(QObject *parent) : QObject(parent) {
4     user = "";
5     pass = "";
6     latitude = 0.;
7     longitude = 0.;
8     accuracy = 0.;
9     interval = 120;
10
11     worker = new QNetworkAccessManager();
12     connect(worker, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedreply(QNetworkReply *)));
13
14     urllogin = QUrl::fromEncoded("https://www.google.com/accounts/ServiceLogin?service=friendview");
15     urldologin = QUrl::fromEncoded("https://www.google.com/accounts/ServiceLoginAuth?service=friendview");
16     urlupdate = QUrl::fromEncoded("http://maps.google.com/glm/mmap/mwmfr?hl=en");
17
18     lastupdate = 0;
19     login_error = false;
20 }
21
22 void GoogleLatitude::login(QString u, QString p) {
23     if ( !u.contains('@') ) u.append("@gmail.com");
24     user = u;
25     pass = p;
26 }
27
28 void GoogleLatitude::freq(int f) {
29     interval = f;
30 }
31
32 void GoogleLatitude::reset() {
33     lastupdate = 0;
34     login_error = false;
35     set(latitude, longitude, accuracy);
36 }
37
38 void GoogleLatitude::set(double la, double lo, double ac) {
39     latitude = la;
40     longitude = lo;
41     accuracy = ac>100000?  100000 : ac;
42
43     qDebug() << "GoogleLatitude: set la" << la << "lo" << lo << "ac" << ac << "current" << QDateTime::currentDateTime().toUTC().toTime_t();
44     if (login_error) return;
45     if (la*lo == 0) return;
46     if (!accuracy) return;
47     if ( QDateTime::currentDateTime().toUTC().toTime_t() < lastupdate + interval ) return;
48
49 #if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
50     QNetworkConfigurationManager mgr;
51     if (!mgr.isOnline()) {
52         qDebug() << "GoogleLatitude: offline";
53         return;
54     }
55 #endif
56
57     worker->get(QNetworkRequest(urllogin));
58 }
59
60 void GoogleLatitude::finishedreply(QNetworkReply *r) {
61     if ( r->url() == urllogin ) {
62         qDebug() << "GoogleLatitude: login";
63         QString aidis = r->readAll();
64         QRegExp regexp ("type=\"hidden\".*name=\"GALX\".*value=\"(.*)\"");
65         regexp.setMinimal(1);
66         regexp.indexIn(aidis, 1);
67         QString googleGALX = regexp.capturedTexts().last();
68
69         QByteArray datalogin;
70         datalogin += "&service=friendview";
71         datalogin += "&GALX=" + googleGALX;
72         datalogin += "&Email=" + user;
73         datalogin += "&Passwd=" + pass;
74         worker->post(QNetworkRequest(urldologin), datalogin);
75     } else if ( r->url() == urldologin ) {
76         qDebug() << "GoogleLatitude: dologin";
77         QByteArray datagps;
78         datagps += "t=ul";
79         datagps += "&lat=" + QString::number(latitude);
80         datagps += "&lng=" + QString::number(longitude);
81         datagps += "&accuracy=" + QString::number(accuracy);
82
83         QNetworkRequest request(urlupdate);
84         request.setRawHeader("X-ManualHeader", QString("true").toAscii() );
85         worker->post(request, datagps);
86     } else if ( r->url() == urlupdate ) {
87         QString output = r->readAll();
88         QRegExp regexp ("Authentication required");
89         if (regexp.indexIn(output, 1) != -1) {
90             qDebug() << "GoogleLatitude: update error auth";
91             login_error = true;
92             emit ERROR();
93         } else {
94             lastupdate = QDateTime::currentDateTime().toUTC().toTime_t();
95             qDebug() << "GoogleLatitude: update ok" << "lastupdate" << lastupdate;
96             qDebug() << output;
97             emit OK();
98         }
99     } else {
100         qDebug() << "GoogleLatitude Error url" << r->url();
101         qDebug() << r->rawHeaderList();
102         qDebug() << r->readAll();
103     }
104 }