4#include <QtCore/QTimerEvent>
19QGeoTileFetcher::QGeoTileFetcher(QGeoMappingManagerEngine *parent)
20: QObject(*
new QGeoTileFetcherPrivate(), parent)
28QGeoTileFetcher::QGeoTileFetcher(QGeoTileFetcherPrivate &dd, QGeoMappingManagerEngine *parent)
36QGeoTileFetcher::~QGeoTileFetcher()
40void QGeoTileFetcher::updateTileRequests(
const QSet<QGeoTileSpec> &tilesAdded,
41 const QSet<QGeoTileSpec> &tilesRemoved)
45 QMutexLocker ml(&d->queueMutex_);
47 cancelTileRequests(tilesRemoved);
49 std::copy(tilesAdded.cbegin(), tilesAdded.cend(), std::back_inserter(d->queue_));
51 if (d->enabled_ && initialized() && !d->queue_.isEmpty() && !d->timer_.isActive())
52 d->timer_.start(0,
this);
55void QGeoTileFetcher::cancelTileRequests(
const QSet<QGeoTileSpec> &tiles)
59 typedef QSet<QGeoTileSpec>::const_iterator tile_iter;
61 tile_iter tile = tiles.constBegin();
62 tile_iter end = tiles.constEnd();
63 for (; tile != end; ++tile) {
64 QGeoTiledMapReply *reply = d->invmap_.value(*tile, 0);
66 d->invmap_.remove(*tile);
68 if (reply->isFinished())
71 d->queue_.removeAll(*tile);
75void QGeoTileFetcher::requestNextTile()
79 QMutexLocker ml(&d->queueMutex_);
84 if (d->queue_.isEmpty())
87 QGeoTileSpec ts = d->queue_.takeFirst();
88 if (d->queue_.isEmpty())
92 const QGeoCameraCapabilities & cameraCaps = d->engine_->cameraCapabilities(ts.mapId());
95 if (ts.zoom() < cameraCaps.minimumZoomLevel() || ts.zoom() > cameraCaps.maximumZoomLevel() || !fetchingEnabled())
98 QGeoTiledMapReply *reply = getTileImage(ts);
102 if (reply->isFinished()) {
103 handleReply(reply, ts);
105 connect(reply, &QGeoTiledMapReply::finished,
106 this, &QGeoTileFetcher::finished, Qt::QueuedConnection);
108 d->invmap_.insert(ts, reply);
112void QGeoTileFetcher::finished()
114 Q_D(QGeoTileFetcher);
116 QMutexLocker ml(&d->queueMutex_);
118 QGeoTiledMapReply *reply = qobject_cast<QGeoTiledMapReply *>(sender());
122 QGeoTileSpec spec = reply->tileSpec();
124 if (!d->invmap_.contains(spec)) {
125 reply->deleteLater();
129 d->invmap_.remove(spec);
131 handleReply(reply, spec);
134void QGeoTileFetcher::timerEvent(QTimerEvent *event)
136 Q_D(QGeoTileFetcher);
137 if (event->timerId() != d->timer_.timerId()) {
138 QObject::timerEvent(event);
142 QMutexLocker ml(&d->queueMutex_);
143 if (d->queue_.isEmpty() || !initialized()) {
152bool QGeoTileFetcher::initialized()
const
157bool QGeoTileFetcher::fetchingEnabled()
const
162void QGeoTileFetcher::handleReply(QGeoTiledMapReply *reply,
const QGeoTileSpec &spec)
164 Q_D(QGeoTileFetcher);
167 reply->deleteLater();
171 if (reply->error() == QGeoTiledMapReply::NoError) {
172 emit tileFinished(spec, reply->mapImageData(), reply->mapImageFormat());
174 emit tileError(spec, reply->errorString());
177 reply->deleteLater();
181