INCLUDEPATH += . \
src/tests/testMap/ \
src/map/
-SOURCES += src/ui/mainwindow.cpp \
- src/map/mapfetcherqueue.cpp \
- src/map/mapengine.cpp \
- tests/testMap/testmapfetcher.cpp
-
-# tests/testMap/testmapengine.cpp
+SOURCES += src/main.cpp \
+ src/ui/mainwindow.cpp \
+ src/map/mapfetcher.cpp \
+ src/map/mapengine.cpp
+# tests/testMap/testmapfetcher.cpp
# src/main.cpp \
+# tests/testMap/testmapengine.cpp
HEADERS += src/ui/mainwindow.h \
- src/map/mapfetcherqueue.h \
+ src/map/mapfetcher.h \
src/map/mapengine.h
#include "mapfetcher.h"
+static int MAX_PARALLEL_DOWNLOADS = 2;
+
MapFetcher::MapFetcher(QObject *parent)
: QObject(parent)
{
if (url.isEmpty())
return;
+ //Limit parallel downloads
+ if (downloadQueue.length() < MAX_PARALLEL_DOWNLOADS)
+ QTimer::singleShot(0, this, SLOT(startNextDownload()));
+
+ downloadQueue.enqueue(url);
+}
+
+void MapFetcher::startNextDownload()
+{
+ qDebug() << "startNextDownload()";
+ if (downloadQueue.isEmpty())
+ return;
+
+ QUrl url = downloadQueue.dequeue();
QNetworkRequest request(url);
request.setRawHeader("User-Agent", "Map Test");
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute,
QNetworkRequest::PreferCache);
- m_manager.get(request);
+ QNetworkReply *reply = m_manager.get(request);
+
+ currentDownloads.append(reply);
}
void MapFetcher::downloadFinished(QNetworkReply *reply)
{
qDebug() << "downloadFinished()";
if (reply->error()) {
- qDebug() << reply->errorString();
emit error(reply->errorString());
}
else {
emit mapImageReceived(url, QPixmap::fromImage(image));
}
+ currentDownloads.removeAll(reply);
reply->deleteLater();
+ startNextDownload();
}
MapFetcher::~MapFetcher()
* @param reply
*/
void downloadFinished(QNetworkReply *reply);
+ void startNextDownload();
private:
QNetworkAccessManager m_manager;
+ QList<QNetworkReply *> currentDownloads;
+ QQueue<QUrl> downloadQueue;
};
#endif
public:
TestMapFetcher();
+
private slots:
void testFetchImage();
void testSignals();
private:
- MapFetcherQueue *mapFetcher;
+ MapFetcher *mapFetcher;
};
TestMapFetcher::TestMapFetcher()
{
- mapFetcher = new MapFetcherQueue();
+ mapFetcher = new MapFetcher();
}
void TestMapFetcher::testFetchImage()
mapFetcher->fetchMapImage(url2);
QTest::qWait(1000);
QCOMPARE(imageReceivedSpy.count(), 1);
- QList<QVariant> signalArgs2 = imageReceivedSpy.takeFirst();
+ QList<QVariant> signalArgs2 = imageReceivedSpy.takeLast();
QCOMPARE(url2, signalArgs2.at(0).toUrl());*/
//20 requests immediately
- for (int i = 0; i < 10; ++i) {
- QUrl url(QString("http://tile.openstreetmap.org/7/63/2%1.png").arg(i));
- mapFetcher->fetchMapImage(url);
+ /*for (int i = 1; i < 3; ++i) {
+ for (int j = 0; j < 10; ++j) {
+ QUrl url(QString("http://tile.openstreetmap.org/7/53/%1%2.png").arg(i).arg(j));
+ mapFetcher->fetchMapImage(url);
+ }
+ }
+ QTest::qWait(400);
+
+ //50 requests immediately
+ for (int i = 1; i < 6; ++i) {
+ for (int j = 0; j < 10; ++j) {
+ QUrl url(QString("http://tile.openstreetmap.org/7/63/%1%2.png").arg(i).arg(j));
+ mapFetcher->fetchMapImage(url);
+ }
}
+
+ QTest::qWait(2000);*/
+
for (int i = 0; i < 10; ++i) {
- QUrl url(QString("http://tile.openstreetmap.org/7/63/3%1.png").arg(i));
+ QUrl url(QString("http://tile.openstreetmap.org/7/53/%1%2.png").arg(i));
mapFetcher->fetchMapImage(url);
}
- QTest::qWait(2000);
+
+ QTest::qWait(1000);
}