14QGeoFileTileCacheOsm::QGeoFileTileCacheOsm(
const QList<QGeoTileProviderOsm *> &providers,
15 const QString &offlineDirectory,
16 const QString &directory, QObject *parent)
17 : QGeoFileTileCache(directory, parent),
18 m_offlineDirectory(offlineDirectory),
20 m_providers(providers)
22 m_highDpi.resize(providers.size());
23 if (!offlineDirectory.isEmpty()) {
24 m_offlineDirectory = QDir(offlineDirectory);
25 if (m_offlineDirectory.exists())
28 for (
int i = 0; i < providers.size(); i++) {
29 providers[i]->setParent(
this);
30 m_highDpi[i] = providers[i]->isHighDpi();
31 connect(providers[i], &QGeoTileProviderOsm::resolutionFinished,
this, &QGeoFileTileCacheOsm::onProviderResolutionFinished);
32 connect(providers[i], &QGeoTileProviderOsm::resolutionError,
this, &QGeoFileTileCacheOsm::onProviderResolutionFinished);
81 if (directory_.isEmpty())
82 directory_ = baseLocationCacheDirectory();
83 QDir::root().mkpath(directory_);
87 for (
auto p: m_providers)
88 if (p->mapType().mapId() > max)
89 max = p->mapType().mapId();
91 m_maxMapIdTimestamps.resize(max+1);
96 formats << QLatin1String(
"*.*");
97 QStringList files = dir.entryList(formats, QDir::Files);
99 for (
const QString &tileFileName : files) {
100 QGeoTileSpec spec = filenameToTileSpec(tileFileName);
101 if (spec.zoom() == -1)
103 QFileInfo fi(dir.filePath(tileFileName));
104 if (fi.lastModified() > m_maxMapIdTimestamps[spec.mapId()])
105 m_maxMapIdTimestamps[spec.mapId()] = fi.lastModified();
109 QGeoFileTileCache::init();
111 for (QGeoTileProviderOsm * p: m_providers)
112 clearObsoleteTiles(p);
118 return QSharedPointer<QGeoTileTexture>();
120 int providerId = spec.mapId() - 1;
121 if (providerId < 0 || providerId >= m_providers.size())
122 return QSharedPointer<QGeoTileTexture>();
124 const QString fileName = tileSpecToFilename(spec, QStringLiteral(
"*"), providerId);
125 QStringList validTiles = m_offlineDirectory.entryList({fileName});
126 if (!validTiles.size())
127 return QSharedPointer<QGeoTileTexture>();
129 QFile file(m_offlineDirectory.absoluteFilePath(validTiles.first()));
130 if (!file.open(QIODevice::ReadOnly))
131 return QSharedPointer<QGeoTileTexture>();
132 QByteArray bytes = file.readAll();
136 if (!image.loadFromData(bytes)) {
137 handleError(spec, QLatin1String(
"Problem with tile image"));
138 return QSharedPointer<QGeoTileTexture>();
141 addToMemoryCache(spec, bytes, QString());
142 return addToTextureCache(spec, image);
167 formats << QLatin1String(
"*.*");
169 QDir dir(directory_);
170 QStringList files = dir.entryList(formats, QDir::Files);
172 for (
int i = 0; i < files.size(); ++i) {
173 QGeoTileSpec spec = filenameToTileSpec(files.at(i));
174 if (spec.zoom() == -1 || spec.mapId() != mapId)
176 QString filename = dir.filePath(files.at(i));
177 addToDiskCache(spec, filename);
193 QString filename = spec.plugin();
194 filename += QLatin1String(
"-");
195 filename += (m_providers[providerId]->isHighDpi()) ? QLatin1Char(
'h') : QLatin1Char(
'l');
196 filename += QLatin1String(
"-");
197 filename += QString::number(spec.mapId());
198 filename += QLatin1String(
"-");
199 filename += QString::number(spec.zoom());
200 filename += QLatin1String(
"-");
201 filename += QString::number(spec.x());
202 filename += QLatin1String(
"-");
203 filename += QString::number(spec.y());
206 if (spec.version() != -1) {
207 filename += QLatin1String(
"-");
208 filename += QString::number(spec.version());
211 filename += QLatin1String(
".");
218 QGeoTileSpec emptySpec;
220 QStringList parts = filename.split(
'.');
222 if (parts.length() != 2)
225 QString name = parts.at(0);
226 QStringList fields = name.split(
'-');
228 int length = fields.length();
229 if (length != 6 && length != 7)
235 for (
int i = 2; i < length; ++i) {
237 int value = fields.at(i).toInt(&ok);
240 numbers.append(value);
243 if (numbers.at(0) > m_providers.size())
246 bool highDpi = m_providers[numbers.at(0) - 1]->isHighDpi();
247 if (highDpi && fields.at(1) != QLatin1Char(
'h'))
249 else if (!highDpi && fields.at(1) != QLatin1Char(
'l'))
253 if (numbers.length() < 5)
256 return QGeoTileSpec(fields.at(0),
269 if (m_maxMapIdTimestamps[p->mapType().mapId()].isValid() &&
270 p->timestamp() > m_maxMapIdTimestamps[p->mapType().mapId()]) {
271 qInfo() <<
"provider for " << p->mapType().name() <<
" timestamp: " << p->timestamp()
272 <<
" -- data last modified: " << m_maxMapIdTimestamps[p->mapType().mapId()] <<
". Clearing.";
273 clearMapId(p->mapType().mapId());
274 m_maxMapIdTimestamps[p->mapType().mapId()] = p->timestamp();
277 connect(p, &QGeoTileProviderOsm::resolutionFinished,
278 this, &QGeoFileTileCacheOsm::onProviderResolutionFinished);
280 connect(p, &QGeoTileProviderOsm::resolutionError,
281 this, &QGeoFileTileCacheOsm::onProviderResolutionError);