4#include <QtCore/QLoggingCategory>
5#include <QtCore/QStandardPaths>
24 : QGeoFileTileCache(baseCacheDirectory(), parent)
26 qCDebug(QGeoFileTileCacheQGCLog) <<
this;
28 setCostStrategyDisk(QGeoFileTileCache::ByteSize);
29 setMaxDiskUsage(_getDefaultMaxDiskCache());
30 setCostStrategyMemory(QGeoFileTileCache::ByteSize);
31 setMaxMemoryUsage(_getMemLimit(parameters));
32 setCostStrategyTexture(QGeoFileTileCache::ByteSize);
33 setMinTextureUsage(_getDefaultMinTexture());
34 setExtraTextureUsage(_getDefaultExtraTexture() - minTextureUsage());
36 static std::once_flag cacheInit;
37 std::call_once(cacheInit, [
this]() {
41 directory_ = _getCachePath(parameters);
46 if (QGeoFileTileCacheQGCLog().isDebugEnabled()) {
50 qCDebug(QGeoFileTileCacheQGCLog) <<
this;
53uint32_t QGeoFileTileCacheQGC::_getMemLimit(
const QVariantMap ¶meters)
55 uint32_t memLimit = 0;
56 if (parameters.contains(QStringLiteral(
"mapping.cache.memory.size"))) {
58 memLimit = parameters.value(QStringLiteral(
"mapping.cache.memory.size")).toString().toUInt(&ok);
66 memLimit = _getMaxMemCacheSetting() * qPow(1024, 2);
69 memLimit = _getDefaultMaxMemLimit();
74 memLimit = qBound(
static_cast<uint32_t
>(qPow(1024, 2)), memLimit,
static_cast<uint32_t
>(qPow(1024, 3)));
78quint32 QGeoFileTileCacheQGC::_getMaxMemCacheSetting()
80 return SettingsManager::instance()->mapsSettings()->
maxCacheMemorySize()->rawValue().toUInt();
85 return SettingsManager::instance()->mapsSettings()->
maxCacheDiskSize()->rawValue().toUInt();
91 cacheTile(type, hash, image, format, set);
96 AppSettings *appSettings = SettingsManager::instance()->appSettings();
113QString QGeoFileTileCacheQGC::_getCachePath(
const QVariantMap ¶meters)
116 if (parameters.contains(QStringLiteral(
"mapping.cache.directory"))) {
117 cacheDir = parameters.value(QStringLiteral(
"mapping.cache.directory")).toString();
119 cacheDir = _cachePath + QLatin1String(
"/providers");
121 qCWarning(QGeoFileTileCacheQGCLog) <<
"Could not create mapping disk cache directory:" << cacheDir;
122 cacheDir = QDir::homePath() + QStringLiteral(
"/.qgcmapscache/");
127 qCWarning(QGeoFileTileCacheQGCLog) <<
"Could not create mapping disk cache directory:" << cacheDir;
134bool QGeoFileTileCacheQGC::_wipeDirectory(
const QString &dirPath)
138 const QDir dir(dirPath);
139 if (dir.exists(dirPath)) {
140 _cacheWasReset =
true;
142 const QFileInfoList fileList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst);
143 for (
const QFileInfo &info : fileList) {
145 result = _wipeDirectory(info.absoluteFilePath());
147 result = QFile::remove(info.absoluteFilePath());
154 result = dir.rmdir(dirPath);
160void QGeoFileTileCacheQGC::_wipeOldCaches()
162 const QStringList oldCaches = {
"/QGCMapCache55",
"/QGCMapCache100",
"/QGCMapCache300"};
163 for (
const QString &cache : oldCaches) {
165 #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
166 oldCacheDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
168 oldCacheDir = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation);
170 oldCacheDir += cache;
171 _wipeDirectory(oldCacheDir);
175void QGeoFileTileCacheQGC::_initCache()
180#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
181 QString cacheDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
182 cacheDir += QStringLiteral(
"/QGCMapCache");
184 QString cacheDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
185 cacheDir += QStringLiteral(
"/QGCMapCache");
188 qCWarning(QGeoFileTileCacheQGCLog) <<
"Could not create mapping disk cache directory:" << cacheDir;
190 cacheDir = QDir::homePath() + QStringLiteral(
"/.qgcmapscache/");
192 qCWarning(QGeoFileTileCacheQGCLog) <<
"Could not create mapping disk cache directory:" << cacheDir;
197 _cachePath = cacheDir;
198 if (!_cachePath.isEmpty()) {
199 _databaseFilePath = QString(_cachePath + QStringLiteral(
"/qgcMapCache.db"));
201 qCDebug(QGeoFileTileCacheQGCLog) <<
"Map Cache in:" << _databaseFilePath;
203 qCCritical(QGeoFileTileCacheQGCLog) <<
"Could not find suitable map cache directory.";
206 if (_cacheWasReset) {
207 qgcApp()->showAppMessage(tr(
208 "The Offline Map Cache database has been upgraded. "
209 "Your old map cache sets have been reset."));
#define QGC_LOGGING_CATEGORY(name, categoryStr)
QGCMapEngine * getQGCMapEngine()
Fact *disableAllPersistence READ disableAllPersistence CONSTANT Fact * disableAllPersistence()
Fact *maxCacheDiskSize READ maxCacheDiskSize CONSTANT Fact * maxCacheDiskSize()
Fact *maxCacheMemorySize READ maxCacheMemorySize CONSTANT Fact * maxCacheMemorySize()
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()
static QString getTileHash(QStringView type, int x, int y, int z)
bool ensureDirectoryExists(const QString &path)