backup for routing authorizing
authorlampehe-local <henri.lampela@ixonos.com>
Tue, 20 Jul 2010 12:33:37 +0000 (15:33 +0300)
committerlampehe-local <henri.lampela@ixonos.com>
Tue, 20 Jul 2010 12:33:37 +0000 (15:33 +0300)
src/engine/engine.cpp
src/network/networkaccessmanager.cpp
src/network/networkaccessmanager.h
src/routing/routingservice.cpp
src/routing/routingservice.h

index 547a4fe..d1a269f 100644 (file)
@@ -116,7 +116,7 @@ SituareEngine::SituareEngine()
 
     m_automaticUpdateIntervalTimer = new QTimer(this);
     connect(m_automaticUpdateIntervalTimer, SIGNAL(timeout()),
-            this, SLOT(startAutomaticUpdate()));
+            this, SLOT(startAutomaticUpdateget()));
 
     // signals connected, now it's time to show the main window
     // but init the MapEngine before so starting location is set
index 307cdae..51cf233 100644 (file)
@@ -128,6 +128,33 @@ QNetworkReply *NetworkAccessManager::get(const QNetworkRequest &request, bool on
     }
 }
 
+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__;
index f10c05a..cb6e304 100644 (file)
@@ -61,14 +61,26 @@ public:
     bool isConnected();
 
     /**
-    * @brief Makes request and return reply.
+    * @brief Makes get request and returns reply.
     *
     * @param request QNetworkRequest
+    * @param onlineRequestOnly bool
     * @return QNetworkReply
     */
     QNetworkReply *get(const QNetworkRequest &request, bool onlineRequestsOnly = false);
 
     /**
+    * @brief Makes post request and returns reply.
+    *
+    * @param request QNetworkRequest
+    * @param data QByteArray
+    * @param onlineRequestOnly bool
+    * @return QNetworkReply
+    */
+    QNetworkReply *post( const QNetworkRequest &request, QByteArray &data,
+                         bool onlineRequestsOnly = false);
+
+    /**
     * @brief Sets cache.
     *
     * @param cache QAbstractNetworkCache instance
index 2a0ee59..220e2b3 100644 (file)
    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()
@@ -105,16 +122,60 @@ void RoutingService::parseRouteData(const QByteArray &jsonReply)
     }
 }
 
+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();
@@ -123,30 +184,37 @@ void RoutingService::requestFinished(QNetworkReply *reply)
 
 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);
 }
index ce7e72c..7f734db 100644 (file)
@@ -36,7 +36,7 @@ class QUrl;
 * @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
@@ -62,6 +62,7 @@ public:
  * MEMBER FUNCTIONS AND SLOTS
  ******************************************************************************/
 public slots:
+
     /**
     * @brief Public slot, which indicates when http request has been completed
     *
@@ -78,6 +79,7 @@ public slots:
     void requestRoute(QPointF from, QPointF to);
 
 private:
+
     /**
     * @brief Parses routing data from JSON string
     *
@@ -86,6 +88,12 @@ private:
     void parseRouteData(const QByteArray &jsonReply);
 
     /**
+    * @brief Request authorization token
+    *
+    */
+    void requestAuthorizationToken();
+
+    /**
     * @brief Sends http request
     *
     * @param url destination
@@ -116,9 +124,13 @@ signals:
  * 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