Removed unnecessary images from res folder and made a few cosmetic changes
[situare] / src / situareservice / situareservice.cpp
index 6f86fbf..fcc4c4f 100644 (file)
 #include <QNetworkReply>
 #include "situareservice.h"
 #include "situarecommon.h"
-#include "../cookiehandler/cookiehandler.h"
 #include "parser.h"
+#include "ui/avatarimage.h"
+#include "network/networkaccessmanager.h"
 
-SituareService::SituareService(QObject *parent, QNetworkAccessManager *manager)
-        : QObject(parent), m_networkManager(manager)
+SituareService::SituareService(QObject *parent)
+        : QObject(parent),
+        m_user(0)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
+    m_networkManager = NetworkAccessManager::instance();
     connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), SLOT(requestFinished(QNetworkReply*)));
 
-    m_imageFetcher = new ImageFetcher(new QNetworkAccessManager(this), this);
+    m_imageFetcher = new ImageFetcher(NetworkAccessManager::instance(), this);
     connect(this, SIGNAL(fetchImage(QUrl)), m_imageFetcher, SLOT(fetchImage(QUrl)));
     connect(m_imageFetcher, SIGNAL(imageReceived(QUrl,QPixmap)), this,
             SLOT(imageReceived(QUrl, QPixmap)));
     connect(m_imageFetcher, SIGNAL(error(QString)), this, SIGNAL(error(QString)));
-
-    m_user = NULL;
 }
 
 SituareService::~SituareService()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    delete m_networkManager;
-    m_networkManager = NULL;
     if(m_user) {
         delete m_user;
-        m_user = NULL;
+        m_user = 0;
     }
-    delete m_imageFetcher;
-    m_imageFetcher = NULL;
 
     qDeleteAll(m_friendsList.begin(), m_friendsList.end());
     m_friendsList.clear();
@@ -67,14 +64,11 @@ void SituareService::fetchLocations()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    CookieHandler cookieHandler;
-
-    QString cookie = cookieHandler.formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
-                                              m_credentials.sessionKey(), m_credentials.sessionSecret(),
-                                              m_credentials.sig(), EN_LOCALE);
+    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);
 }
 
@@ -82,11 +76,9 @@ void SituareService::reverseGeo(const QPointF &coordinates)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    CookieHandler cookieHandler;
-
-    QString cookie = cookieHandler.formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
-                                              m_credentials.sessionKey(), m_credentials.sessionSecret(),
-                                              m_credentials.sig(), EN_LOCALE);
+    QString cookie = formCookie(API_KEY, m_credentials.expires(),m_credentials.userID(),
+                                m_credentials.sessionKey(), m_credentials.sessionSecret(),
+                                m_credentials.sig(), EN_LOCALE);
 
     QString urlParameters = formUrlParameters(coordinates);
     QUrl url = formUrl(SITUARE_URL, REVERSE_GEO, urlParameters);
@@ -99,11 +91,9 @@ void SituareService::updateLocation(const QPointF &coordinates, const QString &s
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    CookieHandler cookieHandler;
-
-    QString cookie = cookieHandler.formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
-                                              m_credentials.sessionKey(), m_credentials.sessionSecret(),
-                                              m_credentials.sig(), EN_LOCALE);
+    QString cookie = formCookie(API_KEY, m_credentials.expires(), m_credentials.userID(),
+                                m_credentials.sessionKey(), m_credentials.sessionSecret(),
+                                m_credentials.sig(), EN_LOCALE);
 
 
     QString publishValue;
@@ -119,14 +109,71 @@ void SituareService::updateLocation(const QPointF &coordinates, const QString &s
     sendRequest(url, COOKIE, cookie);
 }
 
-QUrl SituareService::formUrl(const QString &baseUrl, const QString &phpScript, QString urlParameters)
+QString SituareService::formCookie(const QString &apiKeyValue, QString expiresValue,
+                                   QString userValue, QString sessionKeyValue,
+                                   QString sessionSecretValue, const QString &signatureValue,
+                                   const QString &localeValue)
+{
+    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;
+
+    return cookie;
+}
+
+QUrl SituareService::formUrl(const QString &baseUrl, const QString &phpScript,
+                             QString urlParameters)
 {
     qDebug() << __PRETTY_FUNCTION__;
     QString urlString;
 
     urlString.append(baseUrl);
     urlString.append(phpScript);
-    if(urlParameters != NULL)
+    if(!urlParameters.isEmpty())
         urlString.append(urlParameters);
 
     QUrl url = QUrl(urlString);
@@ -136,18 +183,19 @@ QUrl SituareService::formUrl(const QString &baseUrl, const QString &phpScript, Q
     return url;
 }
 
-QString SituareService::formUrlParameters(const QPointF &coordinates, QString status, QString publish)
+QString SituareService::formUrlParameters(const QPointF &coordinates, QString status,
+                                          QString publish)
 {
     QString parameters;
 
     parameters.append(QUESTION_MARK);
     parameters.append(LATITUDE);
     parameters.append(EQUAL_MARK);
-    parameters.append(QString::number(coordinates.x()));
+    parameters.append(QString::number(coordinates.y()));
     parameters.append(AMBERSAND_MARK);
     parameters.append(LONGTITUDE);
     parameters.append(EQUAL_MARK);
-    parameters.append(QString::number(coordinates.y()));
+    parameters.append(QString::number(coordinates.x()));
 
     if(publish.compare(PUBLISH_TRUE) == 0) {
         parameters.append(AMBERSAND_MARK);
@@ -162,7 +210,7 @@ QString SituareService::formUrlParameters(const QPointF &coordinates, QString st
         parameters.append(PUBLISH_FALSE);
     }
 
-    if(status != NULL) {
+    if(!status.isEmpty()) {
         parameters.append(AMBERSAND_MARK);
         parameters.append(DATA);
         parameters.append(EQUAL_MARK);
@@ -174,11 +222,12 @@ QString SituareService::formUrlParameters(const QPointF &coordinates, QString st
 
 void SituareService::sendRequest(const QUrl &url, const QString &cookieType, const QString &cookie)
 {
-    qDebug() << __PRETTY_FUNCTION__ << "url: " << url;
+    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);
@@ -190,54 +239,63 @@ void SituareService::requestFinished(QNetworkReply *reply)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QUrl url = reply->url();
-    qDebug() << "BytesAvailable: " << reply->bytesAvailable();
-    if (reply->error()) {
-        qDebug() << reply->errorString();
-        emit error(reply->errorString());
-    }
-    else {
-        qint64 max = reply->size();
-        QByteArray replyArray = reply->read(max);
-        qDebug() << "Reply from: " << url << "reply " << replyArray;
-        // ToDo: results handling includes Situare's errors
-        // works like situare's error handling i.e. both lat & lon are missing/wrong
-        // -> we get only error for wrong lon
-        if(replyArray == ERROR_LAT.toAscii()) {
-            qDebug() << "Error: " << ERROR_LAT;
-            emit error(replyArray);
-        }
-        else if(replyArray == ERROR_LON.toAscii()) {
-            qDebug() << "Error: " << ERROR_LON;
-            emit error(replyArray);
-        }
-        else if(replyArray.contains(ERROR_SESSION.toAscii())) {
-            qDebug() << "Error: " << ERROR_SESSION;
-            emit error(replyArray);
-        }
-        else if(replyArray.startsWith(OPENING_BRACE_MARK.toAscii())) {
-            qDebug() << "JSON string";
-            parseUserData(replyArray);
-        }
-        else if(replyArray == "") {
-            qDebug() << "No error, update was successful";
-            // ToDo: signal UI?
+    //Reply from situare
+    if (m_currentRequests.contains(reply)) {
+
+        QUrl url = reply->url();
+        qDebug() << "BytesAvailable: " << reply->bytesAvailable();
+        if (reply->error()) {
+            qDebug() << reply->errorString();
+            emit error(reply->errorString());
         }
         else {
-            // Street address ready
-            QString address(replyArray);
-            emit reverseGeoReady(address);
+            qint64 max = reply->size();
+            QByteArray replyArray = reply->read(max);
+            qDebug() << "Reply from: " << url << "reply " << replyArray;
+            // ToDo: results handling includes Situare's errors
+            // works like situare's error handling i.e. both lat & lon are missing/wrong
+            // -> we get only error for wrong lon
+            if(replyArray == ERROR_LAT.toAscii()) {
+                qDebug() << "Error: " << ERROR_LAT;
+                emit error(replyArray);
+            }
+            else if(replyArray == ERROR_LON.toAscii()) {
+                qDebug() << "Error: " << ERROR_LON;
+                emit error(replyArray);
+            }
+            else if(replyArray.contains(ERROR_SESSION.toAscii())) {
+                qDebug() << "Error: " << ERROR_SESSION;
+                emit invalidSessionCredentials();
+            }
+            else if(replyArray.startsWith(OPENING_BRACE_MARK.toAscii())) {
+                qDebug() << "JSON string";
+                parseUserData(replyArray);
+            }
+            else if(replyArray == "") {
+                            if(url.toString().contains(UPDATE_LOCATION.toAscii())) {
+                    emit updateWasSuccessful();
+                }
+                else {
+                    // session credentials are invalid
+                    emit invalidSessionCredentials();
+                }
+            }
+            else {
+                // Street address ready
+                QString address = QString::fromUtf8(replyArray);
+                emit reverseGeoReady(address);
+            }
         }
+        m_currentRequests.removeAll(reply);
+        reply->deleteLater();
     }
-    m_currentRequests.removeAll(reply);
-    reply->deleteLater();
 }
 
 void SituareService::credentialsReady(const FacebookCredentials &credentials)
 {
     qDebug() << __PRETTY_FUNCTION__;
-    m_credentials = credentials;
-    
+
+    m_credentials = credentials;    
 }
 
 void SituareService::parseUserData(const QByteArray &jsonReply)
@@ -250,6 +308,11 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
     qDeleteAll(m_friendsList.begin(), m_friendsList.end());
     m_friendsList.clear();
 
+    if(m_user) {
+        delete m_user;
+        m_user = 0;
+    }
+
     QJson::Parser parser;
     bool ok;
 
@@ -265,9 +328,10 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
 
     QPointF coordinates(userMap["longitude"].toReal(), userMap["latitude"].toReal());
 
-    QUrl imageUrl = userMap["profile_pic"].toUrl();
+    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;
     }
 
@@ -285,12 +349,16 @@ 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;
       }
 
-      User *user = new User(friendMap["address"].toString(), coordinates, friendMap["name"].toString(),
-                            friendMap["note"].toString(), imageUrl, friendMap["timestamp"].toString(),
-                            false, friendMap["uid"].toString(), distanceMap["units"].toString(),
+      User *user = new User(friendMap["address"].toString(), coordinates,
+                            friendMap["name"].toString(),
+                            friendMap["note"].toString(), imageUrl,
+                            friendMap["timestamp"].toString(),
+                            false, friendMap["uid"].toString(),
+                            distanceMap["units"].toString(),
                             distanceMap["value"].toDouble());
 
       m_friendsList.append(user);
@@ -306,22 +374,23 @@ void SituareService::imageReceived(const QUrl &url, const QPixmap &image)
     // assign facebook silhouette image to all who doesn't have a profile image
     if(url == QUrl(SILHOUETTE_URL)) {
         if(m_user->profileImageUrl().isEmpty()) {
-            m_user->setProfileImage(image);
+            m_user->setProfileImage(AvatarImage::create(image, AvatarImage::Large));
         }
         for(int i=0;i < m_friendsList.count();i++) {
             if(m_friendsList.at(i)->profileImageUrl().isEmpty()) {
-                m_friendsList.at(i)->setProfileImage(image);
+                m_friendsList.at(i)->setProfileImage(AvatarImage::create(image,
+                                                                         AvatarImage::Small));
             }
         }
     }
 
-    if(m_user->profileImageUrl() == url) {
-        m_user->setProfileImage(image);
+    if (m_user->profileImageUrl() == url) {
+        m_user->setProfileImage(AvatarImage::create(image, AvatarImage::Large));
     }
 
     for(int i=0;i<m_friendsList.count();i++) {
         if(m_friendsList.at(i)->profileImageUrl() == url) {
-            m_friendsList.at(i)->setProfileImage(image);
+            m_friendsList.at(i)->setProfileImage(AvatarImage::create(image, AvatarImage::Small));
             m_nbrOfImages++; // indicates how many friend profile images has been downloaded
         }
     }
@@ -342,14 +411,28 @@ void SituareService::addProfileImages()
         emit fetchImage(QUrl(SILHOUETTE_URL));
     }
 
-    if(!m_user->profileImageUrl().isEmpty()) {
+    if(!m_user->profileImageUrl().isEmpty() && m_user->profileImageUrl().isValid())
         emit fetchImage(m_user->profileImageUrl());
-    }
 
     for(int i=0;i<m_friendsList.count();i++) {
-        if(!m_friendsList.at(i)->profileImageUrl().isEmpty()) {
+        if(!m_friendsList.at(i)->profileImageUrl().isEmpty() &&
+           m_friendsList.at(i)->profileImageUrl().isValid()) {
             m_visited++; // indicates how many friends that have profile image
             emit fetchImage(m_friendsList.at(i)->profileImageUrl());
         }
     }
 }
+
+void SituareService::clearUserData()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    qDeleteAll(m_friendsList.begin(), m_friendsList.end());
+    m_friendsList.clear();
+
+    if(m_user) {
+        delete m_user;
+        m_user = 0;
+    }
+    emit userDataChanged(m_user, m_friendsList);
+}