82 QSet<QGeoTileSpec> cancelTiles = m_requested - tiles;
83 QSet<QGeoTileSpec> requestTiles = tiles - m_requested;
84 QSet<QGeoTileSpec> cached;
88 typedef QSet<QGeoTileSpec>::const_iterator iter;
90 QMap<QGeoTileSpec, QSharedPointer<QGeoTileTexture> > cachedTex;
93 if (!m_engine.isNull()) {
94 iter i = requestTiles.constBegin();
95 iter end = requestTiles.constEnd();
96 for (; i != end; ++i) {
97 QGeoTileSpec tile = *i;
98 QSharedPointer<QGeoTileTexture> tex = m_engine->getTileTexture(tile);
100 if (!tex->image.isNull())
101 cachedTex.insert(tile, tex);
105 QGeoTileSpec spec = tile;
106 const int endRange = qMax(0, tile.zoom() - 4);
107 for (
int z = tile.zoom() - 1; z >= endRange; z--) {
108 int denominator = 1 << (tile.zoom() - z);
110 spec.setX(tile.x() / denominator);
111 spec.setY(tile.y() / denominator);
112 QSharedPointer<QGeoTileTexture> t = m_engine->getTileTexture(spec);
113 if (t && !t->image.isNull()) {
114 cachedTex.insert(tile, t);
122 requestTiles -= cached;
124 m_requested -= cancelTiles;
125 m_requested += requestTiles;
129 if (!requestTiles.isEmpty() || !cancelTiles.isEmpty()) {
130 if (!m_engine.isNull()) {
132 m_engine->updateTileRequests(m_map, requestTiles, cancelTiles);
136 iter i = cancelTiles.constBegin();
137 iter end = cancelTiles.constEnd();
138 for (; i != end; ++i) {
139 m_retries.remove(*i);
140 m_futures.remove(*i);
172RetryFuture::RetryFuture(
const QGeoTileSpec &tile, QGeoTiledMap *map, QGeoTiledMappingManagerEngine* engine, QObject *parent)
173 : QObject(parent), m_tile(tile), m_map(map), m_engine(engine)
178 QSet<QGeoTileSpec> requestTiles;
179 QSet<QGeoTileSpec> cancelTiles;
180 requestTiles.insert(m_tile);
181 if (!m_engine.isNull())
182 m_engine->updateTileRequests(m_map, requestTiles, cancelTiles);
187 if (m_requested.contains(tile)) {
188 int count = m_retries.value(tile, 0);
189 m_retries.insert(tile, count + 1);
192 qWarning(
"QGeoTileRequestManager: Failed to fetch tile (%d,%d,%d) 5 times, giving up. "
193 "Last error message was: '%s'",
194 tile.x(), tile.y(), tile.zoom(), qPrintable(errorString));
195 m_requested.remove(tile);
196 m_retries.remove(tile);
197 m_futures.remove(tile);
201 int delay = (1 << count) * 500;
203 QSharedPointer<RetryFuture> future(
new RetryFuture(tile,m_map,m_engine));
204 m_futures.insert(tile, future);
206 QTimer::singleShot(delay, future.data(), &RetryFuture::retry);