}
}
+QNetworkReply *NetworkAccessManager::post(const QNetworkRequest &request, QByteArray &data,
+ bool onlineRequestsOnly)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ //Disconnected from network, queue request and return empty reply.
+ if (!m_networkHandler->isConnected()) {
+ m_requestQueue.append(request);
+ m_networkHandler->connect();
+ QNetworkReply *reply = new NetworkReply(request, this);
+
+ if (onlineRequestsOnly) {
+ ((NetworkReply*)reply)->setErrorCode(QNetworkReply::UnknownNetworkError);
+ emit finished(reply);
+ }
+ else {
+ m_offlineReplyQueue.insert(request.url().toString(), reply);
+ }
+
+ return reply;
+ }
+ //Connected, use normal get method.
+ else {
+ return m_networkAccessManagerPrivate->post(request, data);
+ }
+}
+
NetworkAccessManager *NetworkAccessManager::instance()
{
qDebug() << __PRETTY_FUNCTION__;
USA.
*/
-#include <QFile>
#include <QDebug>
#include <QtGlobal>
#include <QStringList>
#include <QNetworkReply>
#include <QPointF>
+#include <QCryptographicHash>
+
+#if defined(Q_WS_MAEMO_5) & defined(ARMEL)
+#include <QDBusInterface>
+#include <QDBusMessage>
+#endif
#include "common.h"
#include "network/networkaccessmanager.h"
#include "routingservice.h"
+// defines for IMEI retrieval via dbus
+#define SIM_DBUS_SERVICE "com.nokia.phone.SIM"
+#define SIM_DBUS_PATH "/com/nokia/phone/SIM/security"
+#define SIM_DBUS_IFACE "Phone.Sim.Security"
+#define SIM_IMEI_REQ "get_imei"
+
const int NO_ERROR = 0;
-/// @todo REGISTER API KEY, THE FOLLOWING IS FROM CLOUDMADE EXAMPLE URL'S
-const QString CLOUDMADE_API_KEY = "BC9A493B41014CAABB98F0471D759707";
-/// @todo implement tokens & authentication
+
+// cloudmade
+const QString CLOUDMADE_AUTH_PART = "http://auth.cloudmade.com/token/";
+const QString CLOUDMADE_API_KEY = "0cea0072adbf42ce823f4c78b974f12d";
+
RoutingService::RoutingService(QObject *parent)
: QObject(parent)
{
qDebug() << __PRETTY_FUNCTION__;
+ m_pendingRequest.clear();
+ m_token.clear();
+
m_networkManager = NetworkAccessManager::instance();
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(requestFinished(QNetworkReply*)), Qt::QueuedConnection);
+
}
RoutingService::~RoutingService()
}
}
+void RoutingService::requestAuthorizationToken()
+{
+ qWarning() << __PRETTY_FUNCTION__;
+
+ // create token request of format: http://auth.cloudmade.com/token/APIKEY?userid=UserID
+ // where APIKEY is our application specific key and userID is md5 hashed value of IMEI code
+ QString url = CLOUDMADE_AUTH_PART;
+ url.append(CLOUDMADE_API_KEY);
+ QString uidPart = "?userid=";
+ QByteArray rawData;
+
+#ifdef Q_WS_MAEMO_5
+ // get the device IMEI code
+ QDBusInterface interface(SIM_DBUS_SERVICE, SIM_DBUS_PATH, SIM_DBUS_IFACE,
+ QDBusConnection::systemBus());
+
+ QDBusMessage reply = interface.call(SIM_IMEI_REQ);
+ if (reply.type() == QDBusMessage::ErrorMessage)
+ qDebug() << reply.errorMessage();
+ else {
+ QList<QVariant> args = reply.arguments();
+ qWarning() << QString("Phone's IMEI: %1").arg(args.at(0).toString());
+ rawData = args.at(0).toByteArray();
+ }
+#else
+ // for desktop we need to use login name
+ rawData.append(system("whoami"));
+#endif
+
+ QCryptographicHash crypto(QCryptographicHash::Md5);
+ crypto.addData(rawData);
+ uidPart.append(crypto.result().toHex());
+
+ url.append(uidPart);
+ sendRequest(url);
+}
+
void RoutingService::requestFinished(QNetworkReply *reply)
{
- qDebug() << __PRETTY_FUNCTION__;
+ qWarning() << __PRETTY_FUNCTION__;
if (m_currentRequests.contains(reply)) {
-
- if (reply->error())
+ qWarning() << reply->readAll();
+ if (reply->error()) {
emit error(ErrorContext::NETWORK, reply->error());
- else
+ } else if(reply->url().toString().contains(CLOUDMADE_AUTH_PART)) {
+ m_token = reply->readAll();
+ m_pendingRequest.append(m_token);
+ sendRequest(m_pendingRequest);
+ m_pendingRequest.clear();
+ qWarning() << m_token;
+ } else {
parseRouteData(reply->readAll());
+ }
m_currentRequests.removeAll(reply);
reply->deleteLater();
void RoutingService::requestRoute(QPointF from, QPointF to)
{
- qDebug() << __PRETTY_FUNCTION__;
+ qWarning() << __PRETTY_FUNCTION__;
QString url = "http://routes.cloudmade.com/";
url.append(CLOUDMADE_API_KEY);
url.append("/api/0.3/");
url.append(QString::number(from.x()) + "," + QString::number(from.y()) + ",");
url.append(QString::number(to.x()) + "," + QString::number(to.y()));
- url.append("/car/fastest.js?lang=en&units=km");
-
- qWarning() << __PRETTY_FUNCTION__ << url;
+ url.append("/car/fastest.js?lang=en&units=km&token=");
- sendRequest(QUrl(url));
+ if(m_token.isEmpty()) {
+ m_pendingRequest.append(url);
+ requestAuthorizationToken();
+ } else {
+ url.append(m_token);
+ sendRequest(QUrl(url));
+ }
+ //sendRequest(QUrl("http://routes.cloudmade.com/BC9A493B41014CAABB98F0471D759707/api/0.3/47.25976,9.58423,47.26117,9.59882/bicycle.js"));
}
void RoutingService::sendRequest(const QUrl &url)
{
- qDebug() << __PRETTY_FUNCTION__;
+ qWarning() << __PRETTY_FUNCTION__;
+ qWarning() << url.toString();
QNetworkRequest request;
request.setUrl(url);
request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
- QNetworkReply *reply = m_networkManager->get(request, true);
+ QByteArray ba;
+ QNetworkReply *reply = m_networkManager->post(request, ba, true);
m_currentRequests.append(reply);
}
* @brief RoutingService class for communicating with CloudMade server
* and parsing routing data
*
-* @author Henri Lampela
+* @author Henri Lampela - henri.lampela@ixonos.com
* @author Sami Rämö - sami.ramo@ixonos.com
*/
class RoutingService : public QObject
* MEMBER FUNCTIONS AND SLOTS
******************************************************************************/
public slots:
+
/**
* @brief Public slot, which indicates when http request has been completed
*
void requestRoute(QPointF from, QPointF to);
private:
+
/**
* @brief Parses routing data from JSON string
*
void parseRouteData(const QByteArray &jsonReply);
/**
+ * @brief Request authorization token
+ *
+ */
+ void requestAuthorizationToken();
+
+ /**
* @brief Sends http request
*
* @param url destination
* DATA MEMBERS
******************************************************************************/
private:
+
QList<QNetworkReply *> m_currentRequests; ///< List of current http requests
- NetworkAccessManager *m_networkManager; ///< Pointer to QNetworkAccessManager
+ QString m_pendingRequest; ///< Placeholder for pending route request
+ QString m_token; ///< Placeholder for authentication token
+
+ NetworkAccessManager *m_networkManager; ///< Pointer to QNetworkAccessManager
};
#endif // ROUTINGSERVICE_H