void QGeoTileFetcher::requestNextTile() { Q_D(QGeoTileFetcher); QMutexLocker ml(&d->queueMutex_); if (d->stopped_) return; if (d->queue_.isEmpty()) { d->timer_->stop(); return; } QGeoTileSpec ts = d->queue_.takeFirst(); QGeoTiledMapReply *reply = getTileImage(ts); if (reply->isFinished()) { handleReply(reply, ts); } else { connect(reply, SIGNAL(finished()), this, SLOT(finished()), Qt::QueuedConnection); d->invmap_.insert(ts, reply); } if (d->queue_.isEmpty()) d->timer_->stop(); }
void QGeoTileFetcher::cancelTileRequests(const QSet<QGeoTileSpec> &tiles) { Q_D(QGeoTileFetcher); typedef QSet<QGeoTileSpec>::const_iterator tile_iter; tile_iter tile = tiles.constBegin(); tile_iter end = tiles.constEnd(); for (; tile != end; ++tile) { QGeoTiledMapReply *reply = d->invmap_.value(*tile, 0); if (reply) { d->invmap_.remove(*tile); reply->abort(); if (reply->isFinished()) reply->deleteLater(); } d->queue_.removeAll(*tile); } }
void QGeoTileFetcher::finished() { Q_D(QGeoTileFetcher); QMutexLocker ml(&d->queueMutex_); QGeoTiledMapReply *reply = qobject_cast<QGeoTiledMapReply *>(sender()); if (!reply) return; QGeoTileSpec spec = reply->tileSpec(); if (!d->invmap_.contains(spec)) { reply->deleteLater(); return; } d->invmap_.remove(spec); handleReply(reply, spec); }