44void QGeoTiledMappingManagerEngine::setTileFetcher(QGeoTileFetcher *fetcher)
46 Q_D(QGeoTiledMappingManagerEngine);
49 d->fetcher_->deleteLater();
50 fetcher->setParent(
this);
51 d->fetcher_ = fetcher;
53 qRegisterMetaType<QGeoTileSpec>();
55 connect(d->fetcher_, &QGeoTileFetcher::tileFinished,
56 this, &QGeoTiledMappingManagerEngine::engineTileFinished,
57 Qt::QueuedConnection);
58 connect(d->fetcher_, &QGeoTileFetcher::tileError,
59 this, &QGeoTiledMappingManagerEngine::engineTileError,
60 Qt::QueuedConnection);
76void QGeoTiledMappingManagerEngine::releaseMap(QGeoTiledMap *map)
78 d_ptr->mapHash_.remove(map);
80 QHash<QGeoTileSpec, QSet<QGeoTiledMap *> > newTileHash = d_ptr->tileHash_;
81 typedef QHash<QGeoTileSpec, QSet<QGeoTiledMap *> >::const_iterator h_iter;
82 h_iter hi = d_ptr->tileHash_.constBegin();
83 h_iter hend = d_ptr->tileHash_.constEnd();
84 for (; hi != hend; ++hi) {
85 QSet<QGeoTiledMap *> maps = hi.value();
86 if (maps.contains(map)) {
89 newTileHash.remove(hi.key());
91 newTileHash.insert(hi.key(), maps);
94 d_ptr->tileHash_ = newTileHash;
97void QGeoTiledMappingManagerEngine::updateTileRequests(QGeoTiledMap *map,
98 const QSet<QGeoTileSpec> &tilesAdded,
99 const QSet<QGeoTileSpec> &tilesRemoved)
101 Q_D(QGeoTiledMappingManagerEngine);
103 typedef QSet<QGeoTileSpec>::const_iterator tile_iter;
107 QSet<QGeoTileSpec> oldTiles = d->mapHash_.value(map);
109 tile_iter rem = tilesRemoved.constBegin();
110 tile_iter remEnd = tilesRemoved.constEnd();
111 for (; rem != remEnd; ++rem) {
112 oldTiles.remove(*rem);
115 tile_iter add = tilesAdded.constBegin();
116 tile_iter addEnd = tilesAdded.constEnd();
117 for (; add != addEnd; ++add) {
118 oldTiles.insert(*add);
121 d->mapHash_.insert(map, oldTiles);
125 QSet<QGeoTileSpec> reqTiles;
126 QSet<QGeoTileSpec> cancelTiles;
128 rem = tilesRemoved.constBegin();
129 for (; rem != remEnd; ++rem) {
130 QSet<QGeoTiledMap *> mapSet = d->tileHash_.value(*rem);
132 if (mapSet.isEmpty()) {
133 cancelTiles.insert(*rem);
134 d->tileHash_.remove(*rem);
136 d->tileHash_.insert(*rem, mapSet);
140 add = tilesAdded.constBegin();
141 for (; add != addEnd; ++add) {
142 QSet<QGeoTiledMap *> mapSet = d->tileHash_.value(*add);
143 if (mapSet.isEmpty()) {
144 reqTiles.insert(*add);
147 d->tileHash_.insert(*add, mapSet);
150 cancelTiles -= reqTiles;
152 QMetaObject::invokeMethod(d->fetcher_,
"updateTileRequests",
153 Qt::QueuedConnection,
154 Q_ARG(QSet<QGeoTileSpec>, reqTiles),
155 Q_ARG(QSet<QGeoTileSpec>, cancelTiles));
158void QGeoTiledMappingManagerEngine::engineTileFinished(
const QGeoTileSpec &spec,
const QByteArray &bytes,
const QString &format)
160 Q_D(QGeoTiledMappingManagerEngine);
162 QSet<QGeoTiledMap *> maps = d->tileHash_.value(spec);
164 typedef QSet<QGeoTiledMap *>::const_iterator map_iter;
166 map_iter map = maps.constBegin();
167 map_iter mapEnd = maps.constEnd();
168 for (; map != mapEnd; ++map) {
169 QSet<QGeoTileSpec> tileSet = d->mapHash_.value(*map);
170 tileSet.remove(spec);
171 if (tileSet.isEmpty())
172 d->mapHash_.remove(*map);
174 d->mapHash_.insert(*map, tileSet);
177 d->tileHash_.remove(spec);
178 tileCache()->insert(spec, bytes, format, d->cacheHint_);
180 map = maps.constBegin();
181 mapEnd = maps.constEnd();
182 for (; map != mapEnd; ++map) {
183 (*map)->requestManager()->tileFetched(spec);
187void QGeoTiledMappingManagerEngine::engineTileError(
const QGeoTileSpec &spec,
const QString &errorString)
189 Q_D(QGeoTiledMappingManagerEngine);
191 QSet<QGeoTiledMap *> maps = d->tileHash_.value(spec);
192 typedef QSet<QGeoTiledMap *>::const_iterator map_iter;
193 map_iter map = maps.constBegin();
194 map_iter mapEnd = maps.constEnd();
195 for (; map != mapEnd; ++map) {
196 QSet<QGeoTileSpec> tileSet = d->mapHash_.value(*map);
198 tileSet.remove(spec);
199 if (tileSet.isEmpty())
200 d->mapHash_.remove(*map);
202 d->mapHash_.insert(*map, tileSet);
204 d->tileHash_.remove(spec);
206 for (map = maps.constBegin(); map != mapEnd; ++map) {
207 (*map)->requestManager()->tileError(spec, errorString);
210 emit tileError(spec, errorString);
219void QGeoTiledMappingManagerEngine::setTileVersion(
int version)
221 Q_D(QGeoTiledMappingManagerEngine);
222 if (d->m_tileVersion != version) {
223 d->m_tileVersion = version;
224 emit tileVersionChanged();
256void QGeoTiledMappingManagerEngine::setTileCache(QAbstractGeoTileCache *cache)
258 Q_D(QGeoTiledMappingManagerEngine);
259 Q_ASSERT_X(!d->tileCache_, Q_FUNC_INFO,
"This should be called only once");
260 cache->setParent(
this);
261 d->tileCache_.reset(cache);
262 d->tileCache_->init();
265QAbstractGeoTileCache *QGeoTiledMappingManagerEngine::tileCache()
267 Q_D(QGeoTiledMappingManagerEngine);
268 if (!d->tileCache_) {
269 QString cacheDirectory;
270 if (!managerName().isEmpty())
271 cacheDirectory = QAbstractGeoTileCache::baseLocationCacheDirectory() + managerName();
272 d->tileCache_.reset(
new QGeoFileTileCache(cacheDirectory));
273 d->tileCache_->init();
275 return d->tileCache_.get();