2 Situare - A location system for Facebook
3 Copyright (C) 2010 Ixonos Plc. Authors:
5 Henri Lampela - henri.lampela@ixonos.com
7 Situare is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 version 2 as published by the Free Software Foundation.
11 Situare is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with Situare; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
24 #include <QStringList>
25 #include "situareservice.h"
26 #include "situarecommon.h"
27 #include "../cookiehandler/cookiehandler.h"
30 SituareService::SituareService(QObject *parent, QNetworkAccessManager *manager)
31 : QObject(parent), m_networkManager(manager)
33 qDebug() << __PRETTY_FUNCTION__;
35 connect(&m_facebookAuthentication, SIGNAL(credentialsReady()), SLOT(credentialsReady()));
37 connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), SLOT(requestFinished(QNetworkReply*)));
39 m_credentials = m_facebookAuthentication.loginCredentials();
42 SituareService::~SituareService()
44 qDebug() << __PRETTY_FUNCTION__;
46 delete m_networkManager;
49 void SituareService::fetchLocations()
51 qDebug() << __PRETTY_FUNCTION__;
53 CookieHandler cookieHandler;
55 QString cookie = cookieHandler.formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
56 m_credentials.sessionKey(), m_credentials.sessionSecret(),
57 m_credentials.sig(), EN_LOCALE);
59 QUrl url = formUrl(SITUARE_URL, GET_LOCATIONS);
61 sendRequest(url, COOKIE, cookie);
64 void SituareService::reverseGeo(const QPointF &coordinates)
66 qDebug() << __PRETTY_FUNCTION__;
68 CookieHandler cookieHandler;
70 QString cookie = cookieHandler.formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
71 m_credentials.sessionKey(), m_credentials.sessionSecret(),
72 m_credentials.sig(), EN_LOCALE);
74 QString urlParameters = formUrlParameters(coordinates);
75 QUrl url = formUrl(SITUARE_URL, REVERSE_GEO, urlParameters);
77 sendRequest(url, COOKIE, cookie);
80 void SituareService::updateLocation(const QPointF &coordinates, const QString &status,
83 qDebug() << __PRETTY_FUNCTION__;
85 CookieHandler cookieHandler;
87 QString cookie = cookieHandler.formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
88 m_credentials.sessionKey(), m_credentials.sessionSecret(),
89 m_credentials.sig(), EN_LOCALE);
94 publishValue = PUBLISH_TRUE;
97 publishValue = PUBLISH_FALSE;
99 QString urlParameters = formUrlParameters(coordinates, status, publishValue);
100 QUrl url = formUrl(SITUARE_URL, UPDATE_LOCATION, urlParameters);
102 sendRequest(url, COOKIE, cookie);
105 QUrl SituareService::formUrl(const QString &baseUrl, const QString &phpScript, QString urlParameters)
107 qDebug() << __PRETTY_FUNCTION__;
110 urlString.append(baseUrl);
111 urlString.append(phpScript);
112 if(urlParameters != NULL)
113 urlString.append(urlParameters);
115 QUrl url = QUrl(urlString);
122 QString SituareService::formUrlParameters(const QPointF &coordinates, QString status, QString publish)
126 parameters.append(QUESTION_MARK);
127 parameters.append(LATITUDE);
128 parameters.append(EQUAL_MARK);
129 parameters.append(QString::number(coordinates.x()));
130 parameters.append(AMBERSAND_MARK);
131 parameters.append(LONGTITUDE);
132 parameters.append(EQUAL_MARK);
133 parameters.append(QString::number(coordinates.y()));
135 if(publish.compare(PUBLISH_TRUE) == 0) {
136 parameters.append(AMBERSAND_MARK);
137 parameters.append(PUBLISH);
138 parameters.append(EQUAL_MARK);
139 parameters.append(PUBLISH_TRUE);
141 else if(publish.compare(PUBLISH_FALSE) == 0) {
142 parameters.append(AMBERSAND_MARK);
143 parameters.append(PUBLISH);
144 parameters.append(EQUAL_MARK);
145 parameters.append(PUBLISH_FALSE);
149 parameters.append(AMBERSAND_MARK);
150 parameters.append(DATA);
151 parameters.append(EQUAL_MARK);
152 parameters.append(status);
158 void SituareService::sendRequest(const QUrl &url, const QString &cookieType, const QString &cookie)
160 qDebug() << __PRETTY_FUNCTION__ << "url: " << url;
162 QNetworkRequest request;
165 request.setRawHeader(cookieType.toAscii(), cookie.toUtf8());
167 QNetworkReply *reply = m_networkManager->get(request);
169 m_currentRequests.append(reply);
172 void SituareService::requestFinished(QNetworkReply *reply)
174 qDebug() << __PRETTY_FUNCTION__;
176 QUrl url = reply->url();
177 qDebug() << "BytesAvailable: " << reply->bytesAvailable();
178 if (reply->error()) {
179 qDebug() << reply->errorString();
180 emit error(reply->errorString());
181 // ToDo: some general http error handling etc, signal UI?
184 qint64 max = reply->size();
185 QByteArray replyArray = reply->read(max);
186 qDebug() << "Reply from: " << url << "reply " << replyArray;
187 // ToDo: results handling includes Situare's errors
188 // works like situare's error handling i.e. both lat & lon are missing/wrong
189 // -> we get only error for wrong lon
190 if(replyArray == ERROR_LAT.toAscii()) {
191 qDebug() << "Error: " << ERROR_LAT;
193 emit error(replyArray);
195 else if(replyArray == ERROR_LON.toAscii()) {
196 qDebug() << "Error: " << ERROR_LON;
198 emit error(replyArray);
200 else if(replyArray.contains(ERROR_SESSION.toAscii())) {
201 qDebug() << "Error: " << ERROR_SESSION;
203 emit error(replyArray);
205 else if(replyArray.startsWith(OPENING_BRACE_MARK.toAscii())) {
206 qDebug() << "JSON string";
207 parseUserData(replyArray);
209 else if(replyArray == "") {
210 qDebug() << "No error, update was successful";
213 // Street address ready
214 QString address(replyArray);
215 emit reverseGeoReady(address);
218 m_currentRequests.removeAll(reply);
219 reply->deleteLater();
222 void SituareService::credentialsReady()
224 qDebug() << __PRETTY_FUNCTION__;
225 m_credentials = m_facebookAuthentication.loginCredentials();
228 void SituareService::parseUserData(const QByteArray &jsonReply)
230 qDebug() << __PRETTY_FUNCTION__;
232 QJson::Parser parser;
235 QVariantMap result = parser.parse (jsonReply, &ok).toMap();
238 qFatal("An error occurred during parsing");
242 QList<User *> friendsList;
244 QVariant userVariant = result.value("user");
245 QMap<QString, QVariant> userMap = userVariant.toMap();
247 QPointF coordinates(userMap["longitude"].toReal(), userMap["latitude"].toReal());
249 QUrl imageUrl = userMap["profile_pic"].toUrl();
251 User user = User(userMap["address"].toString(), coordinates, userMap["name"].toString(),
252 userMap["note"].toString(), imageUrl, userMap["timestamp"].toString(),
253 true, userMap["uid"].toString());
255 foreach (QVariant friendsVariant, result["friends"].toList()) {
256 QMap<QString, QVariant> friendMap = friendsVariant.toMap();
257 QVariant distance = friendMap["distance"];
258 QMap<QString, QVariant> distanceMap = distance.toMap();
260 QPointF coordinates(friendMap["longitude"].toReal(), friendMap["latitude"].toReal());
262 QUrl imageUrl = friendMap["profile_pic"].toUrl();
264 User *user = new User(friendMap["address"].toString(), coordinates, friendMap["name"].toString(),
265 friendMap["note"].toString(), imageUrl, friendMap["timestamp"].toString(),
266 false, friendMap["uid"].toString(), distanceMap["units"].toString(),
267 distanceMap["value"].toDouble());
269 friendsList.append(user);
271 emit userDataChanged(user, friendsList);