5#include <QtCore/QTimerEvent>
20QGeoTileFetcher::QGeoTileFetcher(QGeoMappingManagerEngine *parent)
21: QObject(*
new QGeoTileFetcherPrivate(), parent)
29QGeoTileFetcher::QGeoTileFetcher(QGeoTileFetcherPrivate &dd, QGeoMappingManagerEngine *parent)
37QGeoTileFetcher::~QGeoTileFetcher()
41void QGeoTileFetcher::updateTileRequests(
const QSet<QGeoTileSpec> &tilesAdded,
42 const QSet<QGeoTileSpec> &tilesRemoved)
46 QMutexLocker ml(&d->queueMutex_);
48 cancelTileRequests(tilesRemoved);
50 std::copy(tilesAdded.cbegin(), tilesAdded.cend(), std::back_inserter(d->queue_));
52 if (d->enabled_ && initialized() && !d->queue_.isEmpty() && !d->timer_.isActive())
53 d->timer_.start(0,
this);
56void QGeoTileFetcher::cancelTileRequests(
const QSet<QGeoTileSpec> &tiles)
60 typedef QSet<QGeoTileSpec>::const_iterator tile_iter;
62 tile_iter tile = tiles.constBegin();
63 tile_iter end = tiles.constEnd();
64 for (; tile != end; ++tile) {
65 QGeoTiledMapReply *reply = d->invmap_.value(*tile, 0);
67 d->invmap_.remove(*tile);
69 if (reply->isFinished())
72 d->queue_.removeAll(*tile);
76void QGeoTileFetcher::requestNextTile()
80 QMutexLocker ml(&d->queueMutex_);
85 if (d->queue_.isEmpty())
88 QGeoTileSpec ts = d->queue_.takeFirst();
89 if (d->queue_.isEmpty())
93 const QGeoCameraCapabilities & cameraCaps = d->engine_->cameraCapabilities(ts.mapId());
96 if (ts.zoom() < cameraCaps.minimumZoomLevel() || ts.zoom() > cameraCaps.maximumZoomLevel() || !fetchingEnabled())
99 QGeoTiledMapReply *reply = getTileImage(ts);
103 if (reply->isFinished()) {
104 handleReply(reply, ts);
106 connect(reply, &QGeoTiledMapReply::finished,
107 this, &QGeoTileFetcher::finished, Qt::QueuedConnection);
109 d->invmap_.insert(ts, reply);
113void QGeoTileFetcher::finished()
115 Q_D(QGeoTileFetcher);
117 QMutexLocker ml(&d->queueMutex_);
119 QGeoTiledMapReply *reply = qobject_cast<QGeoTiledMapReply *>(sender());
123 QGeoTileSpec spec = reply->tileSpec();
125 if (!d->invmap_.contains(spec)) {
126 reply->deleteLater();
130 d->invmap_.remove(spec);
132 handleReply(reply, spec);
135void QGeoTileFetcher::timerEvent(QTimerEvent *event)
137 Q_D(QGeoTileFetcher);
138 if (event->timerId() != d->timer_.timerId()) {
139 QObject::timerEvent(event);
143 QMutexLocker ml(&d->queueMutex_);
144 if (d->queue_.isEmpty() || !initialized()) {
153bool QGeoTileFetcher::initialized()
const
158bool QGeoTileFetcher::fetchingEnabled()
const
163void QGeoTileFetcher::handleReply(QGeoTiledMapReply *reply,
const QGeoTileSpec &spec)
165 Q_D(QGeoTileFetcher);
168 reply->deleteLater();
172 if (reply->error() == QGeoTiledMapReply::NoError) {
173 emit tileFinished(spec, reply->mapImageData(), reply->mapImageFormat());
175 emit tileError(spec, reply->errorString());
178 reply->deleteLater();
182