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);
+ }
+}
#define NETWORKACCESSMANAGER_H
#include <QList>
+#include <QHash>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QAbstractNetworkCache>
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
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);
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();
}
}
{
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()
private:
QDBusInterface *dBusInterface; ///< D-Bus interface
bool m_connected; ///< Connection state variable
+ bool m_connecting; ///< Connecting state variable
};
#endif // NETWORKHANDLER_H
#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)
#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);
void MapFetcher::downloadFinished(QNetworkReply *reply)
{
- qDebug() << __PRETTY_FUNCTION__;
+ qWarning() << __PRETTY_FUNCTION__ << reply->url().toString();
if (reply->error() == QNetworkReply::NoError) {
QImage image;
emit error(reply->errorString());
}
- m_currentDownloads.removeAll(reply);
+ qWarning() << __PRETTY_FUNCTION__ << "Removed: " << m_currentDownloads.removeAll(reply);
reply->deleteLater();
startNextDownload();
}
{
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;
#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)
{
#include <QtCore>
-class QNetworkAccessManager;
+class NetworkAccessManager;
class QNetworkReply;
class QUrl;
* @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
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
#include "situarecommon.h"
#include "parser.h"
#include "ui/avatarimage.h"
+#include "engine/networkaccessmanager.h"
SituareService::SituareService(QObject *parent)
: 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)));