Merge branch 'master' into network_handler
[situare] / src / situareservice / situareservice.cpp
index 119a8ea..0b87bfa 100644 (file)
@@ -47,8 +47,8 @@ SituareService::SituareService(QObject *parent)
             m_imageFetcher, SLOT(fetchImage(QUrl)));
     connect(m_imageFetcher, SIGNAL(imageReceived(QUrl,QPixmap)),
             this, SLOT(imageReceived(QUrl, QPixmap)));
-    connect(m_imageFetcher, SIGNAL(error(int)),
-            this, SIGNAL(error(int)));
+    connect(m_imageFetcher, SIGNAL(error(int, int)),
+            this, SIGNAL(error(int, int)));
 }
 
 SituareService::~SituareService()
@@ -85,6 +85,7 @@ void SituareService::reverseGeo(const QPointF &coordinates)
                                 m_credentials.sig(), EN_LOCALE);
 
     QString urlParameters = formUrlParameters(coordinates);
+    urlParameters.append(JSON_FORMAT);
     QUrl url = formUrl(SITUARE_URL, REVERSE_GEO, urlParameters);
 
     sendRequest(url, COOKIE, cookie);
@@ -245,45 +246,36 @@ void SituareService::requestFinished(QNetworkReply *reply)
     //Reply from situare
     if (m_currentRequests.contains(reply)) {
 
-        QUrl url = reply->url();
         qDebug() << "BytesAvailable: " << reply->bytesAvailable();
 
         if (reply->error()) {
-            emit error(reply->error());
+            emit error(ErrorContext::NETWORK, reply->error());
         } else {
-            qint64 max = reply->size();
-            QByteArray replyArray = reply->read(max);
-            qDebug() << "Reply from: " << url << "reply " << replyArray;
+            QByteArray replyArray = reply->readAll();
+            qDebug() << "Reply from: " << reply->url() << "reply " << replyArray;
 
             if(replyArray == ERROR_LAT.toAscii()) {
                 qDebug() << "Error: " << ERROR_LAT;
-                emit error(SituareError::UPDATE_FAILED);
+                emit error(ErrorContext::SITUARE, SituareError::UPDATE_FAILED);
             } else if(replyArray == ERROR_LON.toAscii()) {
                 qDebug() << "Error: " << ERROR_LON;
-                emit error(SituareError::UPDATE_FAILED);
+                emit error(ErrorContext::SITUARE, SituareError::UPDATE_FAILED);
             } else if(replyArray.contains(ERROR_SESSION.toAscii())) {
                 qDebug() << "Error: " << ERROR_SESSION;
-                emit error(SituareError::SESSION_EXPIRED);
+                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(url.toString().contains(UPDATE_LOCATION.toAscii())) {
+                if(reply->url().toString().contains(UPDATE_LOCATION.toAscii())) {
                     emit updateWasSuccessful();
-                } else if(url.toString().contains(REVERSE_GEO.toAscii())) {
-                    // reversegeo failed
-                    emit error(SituareError::ADDRESS_RETRIEVAL_FAILED);
                 } else {
                     // session credentials are invalid
-                    emit error(SituareError::SESSION_EXPIRED);
+                    emit error(ErrorContext::SITUARE, SituareError::SESSION_EXPIRED);
                 }
-            } else if(url.toString().contains(REVERSE_GEO.toAscii())) {
-                // Street address ready
-                QString address = QString::fromUtf8(replyArray);
-                emit reverseGeoReady(address);
             } else {
                 // unknown reply
-                emit error(SituareError::UNKNOWN_REPLY);
+                emit error(ErrorContext::SITUARE, SituareError::ERROR_GENERAL);
             }
         }
         m_currentRequests.removeAll(reply);
@@ -298,7 +290,7 @@ void SituareService::credentialsReady(const FacebookCredentials &credentials)
     m_credentials = credentials;    
 }
 
-void SituareService::parseUserData(/*const*/ QByteArray &jsonReply)
+void SituareService::parseUserData(const QByteArray &jsonReply)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
@@ -318,51 +310,86 @@ void SituareService::parseUserData(/*const*/ QByteArray &jsonReply)
 
     QVariantMap result = parser.parse (jsonReply, &ok).toMap();
     if (!ok) {
-        emit error(SituareError::INVALID_JSON);
+        emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
         return;
     } else {
 
-        QVariant userVariant = result.value("user");
-        QMap<QString, QVariant> userMap = userVariant.toMap();
+        if(result.contains("ErrorCode")) {
+            QVariant errorVariant = result.value("ErrorCode");
+            emit error(ErrorContext::SITUARE, errorVariant.toInt());
+            return;
+        } else if(result.contains("user")) {
 
-        QPointF coordinates(userMap["longitude"].toReal(), userMap["latitude"].toReal());
+            QVariant userVariant = result.value("user");
+            QMap<QString, QVariant> userMap = userVariant.toMap();
 
-        QUrl imageUrl = userMap[NORMAL_SIZE_PROFILE_IMAGE].toUrl();
+            QPointF coordinates(userMap["longitude"].toReal(), userMap["latitude"].toReal());
 
-        if(imageUrl.isEmpty()) {
-            // user doesn't have profile image, so we need to get him a silhouette image
-            m_defaultImage = true;
-        }
-
-        m_user = new User(userMap["address"].toString(), coordinates, userMap["name"].toString(),
-                      userMap["note"].toString(), imageUrl, userMap["timestamp"].toString(),
-                      true, userMap["uid"].toString());
-
-        foreach (QVariant friendsVariant, result["friends"].toList()) {
-          QMap<QString, QVariant> friendMap = friendsVariant.toMap();
-          QVariant distance = friendMap["distance"];
-          QMap<QString, QVariant> distanceMap = distance.toMap();
+            QUrl imageUrl = userMap[NORMAL_SIZE_PROFILE_IMAGE].toUrl();
 
-          QPointF coordinates(friendMap["longitude"].toReal(), friendMap["latitude"].toReal());
-
-          QUrl imageUrl = friendMap["profile_pic"].toUrl();
+            if(imageUrl.isEmpty()) {
+                // user doesn't have profile image, so we need to get him a silhouette image
+                m_defaultImage = true;
+            }
 
-          if(imageUrl.isEmpty()) {
-              // friend 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;
+                location.append(QString::number(coordinates.y()));
+                location.append(QString::number(coordinates.x()));
+                address = location.join(", ");
+            }
 
-          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_user = new User(address, coordinates, userMap["name"].toString(),
+                          userMap["note"].toString(), imageUrl, userMap["timestamp"].toString(),
+                          true, userMap["uid"].toString());
+
+            foreach (QVariant friendsVariant, result["friends"].toList()) {
+              QMap<QString, QVariant> friendMap = friendsVariant.toMap();
+              QVariant distance = friendMap["distance"];
+              QMap<QString, QVariant> distanceMap = distance.toMap();
+
+              QPointF coordinates(friendMap["longitude"].toReal(), friendMap["latitude"].toReal());
+
+              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;
+                  location.append(QString::number(coordinates.y()));
+                  location.append(QString::number(coordinates.x()));
+                  address = location.join(", ");
+              }
+
+              User *user = new User(address, 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);
+            }
+            addProfileImages();
+        } else {
+            QVariant address = result.value("address");
+            if(!address.toString().isEmpty()) {
+                emit reverseGeoReady(address.toString());
+            } else {
+                QStringList coordinates;
+                coordinates.append(result.value("lat").toString());
+                coordinates.append(result.value("lon").toString());
 
-          m_friendsList.append(user);
+                emit error(ErrorContext::SITUARE, SituareError::ADDRESS_RETRIEVAL_FAILED);
+                emit reverseGeoReady(coordinates.join(", "));
+            }
         }
-        addProfileImages();
     }
 }