Added method to queue requests if not connected to network.
authorJussi Laitinen <jupe@l3l7588.ixonos.local>
Wed, 26 May 2010 11:32:21 +0000 (14:32 +0300)
committerJussi Laitinen <jupe@l3l7588.ixonos.local>
Wed, 26 May 2010 11:32:21 +0000 (14:32 +0300)
src/engine/networkaccessmanager.cpp
src/engine/networkaccessmanager.h
src/engine/networkhandler.cpp
src/engine/networkhandler.h
src/engine/networkreply.cpp
src/engine/networkreply.h
src/map/mapfetcher.cpp
src/situareservice/imagefetcher.cpp
src/situareservice/imagefetcher.h
src/situareservice/situareservice.cpp

index 03fddbb..8470bb1 100644 (file)
@@ -36,38 +36,80 @@ NetworkAccessManager::NetworkAccessManager(QObject *parent)
 
     connect(m_networkHandler, SIGNAL(connected()),
             this, SLOT(connected()));
+
+    connect(m_networkAccessManagerPrivate, SIGNAL(finished(QNetworkReply*)),
+            this, SLOT(downloadFinished(QNetworkReply*)));
 }
 
 void NetworkAccessManager::setCache(QAbstractNetworkCache *cache)
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     m_networkAccessManagerPrivate->setCache(cache);
 }
 
 QAbstractNetworkCache *NetworkAccessManager::cache() const
 {
+    qDebug() << __PRETTY_FUNCTION__;
+
     return m_networkAccessManagerPrivate->cache();
 }
 
 QNetworkReply *NetworkAccessManager::get(const QNetworkRequest &request)
 {
+    qWarning() << __PRETTY_FUNCTION__ << request.url().toString();
+
+    //Disconnected from network, queue request and return empty reply.
     if (!m_networkHandler->isConnected()) {
+        qWarning() << __PRETTY_FUNCTION__ << "not connected";
         m_requestQueue.append(request);
         m_networkHandler->connect();
-        QNetworkReply *reply = new NetworkReply(this);
-        m_replyQueue.append(reply);
+        QNetworkReply *reply = new NetworkReply(request, this);
+        m_offlineReplyQueue.insert(request.url().toString(), reply);
         return reply;
     }
+    //Connected, use normal get method.
     else {
-        return get(request);
+        qWarning() << __PRETTY_FUNCTION__ << "connected";
+        return m_networkAccessManagerPrivate->get(request);
     }
 }
 
 void NetworkAccessManager::connected()
 {
-    foreach (QNetworkRequest request, m_requestQueue) {
-        QNetworkReply *reply = get(request);
+    qWarning() << __PRETTY_FUNCTION__;
+
+    //Loop through all requests and calls get method.
+    foreach (const QNetworkRequest &request, m_requestQueue) {
+        qWarning() << __PRETTY_FUNCTION__ << "get():" << request.url().toString();
+        QNetworkReply *reply = m_networkAccessManagerPrivate->get(request);
+        m_temporaryReplyQueue.insert(request.url().toString(), reply);
     }
 
-    m_replyQueue.clear();
     m_requestQueue.clear();
 }
+
+void NetworkAccessManager::downloadFinished(QNetworkReply *reply)
+{
+    qWarning() << __PRETTY_FUNCTION__ << reply->url().toString();
+
+    QString key = m_temporaryReplyQueue.key(reply);
+
+    //Replace offline reply object's content with server reply's content
+    if (!key.isNull()) {
+        qWarning() << "Sizeof reply: " << sizeof(QNetworkReply);
+
+        QNetworkReply *offlineReply = m_offlineReplyQueue.value(key);
+
+        if (offlineReply) {
+            memmove(offlineReply, reply, sizeof(QNetworkReply));
+            m_offlineReplyQueue.remove(key);
+            m_temporaryReplyQueue.remove(key);
+            emit finished(offlineReply);
+        }
+    }
+    //Forward online request's reply
+    else {
+        emit finished(reply);
+    }
+}
index ca84d40..89ca041 100644 (file)
@@ -23,6 +23,7 @@
 #define NETWORKACCESSMANAGER_H
 
 #include <QList>
+#include <QHash>
 #include <QNetworkReply>
 #include <QNetworkRequest>
 #include <QAbstractNetworkCache>
@@ -47,12 +48,17 @@ public:
 
 private slots:
     void connected();
+    void downloadFinished(QNetworkReply *reply);
+
+signals:
+    void finished(QNetworkReply *reply);
 
 private:
     NetworkHandler *m_networkHandler;
     QNetworkAccessManager *m_networkAccessManagerPrivate;
     QList<QNetworkRequest> m_requestQueue;
-    QList<QNetworkReply*> m_replyQueue;
+    QHash<QString, QNetworkReply*> m_offlineReplyQueue;
+    QHash<QString, QNetworkReply*> m_temporaryReplyQueue;
 };
 
 #endif // NETWORKACCESSMANAGER_H
index 228b1f5..0540950 100644 (file)
@@ -29,7 +29,8 @@ enum ConnectionState {DISCONNECTED, CONNECTING, CONNECTED, DISCONNECTING};
 
 NetworkHandler::NetworkHandler(QObject *parent)
     : QObject(parent),
-      m_connected(false)
+      m_connected(false),
+      m_connecting(false)
 {
     dBusInterface = new QDBusInterface(ICD_DBUS_API_INTERFACE, ICD_DBUS_API_PATH,
                                        ICD_DBUS_API_INTERFACE, dBusConnection);
@@ -49,15 +50,17 @@ void NetworkHandler::stateChanged(const QDBusMessage &message)
 
         bool conversionOk;
         int connectionState = message.arguments().at(CONNECTION_STATE_INDEX).toInt(&conversionOk);
-        qDebug() << __PRETTY_FUNCTION__ << message.arguments().at(7);
+        qWarning() << __PRETTY_FUNCTION__ << "Connection state: " << connectionState;
 
         if (conversionOk) {
             if ((connectionState == DISCONNECTED) && (isConnected())) {
                 m_connected = false;
+                m_connecting = false;
                 emit disconnected();
             }
             else if ((connectionState == CONNECTED) &&(!isConnected())) {
                 m_connected = true;
+                m_connecting = false;
                 emit connected();
             }
         }
@@ -68,8 +71,11 @@ void NetworkHandler::connect()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    dBusInterface->call(ICD_DBUS_API_CONNECT_REQ,
-                        QVariant((unsigned int)ICD_CONNECTION_FLAG_USER_EVENT));
+    if (!m_connecting) {
+        m_connecting = true;
+        dBusInterface->call(ICD_DBUS_API_CONNECT_REQ,
+                            QVariant((unsigned int)ICD_CONNECTION_FLAG_USER_EVENT));
+    }
 }
 
 void NetworkHandler::disconnect()
index 555ef9c..6a09647 100644 (file)
@@ -97,6 +97,7 @@ signals:
 private:
     QDBusInterface *dBusInterface;  ///< D-Bus interface
     bool m_connected;               ///< Connection state variable
+    bool m_connecting;              ///< Connecting state variable
 };
 
 #endif // NETWORKHANDLER_H
index 539d523..9148432 100644 (file)
 
 #include "networkreply.h"
 
-NetworkReply::NetworkReply(QObject *parent)
+NetworkReply::NetworkReply(const QNetworkRequest &request, QObject *parent)
     : QNetworkReply(parent)
 {
+    setRequest(request);
 }
 
 qint64 NetworkReply::readData(char *data, qint64 maxlen)
index 4e94b33..6d0ee19 100644 (file)
 #define NETWORKREPLY_H
 
 #include <QNetworkReply>
+#include <QNetworkRequest>
 
 class NetworkReply : public QNetworkReply
 {
 public:
-    NetworkReply(QObject *parent = 0);
+    NetworkReply(const QNetworkRequest &request, QObject *parent = 0);
 
 protected:
     qint64 readData(char *data, qint64 maxlen);
index ff6fefb..838c50c 100644 (file)
@@ -107,7 +107,7 @@ void MapFetcher::checkNextRequestFromCache()
 
 void MapFetcher::downloadFinished(QNetworkReply *reply)
 {
-    qDebug() << __PRETTY_FUNCTION__;
+    qWarning() << __PRETTY_FUNCTION__ << reply->url().toString();
 
     if (reply->error() == QNetworkReply::NoError) {
         QImage image;
@@ -127,7 +127,7 @@ void MapFetcher::downloadFinished(QNetworkReply *reply)
         emit error(reply->errorString());
     }
 
-    m_currentDownloads.removeAll(reply);
+    qWarning() << __PRETTY_FUNCTION__ << "Removed: " << m_currentDownloads.removeAll(reply);
     reply->deleteLater();
     startNextDownload();
 }
@@ -136,7 +136,7 @@ void MapFetcher::enqueueFetchMapImage(int zoomLevel, int x, int y)
 {
     QUrl url = buildURL(zoomLevel, QPoint(x, y));
 
-    qDebug() << __PRETTY_FUNCTION__ << "url:" << url.toString();
+    qWarning() << __PRETTY_FUNCTION__ << "url:" << url.toString();
 
     // check if new request is already in the list and move it to the begin of the list...
     bool found = false;
index d6f2f79..99bc5e8 100644 (file)
@@ -24,8 +24,9 @@
 #include <QNetworkReply>
 #include <QPixmap>
 #include "imagefetcher.h"
+#include "engine/networkaccessmanager.h"
 
-ImageFetcher::ImageFetcher(QNetworkAccessManager *manager, QObject *parent)
+ImageFetcher::ImageFetcher(NetworkAccessManager *manager, QObject *parent)
     : QObject(parent)
     , m_manager(manager)
 {
index 53d075c..39bdd9c 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <QtCore>
 
-class QNetworkAccessManager;
+class NetworkAccessManager;
 class QNetworkReply;
 class QUrl;
 
@@ -45,7 +45,7 @@ public:
     * @param manager QNetworkAccessManager
     * @param parent Parent object
     */
-    ImageFetcher(QNetworkAccessManager *manager, QObject *parent = 0);
+    ImageFetcher(NetworkAccessManager *manager, QObject *parent = 0);
 
 /*******************************************************************************
  * CLASS SPECIFIC MEMBER FUNCTIONS AND SLOTS
@@ -103,7 +103,7 @@ signals:
 private:
     QList<QNetworkReply*> m_currentDownloads; ///< List of current downloads
     QQueue<QUrl> m_downloadQueue;             ///< Queue of pending requests
-    QNetworkAccessManager *m_manager;       ///< Network access manager
+    NetworkAccessManager *m_manager;       ///< Network access manager
 };
 
 #endif // IMAGEFETCHER_H
index 009b073..a864d4e 100644 (file)
@@ -29,6 +29,7 @@
 #include "situarecommon.h"
 #include "parser.h"
 #include "ui/avatarimage.h"
+#include "engine/networkaccessmanager.h"
 
 SituareService::SituareService(QObject *parent)
         : QObject(parent)
@@ -38,7 +39,7 @@ SituareService::SituareService(QObject *parent)
     m_networkManager = new QNetworkAccessManager;
     connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), SLOT(requestFinished(QNetworkReply*)));
 
-    m_imageFetcher = new ImageFetcher(new QNetworkAccessManager(this), this);
+    m_imageFetcher = new ImageFetcher(new NetworkAccessManager(this), this);
     connect(this, SIGNAL(fetchImage(QUrl)), m_imageFetcher, SLOT(fetchImage(QUrl)));
     connect(m_imageFetcher, SIGNAL(imageReceived(QUrl,QPixmap)), this,
             SLOT(imageReceived(QUrl, QPixmap)));