38void QGeoTiledMappingManagerEngine::setTileFetcher(QGeoTileFetcher *fetcher)
40 Q_D(QGeoTiledMappingManagerEngine);
43 d->fetcher_->deleteLater();
44 fetcher->setParent(
this);
45 d->fetcher_ = fetcher;
47 qRegisterMetaType<QGeoTileSpec>();
49 connect(d->fetcher_, &QGeoTileFetcher::tileFinished,
50 this, &QGeoTiledMappingManagerEngine::engineTileFinished,
51 Qt::QueuedConnection);
52 connect(d->fetcher_, &QGeoTileFetcher::tileError,
53 this, &QGeoTiledMappingManagerEngine::engineTileError,
54 Qt::QueuedConnection);
70void QGeoTiledMappingManagerEngine::releaseMap(QGeoTiledMap *map)
72 d_ptr->mapHash_.remove(map);
74 QHash<QGeoTileSpec, QSet<QGeoTiledMap *> > newTileHash = d_ptr->tileHash_;
75 typedef QHash<QGeoTileSpec, QSet<QGeoTiledMap *> >::const_iterator h_iter;
76 h_iter hi = d_ptr->tileHash_.constBegin();
77 h_iter hend = d_ptr->tileHash_.constEnd();
78 for (; hi != hend; ++hi) {
79 QSet<QGeoTiledMap *> maps = hi.value();
80 if (maps.contains(map)) {
83 newTileHash.remove(hi.key());
85 newTileHash.insert(hi.key(), maps);
88 d_ptr->tileHash_ = newTileHash;
91void QGeoTiledMappingManagerEngine::updateTileRequests(QGeoTiledMap *map,
92 const QSet<QGeoTileSpec> &tilesAdded,
93 const QSet<QGeoTileSpec> &tilesRemoved)
95 Q_D(QGeoTiledMappingManagerEngine);
97 typedef QSet<QGeoTileSpec>::const_iterator tile_iter;
101 QSet<QGeoTileSpec> oldTiles = d->mapHash_.value(map);
103 tile_iter rem = tilesRemoved.constBegin();
104 tile_iter remEnd = tilesRemoved.constEnd();
105 for (; rem != remEnd; ++rem) {
106 oldTiles.remove(*rem);
109 tile_iter add = tilesAdded.constBegin();
110 tile_iter addEnd = tilesAdded.constEnd();
111 for (; add != addEnd; ++add) {
112 oldTiles.insert(*add);
115 d->mapHash_.insert(map, oldTiles);
119 QSet<QGeoTileSpec> reqTiles;
120 QSet<QGeoTileSpec> cancelTiles;
122 rem = tilesRemoved.constBegin();
123 for (; rem != remEnd; ++rem) {
124 QSet<QGeoTiledMap *> mapSet = d->tileHash_.value(*rem);
126 if (mapSet.isEmpty()) {
127 cancelTiles.insert(*rem);
128 d->tileHash_.remove(*rem);
130 d->tileHash_.insert(*rem, mapSet);
134 add = tilesAdded.constBegin();
135 for (; add != addEnd; ++add) {
136 QSet<QGeoTiledMap *> mapSet = d->tileHash_.value(*add);
137 if (mapSet.isEmpty()) {
138 reqTiles.insert(*add);
141 d->tileHash_.insert(*add, mapSet);
144 cancelTiles -= reqTiles;
146 QMetaObject::invokeMethod(d->fetcher_,
"updateTileRequests",
147 Qt::QueuedConnection,
148 Q_ARG(QSet<QGeoTileSpec>, reqTiles),
149 Q_ARG(QSet<QGeoTileSpec>, cancelTiles));
152void QGeoTiledMappingManagerEngine::engineTileFinished(
const QGeoTileSpec &spec,
const QByteArray &bytes,
const QString &format)
154 Q_D(QGeoTiledMappingManagerEngine);
156 QSet<QGeoTiledMap *> maps = d->tileHash_.value(spec);
158 typedef QSet<QGeoTiledMap *>::const_iterator map_iter;
160 map_iter map = maps.constBegin();
161 map_iter mapEnd = maps.constEnd();
162 for (; map != mapEnd; ++map) {
163 QSet<QGeoTileSpec> tileSet = d->mapHash_.value(*map);
164 tileSet.remove(spec);
165 if (tileSet.isEmpty())
166 d->mapHash_.remove(*map);
168 d->mapHash_.insert(*map, tileSet);
171 d->tileHash_.remove(spec);
172 tileCache()->insert(spec, bytes, format, d->cacheHint_);
174 map = maps.constBegin();
175 mapEnd = maps.constEnd();
176 for (; map != mapEnd; ++map) {
177 (*map)->requestManager()->tileFetched(spec);
181void QGeoTiledMappingManagerEngine::engineTileError(
const QGeoTileSpec &spec,
const QString &errorString)
183 Q_D(QGeoTiledMappingManagerEngine);
185 QSet<QGeoTiledMap *> maps = d->tileHash_.value(spec);
186 typedef QSet<QGeoTiledMap *>::const_iterator map_iter;
187 map_iter map = maps.constBegin();
188 map_iter mapEnd = maps.constEnd();
189 for (; map != mapEnd; ++map) {
190 QSet<QGeoTileSpec> tileSet = d->mapHash_.value(*map);
192 tileSet.remove(spec);
193 if (tileSet.isEmpty())
194 d->mapHash_.remove(*map);
196 d->mapHash_.insert(*map, tileSet);
198 d->tileHash_.remove(spec);
200 for (map = maps.constBegin(); map != mapEnd; ++map) {
201 (*map)->requestManager()->tileError(spec, errorString);
204 emit tileError(spec, errorString);
213void QGeoTiledMappingManagerEngine::setTileVersion(
int version)
215 Q_D(QGeoTiledMappingManagerEngine);
216 if (d->m_tileVersion != version) {
217 d->m_tileVersion = version;
218 emit tileVersionChanged();
249void QGeoTiledMappingManagerEngine::setTileCache(QAbstractGeoTileCache *cache)
251 Q_D(QGeoTiledMappingManagerEngine);
252 Q_ASSERT_X(!d->tileCache_, Q_FUNC_INFO,
"This should be called only once");
253 cache->setParent(
this);
254 d->tileCache_.reset(cache);
255 d->tileCache_->init();
258QAbstractGeoTileCache *QGeoTiledMappingManagerEngine::tileCache()
260 Q_D(QGeoTiledMappingManagerEngine);
261 if (!d->tileCache_) {
262 QString cacheDirectory;
263 if (!managerName().isEmpty())
264 cacheDirectory = QAbstractGeoTileCache::baseLocationCacheDirectory() + managerName();
265 d->tileCache_.reset(
new QGeoFileTileCache(cacheDirectory));
266 d->tileCache_->init();
268 return d->tileCache_.get();