81 QSet<QGeoTileSpec> cancelTiles = m_requested - tiles;
82 QSet<QGeoTileSpec> requestTiles = tiles - m_requested;
83 QSet<QGeoTileSpec> cached;
87 typedef QSet<QGeoTileSpec>::const_iterator iter;
89 QMap<QGeoTileSpec, QSharedPointer<QGeoTileTexture> > cachedTex;
92 if (!m_engine.isNull()) {
93 iter i = requestTiles.constBegin();
94 iter end = requestTiles.constEnd();
95 for (; i != end; ++i) {
96 QGeoTileSpec tile = *i;
97 QSharedPointer<QGeoTileTexture> tex = m_engine->getTileTexture(tile);
99 if (!tex->image.isNull())
100 cachedTex.insert(tile, tex);
104 QGeoTileSpec spec = tile;
105 const int endRange = qMax(0, tile.zoom() - 4);
106 for (
int z = tile.zoom() - 1; z >= endRange; z--) {
107 int denominator = 1 << (tile.zoom() - z);
109 spec.setX(tile.x() / denominator);
110 spec.setY(tile.y() / denominator);
111 QSharedPointer<QGeoTileTexture> t = m_engine->getTileTexture(spec);
112 if (t && !t->image.isNull()) {
113 cachedTex.insert(tile, t);
121 requestTiles -= cached;
123 m_requested -= cancelTiles;
124 m_requested += requestTiles;
128 if (!requestTiles.isEmpty() || !cancelTiles.isEmpty()) {
129 if (!m_engine.isNull()) {
131 m_engine->updateTileRequests(m_map, requestTiles, cancelTiles);
135 iter i = cancelTiles.constBegin();
136 iter end = cancelTiles.constEnd();
137 for (; i != end; ++i) {
138 m_retries.remove(*i);
139 m_futures.remove(*i);
171RetryFuture::RetryFuture(
const QGeoTileSpec &tile, QGeoTiledMap *map, QGeoTiledMappingManagerEngine* engine, QObject *parent)
172 : QObject(parent), m_tile(tile), m_map(map), m_engine(engine)
177 QSet<QGeoTileSpec> requestTiles;
178 QSet<QGeoTileSpec> cancelTiles;
179 requestTiles.insert(m_tile);
180 if (!m_engine.isNull())
181 m_engine->updateTileRequests(m_map, requestTiles, cancelTiles);
186 if (m_requested.contains(tile)) {
187 int count = m_retries.value(tile, 0);
188 m_retries.insert(tile, count + 1);
191 qWarning(
"QGeoTileRequestManager: Failed to fetch tile (%d,%d,%d) 5 times, giving up. "
192 "Last error message was: '%s'",
193 tile.x(), tile.y(), tile.zoom(), qPrintable(errorString));
194 m_requested.remove(tile);
195 m_retries.remove(tile);
196 m_futures.remove(tile);
200 int delay = (1 << count) * 500;
202 QSharedPointer<RetryFuture> future(
new RetryFuture(tile,m_map,m_engine));
203 m_futures.insert(tile, future);
205 QTimer::singleShot(delay, future.data(), &RetryFuture::retry);