Added functionality for reverseGeo.
// Situare PHP scripts
const QString UPDATE_LOCATION = "updateLocation.php";
+const QString REVERSE_GEO = "reversegeo.php";
// Cookies
const QString COOKIE = "Cookie";
const QString SESSION_KEY = "session_key";
const QString SESSION_SECRET = "ss";
+const QString USER_AGENT = "User-Agent";
+const QString AGENT = "Agent";
+
// Locales
const QString LOCALE = "locale";
const QString EN_LOCALE = "en_EN";
-// common marks
+// Common marks
const QString QUESTION_MARK = "?";
const QString AMBERSAND_MARK = "&";
const QString EQUAL_MARK = "=";
const QString PUBLISH_FALSE = "false";
const QString DATA = "data";
+// Situare error messages
+const QString ERROR_LAT = "Wrong lat value: . Latitude must be between -90 and 90!";
+const QString ERROR_LON = "Wrong lon value: . Longitude must be between -180 and 180!";
+const QString ERROR_SESSION = "<br />\n<b>Fatal error</b>:"; // starts with
+
#endif // SITUARECOMMON_H
#include "../cookiehandler/cookiehandler.h"
SituareService::SituareService(QObject *parent, QNetworkAccessManager *manager)
- : QObject(parent), m_manager(manager)
+ : QObject(parent), networkManager(manager)
{
qDebug() << __PRETTY_FUNCTION__;
- connect(m_manager, SIGNAL(finished(QNetworkReply*)), SLOT(requestFinished(QNetworkReply*)));
+ connect(networkManager, SIGNAL(finished(QNetworkReply*)), SLOT(requestFinished(QNetworkReply*)));
}
SituareService::~SituareService()
{
qDebug() << __PRETTY_FUNCTION__;
+
+ delete networkManager;
}
void SituareService::updateLocation(QPointF coordinates, QString status, bool publish)
{
qDebug() << __PRETTY_FUNCTION__;
- // CookieHandler cookieHandler;
- //QString cookie = cookieHandler.formCookie(); // ToDo: get the FB session credentials from somewhere, QSettings...
+
+// CookieHandler cookieHandler;
+// QString cookie = cookieHandler.formCookie(); // ToDo: get the FB session credentials from somewhere, QSettings...
+
QString publishValue;
if(publish) {
publishValue = PUBLISH_TRUE;
}
QString urlParameters = formUrlParameters(coordinates, status, publishValue);
QUrl url = formUrl(SITUARE_URL, UPDATE_LOCATION, urlParameters);
+
+ //sendRequest(url, COOKIE, cookie);
+}
+
+void SituareService::reverseGeo(QPointF coordinates)
+{
+// CookieHandler cookieHandler;
+// QString cookie = cookieHandler.formCookie(); // ToDo: get the FB session credentials from somewhere, QSettings...
+
+ QString urlParameters = formUrlParameters(coordinates);
+ QUrl url = formUrl(SITUARE_URL, REVERSE_GEO, urlParameters);
+
+ //sendRequest(url, COOKIE, cookie);
}
QUrl SituareService::formUrl(QString baseUrl, QString phpScript, QString urlParameters)
return parameters;
}
-//QString SituareService::formCookie(QString apiKeyValue, QString expiresValue, QString userValue, QString sessionKeyValue, QString sessionSecretValue, QString signatureValue, QString localeValue)
-//{
-// qDebug() << __PRETTY_FUNCTION__;
-//
-// QString cookie, apiKey, user, expires, sessionKey, sessionSecret, locale, 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;
-//}
-
-void SituareService::sendRequest(QUrl url, QString cookie)
+void SituareService::sendRequest(QUrl url, QString cookieType, QString cookie)
{
qDebug() << __PRETTY_FUNCTION__ << "url: " << url;
QNetworkRequest request;
request.setUrl(url);
- request.setRawHeader(COOKIE.toAscii(), cookie.toUtf8());
+ request.setRawHeader(cookieType.toAscii(), cookie.toUtf8());
- QNetworkReply *reply = m_manager->get(request);
+ QNetworkReply *reply = networkManager->get(request);
currentRequests.append(reply);
}
qDebug() << __PRETTY_FUNCTION__;
QUrl url = reply->url();
+ qDebug() << "BytesAvailable: " << reply->bytesAvailable();
if (reply->error()) {
qDebug() << reply->errorString();
- // ToDo: some error handling etc.
+ emit error(reply->errorString());
+ // ToDo: some general http error handling etc, signal UI?
}
else {
qint64 max = reply->size();
- qDebug() << "Reply from: " << url << "reply " << reply->read(max);
- // ToDo: results handling etc.
+ 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;
+ // ToDo: signal UI?
+ }
+ else if(replyArray == ERROR_LON.toAscii()) {
+ qDebug() << "Error: " << ERROR_LON;
+ // ToDo: signal UI?
+ }
+ else if(replyArray.contains(ERROR_SESSION.toAscii())) {
+ qDebug() << "Error: " << ERROR_SESSION;
+ // ToDo: signal UI?
+ }
+ else {
+ // no error -> update was successful
+ // ToDo: signal UI?
+ qDebug() << reply->read(max);
+ }
}
currentRequests.removeAll(reply);
void updateLocation(QPointF coordinates, QString status, bool publish);
/**
+ * @brief Translates coordinates to street address via Situare server
+ *
+ * @fn reverseGeo
+ * @param coordinates coordinates to be translated
+ */
+ void reverseGeo(QPointF coordinates);
+
+ /**
* @brief Forms a http url
*
* @fn formUrl
*
* @fn formUrlParameters
* @param coordinates current coordinates
- * @param status status message
- * @param publish publish location on Facebook wall (true/false)
+ * @param status optional status message
+ * @param publish optional publish location on Facebook wall (true/false)
* @return QString
*/
- QString formUrlParameters(QPointF coordinates, QString status, QString publish);
-
- /**
- * @brief Forms a http cookie
- *
- * @fn formCookie
- * @param apiKeyValue application key
- * @param expiresValue session expire date&time from Facebook
- * @param userValue user id from Facebook
- * @param sessionKeyValue session key from Facebook
- * @param sessionSecretValue session secret from Facebook
- * @param signatureValue md5 generated signature
- * @param localeValue used locale
- * @return QString formed cookie
- */
- //QString formCookie(QString apiKeyValue, QString expiresValue, QString userValue, QString sessionKeyValue, QString sessionSecretValue, QString signatureValue, QString localeValue);
+ QString formUrlParameters(QPointF coordinates, QString status = 0, QString publish = 0);
/**
* @brief Sends http request
*
* @fn sendRequest
* @param url destination
+ * @param cookieType type of the cookie
* @param cookie http cookie
*/
- void sendRequest(QUrl url, QString cookie);
+ void sendRequest(QUrl url, QString cookieType, QString cookie);
+
+signals:
+
+ /**
+ * @brief Signals error
+ *
+ * @fn error
+ * @param error error message
+ */
+ void error(const QString &error);
public slots:
void requestFinished(QNetworkReply *reply);
private:
- QNetworkAccessManager *m_manager;
+ QNetworkAccessManager *networkManager;
QList<QNetworkReply *> currentRequests;
};
*/
#include <QDebug>
+#include <QBuffer>
#include "networkaccessmanagermock.h"
-NetworkAccessManagerMock::NetworkAccessManagerMock()
+NetworkAccessManagerMock::NetworkAccessManagerMock(QNetworkAccessManager *manager, QObject *parent)
+ : QNetworkAccessManager(parent)
+ , mode(0)
{
+ qDebug() << __PRETTY_FUNCTION__;
}
-NetworkReplyMock *NetworkAccessManagerMock::get(const QNetworkRequest &request)
+NetworkReplyMock *NetworkAccessManagerMock::createRequest(Operation op, const QNetworkRequest &request,
+ QIODevice *outgoingData)
{
- qDebug() << __PRETTY_FUNCTION__;
- this->request = request;
- reply = new NetworkReplyMock(this);
+ qDebug() << __PRETTY_FUNCTION__;
+
+ reply = new NetworkReplyMock(this);
+ this->request = request;
- switch (this->mode) {
+ switch (this->mode) {
- case NetworkAccessManagerMock::CORRECT:
+ case NetworkAccessManagerMock::CORRECT:
QTimer::singleShot(0, this, SLOT(generateCorrectReply()));
break;
case NetworkAccessManagerMock::INCORRECT:
default:
QTimer::singleShot(0, this, SLOT(generateCorrectReply()));
break;
- }
+ }
+ return reply;
+}
- return reply;
+NetworkReplyMock *NetworkAccessManagerMock::get(const QNetworkRequest &request)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+ this->request = request;
+
+ return reply;
}
void NetworkAccessManagerMock::setMode(int mode)
{
this->mode = mode;
}
+
+void NetworkAccessManagerMock::generateError()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+ reply->setUrl(request.url());
+ reply->setError(QNetworkReply::HostNotFoundError, "Host not found");
+ emit QNetworkAccessManager::finished(reply);
+}
+
+void NetworkAccessManagerMock::generateCorrectReply()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+ reply->setUrl(request.url());
+ reply->setError(QNetworkReply::NoError, "No error");
+// QImage image;
+// if (!image.load(":testTile.png", 0)) {
+// qDebug() << "could not load image";
+// image = QImage();
+// }
+// else
+// qDebug() << "image loaded";
+//
+// QByteArray array;
+// QBuffer buffer(&array);
+// buffer.open(QBuffer::WriteOnly);
+// if (image.save(&buffer, "PNG"))
+// qDebug() << "image saved";
+// buffer.close();
+// reply->setData(array);
+ emit QNetworkAccessManager::finished(reply);
+}
+
+void NetworkAccessManagerMock::generateDelayedCorrectReply()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+ QTimer::singleShot(4000, this, SLOT(generateCorrectReply()));
+}
{
Q_OBJECT
public:
- NetworkAccessManagerMock();
+ NetworkAccessManagerMock(QNetworkAccessManager *manager = 0, QObject *parent = 0);
+
NetworkReplyMock *get(const QNetworkRequest &request);
+
void setMode(int mode);
enum {CORRECT, INCORRECT, DELAYED_CORRECT};
+protected:
+ NetworkReplyMock *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData);
+
signals:
void finished(NetworkReplyMock *reply);
+ private slots:
+ void generateError();
+ void generateCorrectReply();
+ void generateDelayedCorrectReply();
+
private:
NetworkReplyMock *reply;
QNetworkRequest request;
{
}
-//void NetworkReplyMock::setError(NetworkError errorCode, const QString &errorString)
-//{
-// qDebug() << __PRETTY_FUNCTION__;
-// //QNetworkReply::setError(errorCode, errorString);
-//}
+void NetworkReplyMock::setError(NetworkError errorCode, const QString &errorString)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+ QNetworkReply::setError(errorCode, errorString);
+}
qint64 NetworkReplyMock::readData(char *data, qint64 maxLen)
return m_content;
}
+qint64 NetworkReplyMock::bytesAvailable() const
+{
+ qDebug() << __PRETTY_FUNCTION__;
+ return m_content.size() - m_offset;
+}
+
void NetworkReplyMock::setUrl(const QUrl &url)
{
qDebug() << __PRETTY_FUNCTION__;
- //QNetworkReply::setUrl(url);
+ QNetworkReply::setUrl(url);
}
void NetworkReplyMock::abort()
void NetworkReplyMock::setData(const QByteArray &content)
{
-// qDebug() << __PRETTY_FUNCTION__;
+ qDebug() << __PRETTY_FUNCTION__;
// setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png"));
// setHeader(QNetworkRequest::ContentLengthHeader, QVariant(this->m_content.size()));
// m_content.append(content);
- qDebug() << "Content size: " << m_content.size();
+// qDebug() << "Content size: " << m_content.size();
}
#include <QNetworkReply>
#include <QUrl>
+
class NetworkReplyMock : public QNetworkReply
{
Q_OBJECT
public:
NetworkReplyMock(QObject *parent = 0);
void abort();
- qint64 bytesAvailable() const
- {
- return m_content.size() - m_offset;
- }
+ qint64 bytesAvailable() const;
+
bool isSequential() const
{
return true;
}
- //void setError(NetworkError errorCode, const QString &errorString);
+ void setError(NetworkError errorCode, const QString &errorString);
void setData(const QByteArray &content);
void setUrl(const QUrl &url);
void test();
#include <QtTest/QtTest>
#include <QtCore>
#include <QPointF>
+#include <QNetworkAccessManager>
#include "../../../src/situareservice/situareservice.h"
+#include "../../../src/situareservice/situarecommon.h"
#include "networkaccessmanagermock.h"
#include "networkreplymock.h"
Q_OBJECT
private:
SituareService *situare;
- NetworkAccessManagerMock *manager;
+ NetworkAccessManagerMock *managerMock;
+ QList<QNetworkReply *> currentRequests;
private slots:
- void testLocationUpdatePublishWithoutStatus();
- void testLocationUpdatePublishWithStatus();
- void testLocationUpdateUnPublishWithStatus();
- void testLocationUpdateUnPublishWithoutStatus();
+
+ void testIncorrectUrl();
+ void testCorrectUrl();
};
-void testLocationUpdate::testLocationUpdatePublishWithoutStatus()
+
+void testLocationUpdate::testIncorrectUrl()
{
- manager = new NetworkAccessManagerMock();
+ QNetworkAccessManager *manager = new QNetworkAccessManager();
+ managerMock = new NetworkAccessManagerMock(manager, this);
situare = new SituareService(this, manager);
- QPointF coordinates(65, 25.5);
- bool publish = true;
- QString status = "";
- situare->updateLocation(coordinates, status, publish);
+ managerMock->setMode(NetworkAccessManagerMock::INCORRECT);
+
+ QSignalSpy receivedErrorSpy(situare, SIGNAL(error(QString)));
+
+ QVERIFY(receivedErrorSpy.isValid());
+
+ // incorrect url
+
+ situare->sendRequest(QUrl("http://client.situare.nett"), COOKIE, QString(";2;1"));
+ QTest::qWait(1000);
+ QCOMPARE(receivedErrorSpy.count(), 1);
delete manager;
- delete situare;
+ //delete situare;
}
-void testLocationUpdate::testLocationUpdatePublishWithStatus()
+void testLocationUpdate::testCorrectUrl()
{
- manager = new NetworkAccessManagerMock();
+ QNetworkAccessManager *manager = new QNetworkAccessManager();
+ managerMock = new NetworkAccessManagerMock(manager, this);
situare = new SituareService(this, manager);
- QPointF coordinates(65, 25.5);
- bool publish = true;
- QString status = "test - publish";
- situare->updateLocation(coordinates, status, publish);
+ managerMock->setMode(NetworkAccessManagerMock::CORRECT);
+
+ QSignalSpy receivedErrorSpy(situare, SIGNAL(error(QString)));
+
+ QVERIFY(receivedErrorSpy.isValid());
+
+ QUrl url = QUrl("http://client.situare.net");
+
+ situare->sendRequest(url, COOKIE, QString(";2;1"));
+ QTest::qWait(1000);
+
+ QCOMPARE(receivedErrorSpy.count(), 0);
delete manager;
delete situare;
private slots:
- void testFormCookie(); // cookie test
-
void testWithNoPublishNoStatus(); // part 1 of testFormUrlParameters
void testWithStatusNoPublish(); // part 2 of testFormUrlParameters
void testWithPublishTrueNoStatus(); // part 3 of testFormUrlParameters
void testWithPublishFalseNoStatus(); // part 6 of testFormUrlParameters
void testFormUpdateLocationUrl(); // updateLocation url test
+ void testFormReverseGeoUrl(); // reverseGeo url test
};
-void testStringFormations::testFormCookie()
-{
- const QString apiKey = "1";
- const QString expires = "2";
- const QString sessionKey = "3";
- const QString user = "4";
- const QString sessionSecret = "5";
- const QString signature = "6";
- const QString locale = "7";
-
- QString cookie = situare->formCookie(apiKey, expires, user, sessionKey, sessionSecret, signature, locale);
-
- QCOMPARE(QString(";1_expires=2;1_session_key=3;1_user=4;1_ss=5;1=6;locale=7"), cookie);
-}
-
void testStringFormations::testWithNoPublishNoStatus()
{
QPointF coordinates(65.3, 25.5);
QCOMPARE(QString("http://client.situare.net/updateLocation.php?lat=65.3&lon=25.5&publish=false"), url.toString());
}
+void testStringFormations::testFormReverseGeoUrl()
+{
+ QPointF coordinates(65.3, 25.5);
+
+ QString params = situare->formUrlParameters(coordinates);
+
+ QUrl url = situare->formUrl(SITUARE_URL, REVERSE_GEO, params);
+
+ QCOMPARE(QString("http://client.situare.net/reversegeo.php?lat=65.3&lon=25.5"), url.toString());
+}
+
QTEST_MAIN(testStringFormations)
#include "teststringformations.moc"