+/*
+ Situare - A location system for Facebook
+ Copyright (C) 2010 Ixonos Plc. Authors:
+
+ Jussi Laitinen - jussi.laitinen@ixonos.com
+ Sami Rämö - sami.ramo@ixonos.com
+
+ Situare is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ Situare is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Situare; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ USA.
+*/
+
#ifndef MAPFETCHER_H
#define MAPFETCHER_H
class QNetworkReply;
class QUrl;
-#include "mapfetcher.h"
-
+/**
+* @brief MapFetcher handles requests to get map tiles.
+*
+* @author Jussi Laitinen jussi.laitinen@ixonos.com
+* @author Sami Rämö sami.ramo@ixonos.com
+*/
class MapFetcher : public QObject
{
Q_OBJECT
+ /**
+ * @brief Type for download requests
+ *
+ * @typedef Request
+ */
+ /**
+ * @brief Struct for download requests
+ *
+ * @struct _Request
+ */
+ typedef struct _Request {
+ bool cacheChecked; ///< Is this request already checked from the cache
+ QUrl url; ///< URL
+ } Request;
+
public:
- MapFetcher(QObject *parent = 0);
- ~MapFetcher();
- void fetchMapImage(const QUrl &url);
+ /**
+ * @brief Constructor for MapFetcher.
+ *
+ * @param manager Network access manager
+ * @param parent parent object
+ */
+ MapFetcher(QNetworkAccessManager *manager, QObject *parent = 0);
-signals:
- void mapImageReceived(const QImage &image);
- void error(const QString &message);
+/*******************************************************************************
+ * CLASS SPECIFIC MEMBER FUNCTIONS AND SLOTS
+ ******************************************************************************/
+public:
+ /**
+ * @brief Set size of the download queue
+ *
+ * @param size New size
+ */
+ void setDownloadQueueSize(int size);
public slots:
+ /**
+ * @brief Enqueue fetching of map image
+ *
+ * Image fetching is triggered after events have been processed
+ * so the UI stays responsive.
+ *
+ * @param url URL of the image to be fetched
+ */
+ void enqueueFetchMapImage(QUrl url);
+
+private:
+
+ /**
+ * @brief Limit pending requests list size to m_pendingRequestsSize
+ *
+ */
+ void limitPendingRequestsListSize();
+
+ /**
+ * @brief Loads image from cache if it's available and emits imageReveived
+ * signal with url and image. If image is in cache returns true, false
+ * otherwise.
+ *
+ * @param url
+ * @return bool true if image was loaded from cache, false otherwise
+ */
+ bool loadImageFromCache(const QUrl &url);
+
+ /**
+ * @brief Find first item based on criteria if the request is already checked from the cache
+ *
+ * If cacheChecked is true, then returns index of the first request which is already
+ * checked from the cache. If cacheChecked is false then returns first item which
+ * isn't checked from the cache. Returns -1 if the item is not found.
+ *
+ * @param cacheChecked Search criteria
+ * @return Index of the first matching request, or -1 if not found.
+ */
+ int newestRequestIndex(bool cacheChecked);
+
+private slots:
+
+ /**
+ * @brief This slot is called when network manager has finished
+ * the download. Loads image and emits imageReceived signal with
+ * url and image. If there was a error in reply emits error-signal.
+ *
+ * @param reply
+ */
void downloadFinished(QNetworkReply *reply);
+ /**
+ * @brief Check next request if it is found from cache
+ *
+ * Next queued request, which is not already checked against cache, is taken
+ * from the queue and checked against cache. If not found from cache, then
+ * cache checked flag is set. New download is started if there aren't too
+ * many simultaneus downloads already running.
+ */
+ void checkNextRequestFromCache();
+
+ /**
+ * @brief This slot is called when next download is started. Takes url
+ * from queue, sends request and puts request to download queue.
+ */
+ void startNextDownload();
+
+/*******************************************************************************
+ * SIGNALS
+ ******************************************************************************/
+signals:
+ /**
+ * @brief Signal which is emitted when a map tile
+ * is received from the server and loaded to pixmap.
+ *
+ * @param url URL to image
+ * @param image image pixmap
+ */
+ void mapImageReceived(const QUrl &url, const QPixmap &image);
+
+ /**
+ * @brief Signal which is emitted when there is error
+ * in network reply.
+ *
+ * @param message error message
+ */
+ void error(const QString &message);
+
+/*******************************************************************************
+ * DATA MEMBERS
+ ******************************************************************************/
private:
- QNetworkAccessManager m_manager;
+ static const int MAX_PARALLEL_DOWNLOADS = 2; ///< Max simultaneous parallel downloads
+
+ QList<QNetworkReply*> m_currentDownloads; ///< List of current downloads
+ int m_pendingRequestsSize; ///< Max number of pending requests
+ bool m_fetchMapImagesTimerRunning; ///< is the singleshot timer already running
+ QNetworkAccessManager *m_manager; ///< Network access manager
+ QList<Request> m_pendingRequests; ///< List of map image fetching requests
};
#endif