Merge branch 'master' into situare_interact
[situare] / src / situareservice / situareservice.cpp
index c0c2560..94e4124 100644 (file)
@@ -3,6 +3,7 @@
    Copyright (C) 2010  Ixonos Plc. Authors:
 
       Henri Lampela - henri.lampela@ixonos.com
+      Sami Rämö - sami.ramo@ixonos.com
 
    Situare is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    USA.
 */
 
-#include "parser.h"
+#include <qjson/parser.h>
 
-#include <QtAlgorithms>
 #include <QDebug>
 #include <QtNetwork/QNetworkReply>
 #include <QPixmap>
 #include <QStringList>
+#include <QtAlgorithms>
 #include <QtGlobal>
 
 #include "database.h"
-#include "error.h"
+#include "../error.h"
 #include "network/networkaccessmanager.h"
 #include "situarecommon.h"
 #include "ui/avatarimage.h"
@@ -76,266 +77,156 @@ SituareService::~SituareService()
     m_friendsList.clear();
 }
 
-void SituareService::fetchMessages()
+void SituareService::addProfileImages(const QHash<QString, QUrl> &imageUrlList)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    //Request sent to server does not need the UID
-    QByteArray arr = m_database->getNotifications(613374451);
+    QHashIterator<QString, QUrl> imageUrlListIterator(imageUrlList);
 
-    parseMessagesData(arr);
+    while (imageUrlListIterator.hasNext()) {
+        imageUrlListIterator.next();
+        emit fetchImage(imageUrlListIterator.key(), imageUrlListIterator.value());
+    }
 }
 
-void SituareService::fetchPeopleWithSimilarInterest(const GeoCoordinate &southWestCoordinates,
-                                                    const GeoCoordinate &northEastCoordinates)
+void SituareService::addTags(const QStringList &tags)
 {
-    qDebug() << __PRETTY_FUNCTION__;
+    qWarning() << __PRETTY_FUNCTION__ << tags.count();
 
-    //Request sent to server does not need the UID
-    QByteArray arr = m_database->getInterestingPeople(613374451,
-                                                      southWestCoordinates,
-                                                      northEastCoordinates);
+    foreach (QString tag, tags)
+        m_database->addTag(613374451, tag);
 
-    parseInterestingPeopleData(arr);
+    emit updateWasSuccessful(SituareService::SuccessfulAddTags);
 }
 
-void SituareService::fetchPopularTags()
+void SituareService::appendAccessToken(QString &requestUrl)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QByteArray arr = m_database->getPopularTags();
-
-    parsePopularTagsData(arr);
+    requestUrl.append(m_session);
 }
 
-void SituareService::fetchLocations()
+void SituareService::buildRequest(const QString &script, const QHash<QString, QString> &parameters)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QString cookie = formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
-                                m_credentials.sessionKey(), m_credentials.sessionSecret(),
-                                m_credentials.sig(), EN_LOCALE);
-
-    QUrl url = formUrl(SITUARE_URL, GET_LOCATIONS);
-    sendRequest(url, COOKIE, cookie);
-}
-
-void SituareService::reverseGeo(const GeoCoordinate &coordinates)
-{
-    qDebug() << __PRETTY_FUNCTION__;
+    const QString PARAMETER_KEY_API = "api";
+    const QString PARAMETER_VALUE_API = "2.0";
+
+    QString url = SITUARE_URL;
+    url.append(script);
+    url.append("?");
+
+    // append default api version parameter if not yet specified
+//    if (!parameters.contains(PARAMETER_KEY_API))
+//        url.append(PARAMETER_KEY_API + "=" + PARAMETER_VALUE_API + "&");
+
+    // append parameters
+    if (!parameters.isEmpty()) {
+        QHash<QString, QString>::const_iterator i = parameters.constBegin();
+        while (i != parameters.constEnd()) {
+            url.append(i.key());
+            url.append("=");
+            url.append(i.value());
+            url.append("&");
+            i++;
+        }
+    }
 
-    QString cookie = formCookie(API_KEY, m_credentials.expires(),m_credentials.userID(),
-                                m_credentials.sessionKey(), m_credentials.sessionSecret(),
-                                m_credentials.sig(), EN_LOCALE);
+    /// @todo BUG: Url parameter strings are not url escaped
 
-    QString urlParameters = formUrlParameters(coordinates);
-    urlParameters.append(JSON_FORMAT);
-    QUrl url = formUrl(SITUARE_URL, REVERSE_GEO, urlParameters);
+//    qWarning() << __PRETTY_FUNCTION__ << "request url with parameters:" << url;
 
-    sendRequest(url, COOKIE, cookie);
+    if (!m_session.isEmpty()) {
+        appendAccessToken(url);
+        sendRequest(url);
+    } else {
+        emit error(ErrorContext::SITUARE, SituareError::SESSION_EXPIRED);
+    }
 }
 
-void SituareService::updateLocation(const GeoCoordinate &coordinates, const QString &status,
-                                    const bool &publish)
+void SituareService::clearUserData()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QString urlParameters = formUrlParameters(coordinates, status, publish);
-    QUrl url = formUrl(SITUARE_URL, UPDATE_LOCATION, urlParameters);
-
-    QString cookie = formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
-                                m_credentials.sessionKey(), m_credentials.sessionSecret(),
-                                m_credentials.sig(), EN_LOCALE);
+    qDeleteAll(m_friendsList.begin(), m_friendsList.end());
+    m_friendsList.clear();
 
-    sendRequest(url, COOKIE, cookie);
+    if(m_user) {
+        delete m_user;
+        m_user = 0;
+    }
+    emit userDataChanged(m_user, m_friendsList);
 }
 
-QString SituareService::formCookie(const QString &apiKeyValue, QString expiresValue,
-                                   QString userValue, QString sessionKeyValue,
-                                   QString sessionSecretValue, const QString &signatureValue,
-                                   const QString &localeValue)
+QString SituareService::degreesToString(double degrees)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QString cookie;
-    QString apiKey;
-    QString user;
-    QString expires;
-    QString sessionKey;
-    QString sessionSecret;
-    QString locale;
-    QString variable;
-    QString signature = EQUAL_MARK;
-    QStringList variableList;
-
-    signature.append(signatureValue);
-    apiKey.append(apiKeyValue);
-    apiKey.append(UNDERLINE_MARK);
-
-    user.append(USER);
-    user.append(EQUAL_MARK);
-    expires.append(EXPIRES);
-    expires.append(EQUAL_MARK);
-    sessionKey.append(SESSION_KEY);
-    sessionKey.append(EQUAL_MARK);
-    sessionSecret.append(SESSION_SECRET);
-    sessionSecret.append(EQUAL_MARK);
-    locale.append(LOCALE);
-    locale.append(EQUAL_MARK);
-    locale.append(localeValue);
-
-    variableList.append(expires.append(expiresValue.append(BREAK_MARK)));
-    variableList.append(sessionKey.append(sessionKeyValue.append(BREAK_MARK)));
-    variableList.append(user.append(userValue).append(BREAK_MARK));
-    variableList.append(sessionSecret.append(sessionSecretValue.append(BREAK_MARK)));
-
-    cookie.append(BREAK_MARK);
-
-    foreach(variable, variableList) {
-        cookie.append(apiKey);
-        cookie.append(variable);
-    }
-    apiKey.remove(UNDERLINE_MARK);
-    cookie.append(apiKey);
-    cookie.append(signature);
-    cookie.append(BREAK_MARK);
-    cookie.append(locale);
-
-    qDebug() << cookie;
+    // one scene pixel is about 5.4e-6 degrees, the integer part is max three digits and one
+    // additional digit is added for maximum precision
+    const int PRECISION = 10;
 
-    return cookie;
+    return QString::number(degrees, 'f', PRECISION);
 }
 
-QUrl SituareService::formUrl(const QString &baseUrl, const QString &phpScript,
-                             QString urlParameters)
+void SituareService::fetchMessages()
 {
     qDebug() << __PRETTY_FUNCTION__;
-    QString urlString;
-
-    urlString.append(baseUrl);
-    urlString.append(phpScript);
-    if(!urlParameters.isEmpty())
-        urlString.append(urlParameters);
 
-    QUrl url = QUrl(urlString);
-
-    qDebug() << url;
+    //Request sent to server does not need the UID
+    QByteArray arr = m_database->getNotifications(613374451);
 
-    return url;
+    parseMessagesData(arr);
 }
 
-QString SituareService::formUrlParameters(const GeoCoordinate &coordinates, QString status,
-                                          bool publish)
+void SituareService::fetchPeopleWithSimilarInterest(const GeoCoordinate &southWestCoordinates,
+                                                    const GeoCoordinate &northEastCoordinates)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    // one scene pixel is about 5.4e-6 degrees, the integer part is max three digits and one
-    // additional digit is added for maximum precision
-    const int COORDINATE_PRECISION = 10;
-
-    QString parameters;
-
-    parameters.append(QUESTION_MARK);
-    parameters.append(LATITUDE);
-    parameters.append(EQUAL_MARK);
-    parameters.append(QString::number(coordinates.latitude(), 'f', COORDINATE_PRECISION));
-    parameters.append(AMBERSAND_MARK);
-    parameters.append(LONGTITUDE);
-    parameters.append(EQUAL_MARK);
-    parameters.append(QString::number(coordinates.longitude(), 'f', COORDINATE_PRECISION));
-
-    parameters.append(AMBERSAND_MARK);
-    parameters.append(PUBLISH);
-    parameters.append(EQUAL_MARK);
-
-    if(publish)
-        parameters.append(PUBLISH_TRUE);
-    else
-        parameters.append(PUBLISH_FALSE);
-
-    if(!status.isEmpty()) {
-        parameters.append(AMBERSAND_MARK);
-        parameters.append(DATA);
-        parameters.append(EQUAL_MARK);
-        parameters.append(status);
-    }
+    //Request sent to server does not need the UID
+    QByteArray arr = m_database->getInterestingPeople(613374451,
+                                                      southWestCoordinates,
+                                                      northEastCoordinates);
 
-    return parameters;
+    parseInterestingPeopleData(arr);
 }
 
-void SituareService::sendMessage(const QString &receiverId, const QString &message,
-                                 const GeoCoordinate &coordinates)
+void SituareService::fetchPopularTags()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    if (m_database->sendMessage(613374451, receiverId.toULongLong(), message, coordinates))
-        emit updateWasSuccessful(SituareService::SuccessfulSendMessage);
+    QByteArray arr = m_database->getPopularTags();
+
+    parsePopularTagsData(arr);
 }
 
-void SituareService::sendRequest(const QUrl &url, const QString &cookieType, const QString &cookie)
+void SituareService::fetchLocations()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QNetworkRequest request;
-
-    request.setUrl(url);
-    request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
-    request.setRawHeader(cookieType.toAscii(), cookie.toUtf8());
-
-    QNetworkReply *reply = m_networkManager->get(request, true);
+    QHash<QString, QString> parameters;
+    parameters.insert("extra_user_data", NORMAL_SIZE_PROFILE_IMAGE);
 
-    m_currentRequests.append(reply);
+    buildRequest(GET_LOCATIONS, parameters);
 }
 
-void SituareService::requestFinished(QNetworkReply *reply)
+QHash<QString, QString> SituareService::getTags(const QString &userId)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    //Reply from situare
-    if (m_currentRequests.contains(reply)) {
-
-        qDebug() << "BytesAvailable: " << reply->bytesAvailable();
-
-        if (reply->error()) {
-            emit error(ErrorContext::NETWORK, reply->error());
-        } else {
-            QByteArray replyArray = reply->readAll();
-            qDebug() << "Reply from: " << reply->url() << "reply " << replyArray;
-
-            if(replyArray == ERROR_LAT.toAscii()) {
-                qDebug() << "Error: " << ERROR_LAT;
-                emit error(ErrorContext::SITUARE, SituareError::UPDATE_FAILED);
-            } else if(replyArray == ERROR_LON.toAscii()) {
-                qDebug() << "Error: " << ERROR_LON;
-                emit error(ErrorContext::SITUARE, SituareError::UPDATE_FAILED);
-            } else if(replyArray.contains(ERROR_SESSION.toAscii())) {
-                qDebug() << "Error: " << ERROR_SESSION;
-                emit error(ErrorContext::SITUARE, SituareError::SESSION_EXPIRED);
-            } else if(replyArray.startsWith(OPENING_BRACE_MARK.toAscii())) {
-                qDebug() << "JSON string";
-                parseUserData(replyArray);
-            } else if(replyArray.isEmpty()) {
-                if(reply->url().toString().contains(UPDATE_LOCATION.toAscii())) {
-                    emit updateWasSuccessful(SituareService::SuccessfulUpdateLocation);
-                } else {
-                    // session credentials are invalid
-                    emit error(ErrorContext::SITUARE, SituareError::SESSION_EXPIRED);
-                }
-            } else {
-                // unknown reply
-                emit error(ErrorContext::SITUARE, SituareError::ERROR_GENERAL);
-            }
-        }
-        m_currentRequests.removeAll(reply);
-        reply->deleteLater();
-    }
+    return m_database->getTags(userId.toInt());
 }
 
-void SituareService::credentialsReady(const FacebookCredentials &credentials)
+void SituareService::imageReceived(const QString &id, const QPixmap &image)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_credentials = credentials;
+    if (m_user->userId() == id)
+        emit imageReady(QString(), AvatarImage::create(image, AvatarImage::Large));
+    else
+        emit imageReady(id, AvatarImage::create(image, AvatarImage::Small));
 }
 
 void SituareService::parseInterestingPeopleData(const QByteArray &jsonReply)
@@ -415,107 +306,6 @@ void SituareService::parseInterestingPeopleData(const QByteArray &jsonReply)
     }
 }
 
-void SituareService::parseMessagesData(const QByteArray &jsonReply)
-{
-    QJson::Parser parser;
-    bool ok;
-
-    QVariantMap result = parser.parse(jsonReply, &ok).toMap();
-
-    if (!ok) {
-        emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
-        return;
-    } else {
-        QVariant messages = result["messages"];
-
-        QList<Message> received;
-        QList<Message> sent;
-
-        foreach (QVariant messageVariant, messages.toMap().value("received").toList()) {
-            Message message(Message::MessageTypeReceived);
-            QMap<QString, QVariant> messageMap = messageVariant.toMap();
-            message.setId(messageMap["id"].toString());
-            message.setSenderId(messageMap["sender_id"].toString());
-            message.setReceiverId(messageMap["receiver_id"].toString());
-            message.setSenderName(messageMap["sender_name"].toString());
-            uint timestampSeconds = messageMap["timestamp"].toUInt();
-            message.setTimestamp(QDateTime::fromTime_t(timestampSeconds));
-            message.setText(messageMap["text"].toString());
-            message.setImage(AvatarImage::create(
-                    QPixmap(":/res/images/empty_avatar.png"), AvatarImage::Small));
-
-            bool latOk;
-            qreal latitude = messageMap["latitude"].toReal(&latOk);
-            bool lonOk;
-            qreal longitude = messageMap["longitude"].toReal(&lonOk);
-
-            if (latOk && lonOk) {
-                message.setAddress(messageMap["address"].toString());
-                message.setCoordinates(GeoCoordinate(latitude, longitude));
-            }
-
-            received.append(message);
-
-            //emit fetchImage(message.id(), messageMap["image_url"].toString());
-        }
-
-        foreach (QVariant messageVariant, messages.toMap().value("sent").toList()) {
-            Message message(Message::MessageTypeSent);
-            QMap<QString, QVariant> messageMap = messageVariant.toMap();
-            message.setId(messageMap["id"].toString());
-            message.setSenderId(messageMap["sender_id"].toString());
-            message.setReceiverId(messageMap["receiver_id"].toString());
-            message.setSenderName(messageMap["sender_name"].toString());
-            uint timestampSeconds = messageMap["timestamp"].toUInt();
-            message.setTimestamp(QDateTime::fromTime_t(timestampSeconds));
-            message.setText(messageMap["text"].toString());
-            message.setImage(AvatarImage::create(
-                    QPixmap(":/res/images/empty_avatar.png"), AvatarImage::Small));
-
-            bool latOk;
-            qreal latitude = messageMap["latitude"].toReal(&latOk);
-            bool lonOk;
-            qreal longitude = messageMap["longitude"].toReal(&lonOk);
-
-            if (latOk && lonOk) {
-                message.setAddress(messageMap["address"].toString());
-                message.setCoordinates(GeoCoordinate(latitude, longitude));
-            }
-
-            sent.append(message);
-
-            //emit fetchImage(message.id(), messageMap["image_url"].toString());
-        }
-
-        emit messagesReceived(received, sent);
-    }
-}
-
-void SituareService::parsePopularTagsData(const QByteArray &jsonReply)
-{
-    qDebug() << __PRETTY_FUNCTION__;
-
-    QJson::Parser parser;
-    bool ok;
-
-    QVariantMap result = parser.parse(jsonReply, &ok).toMap();
-
-    if (!ok) {
-        emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
-        return;
-    } else {
-        QHash<QString, QString> popularTags;
-
-        foreach (QVariant tagVariant, result["popular_tags"].toList()) {
-            QMap<QString, QVariant> tag = tagVariant.toMap();
-            popularTags.insert(tag["id"].toString(), tag["name"].toString());
-        }
-
-        emit popularTagsReceived(popularTags);
-    }
-}
-
-
 void SituareService::parseUserData(const QByteArray &jsonReply)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -526,7 +316,6 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
     bool ok;
 
     QVariantMap result = parser.parse (jsonReply, &ok).toMap();
-
     if (!ok) {
         emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
         return;
@@ -545,6 +334,11 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
 
             QUrl imageUrl = userMap[NORMAL_SIZE_PROFILE_IMAGE].toUrl();
 
+            if(imageUrl.isEmpty()) {
+                // user doesn't have profile image, so we need to get him a silhouette image
+                m_defaultImage = true;
+            }
+
             QString address = userMap["address"].toString();
             if(address.isEmpty()) {
                 QStringList location;
@@ -575,6 +369,11 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
 
               QUrl imageUrl = friendMap["profile_pic"].toUrl();
 
+              if(imageUrl.isEmpty()) {
+                  // friend doesn't have profile image, so we need to get him a silhouette image
+                  m_defaultImage = true;
+              }
+
               QString address = friendMap["address"].toString();
               if(address.isEmpty()) {
                   QStringList location;
@@ -685,49 +484,115 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
     }
 }
 
-void SituareService::imageReceived(const QString &id, const QPixmap &image)
+void SituareService::parseMessagesData(const QByteArray &jsonReply)
 {
-    qDebug() << __PRETTY_FUNCTION__;
+    QJson::Parser parser;
+    bool ok;
 
-    if (m_user->userId() == id)
-        emit imageReady(id, AvatarImage::create(image, AvatarImage::Large));
-    else
-        emit imageReady(id, AvatarImage::create(image, AvatarImage::Small));
-}
+    QVariantMap result = parser.parse(jsonReply, &ok).toMap();
 
-void SituareService::addProfileImages(const QHash<QString, QUrl> &imageUrlList)
-{
-    qDebug() << __PRETTY_FUNCTION__;
+    if (!ok) {
+        emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
+        return;
+    } else {
+        QVariant messages = result["messages"];
 
-    QHashIterator<QString, QUrl> imageUrlListIterator(imageUrlList);
+        QList<Message> received;
+        QList<Message> sent;
 
-    while (imageUrlListIterator.hasNext()) {
-        imageUrlListIterator.next();
-        emit fetchImage(imageUrlListIterator.key(), imageUrlListIterator.value());
+        foreach (QVariant messageVariant, messages.toMap().value("received").toList()) {
+            Message message(Message::MessageTypeReceived);
+            QMap<QString, QVariant> messageMap = messageVariant.toMap();
+            message.setId(messageMap["id"].toString());
+            message.setSenderId(messageMap["sender_id"].toString());
+            message.setReceiverId(messageMap["receiver_id"].toString());
+            message.setSenderName(messageMap["sender_name"].toString());
+            uint timestampSeconds = messageMap["timestamp"].toUInt();
+            message.setTimestamp(QDateTime::fromTime_t(timestampSeconds));
+            message.setText(messageMap["text"].toString());
+            message.setImage(AvatarImage::create(
+                    QPixmap(":/res/images/empty_avatar.png"), AvatarImage::Small));
+
+            bool latOk;
+            qreal latitude = messageMap["latitude"].toReal(&latOk);
+            bool lonOk;
+            qreal longitude = messageMap["longitude"].toReal(&lonOk);
+
+            if (latOk && lonOk) {
+                message.setAddress(messageMap["address"].toString());
+                message.setCoordinates(GeoCoordinate(latitude, longitude));
+            }
+
+            received.append(message);
+
+            //emit fetchImage(message.id(), messageMap["image_url"].toString());
+        }
+
+        foreach (QVariant messageVariant, messages.toMap().value("sent").toList()) {
+            Message message(Message::MessageTypeSent);
+            QMap<QString, QVariant> messageMap = messageVariant.toMap();
+            message.setId(messageMap["id"].toString());
+            message.setSenderId(messageMap["sender_id"].toString());
+            message.setReceiverId(messageMap["receiver_id"].toString());
+            message.setSenderName(messageMap["sender_name"].toString());
+            uint timestampSeconds = messageMap["timestamp"].toUInt();
+            message.setTimestamp(QDateTime::fromTime_t(timestampSeconds));
+            message.setText(messageMap["text"].toString());
+            message.setImage(AvatarImage::create(
+                    QPixmap(":/res/images/empty_avatar.png"), AvatarImage::Small));
+
+            bool latOk;
+            qreal latitude = messageMap["latitude"].toReal(&latOk);
+            bool lonOk;
+            qreal longitude = messageMap["longitude"].toReal(&lonOk);
+
+            if (latOk && lonOk) {
+                message.setAddress(messageMap["address"].toString());
+                message.setCoordinates(GeoCoordinate(latitude, longitude));
+            }
+
+            sent.append(message);
+
+            //emit fetchImage(message.id(), messageMap["image_url"].toString());
+        }
+
+        emit messagesReceived(received, sent);
     }
 }
 
-void SituareService::clearUserData()
+void SituareService::parsePopularTagsData(const QByteArray &jsonReply)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    qDeleteAll(m_friendsList.begin(), m_friendsList.end());
-    m_friendsList.clear();
+    QJson::Parser parser;
+    bool ok;
 
-    if(m_user) {
-        delete m_user;
-        m_user = 0;
+    QVariantMap result = parser.parse(jsonReply, &ok).toMap();
+
+    if (!ok) {
+        emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
+        return;
+    } else {
+        QHash<QString, QString> popularTags;
+
+        foreach (QVariant tagVariant, result["popular_tags"].toList()) {
+            QMap<QString, QVariant> tag = tagVariant.toMap();
+            popularTags.insert(tag["id"].toString(), tag["name"].toString());
+        }
+
+        emit popularTagsReceived(popularTags);
     }
-    emit userDataChanged(m_user, m_friendsList);
 }
 
-QHash<QString, QString> SituareService::getTags(const QString &userId)
+void SituareService::removeMessage(const QString &id)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    return m_database->getTags(userId.toInt());
+    if (m_database->removeMessage(613374451, id))
+        emit updateWasSuccessful(SituareService::SuccessfulRemoveMessage);
 }
 
+
 void SituareService::removeTags(const QStringList &tags)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -736,22 +601,60 @@ void SituareService::removeTags(const QStringList &tags)
         emit updateWasSuccessful(SituareService::SuccessfulRemoveTags);
 }
 
-void SituareService::removeMessage(const QString &id)
+void SituareService::requestFinished(QNetworkReply *reply)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    if (m_database->removeMessage(613374451, id))
-        emit updateWasSuccessful(SituareService::SuccessfulRemoveMessage);
+    //Reply from situare
+    if (m_currentRequests.contains(reply)) {
+
+        qDebug() << "BytesAvailable: " << reply->bytesAvailable();
+
+        if (reply->error()) {
+            emit error(ErrorContext::NETWORK, reply->error());
+        } else {
+            QByteArray replyArray = reply->readAll();
+            qDebug() << "Reply from: " << reply->url() << "reply " << replyArray;
+
+            if(replyArray == ERROR_LAT.toAscii()) {
+                qDebug() << "Error: " << ERROR_LAT;
+                emit error(ErrorContext::SITUARE, SituareError::UPDATE_FAILED);
+            } else if(replyArray == ERROR_LON.toAscii()) {
+                qDebug() << "Error: " << ERROR_LON;
+                emit error(ErrorContext::SITUARE, SituareError::UPDATE_FAILED);
+            } else if(replyArray.contains(ERROR_SESSION.toAscii())) {
+                qDebug() << "Error: " << ERROR_SESSION;
+                emit error(ErrorContext::SITUARE, SituareError::SESSION_EXPIRED);
+            } else if(replyArray.startsWith(OPENING_BRACE_MARK.toAscii())) {
+                qDebug() << "JSON string";
+                parseUserData(replyArray);
+            } else if(replyArray.isEmpty()) {
+                if(reply->url().toString().contains(UPDATE_LOCATION.toAscii())) {
+                    emit updateWasSuccessful(SituareService::SuccessfulUpdateLocation);
+                } else {
+                    // session credentials are invalid
+                    emit error(ErrorContext::SITUARE, SituareError::SESSION_EXPIRED);
+                }
+            } else {
+                // unknown reply
+                emit error(ErrorContext::SITUARE, SituareError::ERROR_GENERAL);
+            }
+        }
+        m_currentRequests.removeAll(reply);
+        reply->deleteLater();
+    }
 }
 
-void SituareService::addTags(const QStringList &tags)
+void SituareService::reverseGeo(const GeoCoordinate &coordinates)
 {
-    qWarning() << __PRETTY_FUNCTION__ << tags.count();
+    qDebug() << __PRETTY_FUNCTION__;
 
-    foreach (QString tag, tags)
-        m_database->addTag(613374451, tag);
+    QHash<QString, QString> parameters;
+    parameters.insert("lat", degreesToString(coordinates.latitude()));
+    parameters.insert("lon", degreesToString(coordinates.longitude()));
+    parameters.insert("format", "json");
 
-    emit updateWasSuccessful(SituareService::SuccessfulAddTags);
+    buildRequest(REVERSE_GEO, parameters);
 }
 
 void SituareService::searchPeopleByTag(const QString &tag)
@@ -762,3 +665,48 @@ void SituareService::searchPeopleByTag(const QString &tag)
 
     parseInterestingPeopleData(arr);
 }
+
+void SituareService::sendMessage(const QString &receiverId, const QString &message,
+                                 const GeoCoordinate &coordinates)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (m_database->sendMessage(613374451, receiverId.toULongLong(), message, coordinates))
+        emit updateWasSuccessful(SituareService::SuccessfulSendMessage);
+}
+
+void SituareService::sendRequest(const QString &requestUrl)
+{
+    qDebug() << __PRETTY_FUNCTION__ << "requestUrl" << requestUrl;
+
+    // make and send the request
+    QNetworkRequest request;
+    request.setUrl(QUrl(requestUrl));
+    request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
+    QNetworkReply *reply = m_networkManager->get(request, true);
+    m_currentRequests.append(reply);
+}
+
+void SituareService::updateSession(const QString &session)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    m_session = session;
+
+    if (m_session.isEmpty())
+        clearUserData();
+}
+
+void SituareService::updateLocation(const GeoCoordinate &coordinates, const QString &status,
+                                    const bool &publish)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    QHash<QString, QString> parameters;
+    parameters.insert("lat", degreesToString(coordinates.latitude()));
+    parameters.insert("lon", degreesToString(coordinates.longitude()));
+    parameters.insert("publish", publish ? "true" : "false");
+    parameters.insert("data", status); ///< @todo if !empty ???
+
+    buildRequest(UPDATE_LOCATION, parameters);
+}