4#include <QtCore/QLoggingCategory>
5#include <QtCore/QStandardPaths>
25 : QGeoFileTileCache(baseCacheDirectory(), parent)
27 qCDebug(QGeoFileTileCacheQGCLog) <<
this;
29 setCostStrategyDisk(QGeoFileTileCache::ByteSize);
30 setMaxDiskUsage(_getDefaultMaxDiskCache());
31 setCostStrategyMemory(QGeoFileTileCache::ByteSize);
32 setMaxMemoryUsage(_getMemLimit(parameters));
33 setCostStrategyTexture(QGeoFileTileCache::ByteSize);
34 setMinTextureUsage(_getDefaultMinTexture());
35 setExtraTextureUsage(_getDefaultExtraTexture() - minTextureUsage());
37 static std::once_flag cacheInit;
38 std::call_once(cacheInit, [
this]() {
42 directory_ = _getCachePath(parameters);
47 if (QGeoFileTileCacheQGCLog().isDebugEnabled()) {
51 qCDebug(QGeoFileTileCacheQGCLog) <<
this;
54uint32_t QGeoFileTileCacheQGC::_getMemLimit(
const QVariantMap ¶meters)
56 uint32_t memLimit = 0;
57 if (parameters.contains(QStringLiteral(
"mapping.cache.memory.size"))) {
59 memLimit = parameters.value(QStringLiteral(
"mapping.cache.memory.size")).toString().toUInt(&ok);
67 memLimit = _getMaxMemCacheSetting() * qPow(1024, 2);
70 memLimit = _getDefaultMaxMemLimit();
75 memLimit = qBound(
static_cast<uint32_t
>(qPow(1024, 2)), memLimit,
static_cast<uint32_t
>(qPow(1024, 3)));
79quint32 QGeoFileTileCacheQGC::_getMaxMemCacheSetting()
92 cacheTile(type, hash, image, format, set);
98 if (!appSettings->disableAllPersistence()->rawValue().toBool()) {
114QString QGeoFileTileCacheQGC::_getCachePath(
const QVariantMap ¶meters)
117 if (parameters.contains(QStringLiteral(
"mapping.cache.directory"))) {
118 cacheDir = parameters.value(QStringLiteral(
"mapping.cache.directory")).toString();
120 cacheDir = _cachePath + QLatin1String(
"/providers");
122 qCWarning(QGeoFileTileCacheQGCLog) <<
"Could not create mapping disk cache directory:" << cacheDir;
123 cacheDir = QDir::homePath() + QStringLiteral(
"/.qgcmapscache/");
128 qCWarning(QGeoFileTileCacheQGCLog) <<
"Could not create mapping disk cache directory:" << cacheDir;
135bool QGeoFileTileCacheQGC::_wipeDirectory(
const QString &dirPath)
139 const QDir dir(dirPath);
140 if (dir.exists(dirPath)) {
141 _cacheWasReset =
true;
143 const QFileInfoList fileList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst);
144 for (
const QFileInfo &info : fileList) {
146 result = _wipeDirectory(info.absoluteFilePath());
148 result = QFile::remove(info.absoluteFilePath());
155 result = dir.rmdir(dirPath);
161void QGeoFileTileCacheQGC::_wipeOldCaches()
163 const QStringList oldCaches = {
"/QGCMapCache55",
"/QGCMapCache100",
"/QGCMapCache300"};
164 for (
const QString &cache : oldCaches) {
166 #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
167 oldCacheDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
169 oldCacheDir = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation);
171 oldCacheDir += cache;
172 _wipeDirectory(oldCacheDir);
176void QGeoFileTileCacheQGC::_initCache()
181#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
182 QString cacheDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
183 cacheDir += QStringLiteral(
"/QGCMapCache");
185 QString cacheDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
186 cacheDir += QStringLiteral(
"/QGCMapCache");
189 qCWarning(QGeoFileTileCacheQGCLog) <<
"Could not create mapping disk cache directory:" << cacheDir;
191 cacheDir = QDir::homePath() + QStringLiteral(
"/.qgcmapscache/");
193 qCWarning(QGeoFileTileCacheQGCLog) <<
"Could not create mapping disk cache directory:" << cacheDir;
198 _cachePath = cacheDir;
199 if (!_cachePath.isEmpty()) {
200 _databaseFilePath = QString(_cachePath + QStringLiteral(
"/qgcMapCache.db"));
202 qCDebug(QGeoFileTileCacheQGCLog) <<
"Map Cache in:" << _databaseFilePath;
204 qCCritical(QGeoFileTileCacheQGCLog) <<
"Could not find suitable map cache directory.";
207 if (_cacheWasReset) {
209 "The Offline Map Cache database has been upgraded. "
210 "Your old map cache sets have been reset."));
#define QGC_LOGGING_CATEGORY(name, categoryStr)
QGCMapEngine * getQGCMapEngine()
static QGCFetchTileTask * createFetchTileTask(const QString &type, int x, int y, int z)
static void cacheTile(const QString &type, int x, int y, int z, const QByteArray &image, const QString &format, qulonglong set=UINT64_MAX)
static quint32 getMaxDiskCacheSetting()
MapsSettings * mapsSettings() const
static SettingsManager * instance()
AppSettings * appSettings() const
static QString getTileHash(QStringView type, int x, int y, int z)
bool ensureDirectoryExists(const QString &path)
void showAppMessage(const QString &message, const QString &title)
Modal application message. Queued if the UI isn't ready yet.