Skip to content

Commit

Permalink
QtLocationPlugin: Minor Miscellaneous Improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
HTRamsey committed Sep 20, 2024
1 parent 95ace95 commit d2dd96d
Show file tree
Hide file tree
Showing 14 changed files with 204 additions and 178 deletions.
96 changes: 9 additions & 87 deletions src/QtLocationPlugin/QGCMapEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
* @author Gus Grubba <[email protected]>
*
*/

#include "QGCMapEngine.h"
#include "QGCCachedTileSet.h"
#include "QGCTileCacheWorker.h"
Expand All @@ -23,31 +24,21 @@
#include "QGCTileSet.h"
#include "QGCTile.h"
#include "QGCCacheTile.h"
#include "QGCApplication.h"
#include <QGCLoggingCategory.h>

#include <QtCore/qapplicationstatic.h>
#include <QtCore/QStandardPaths>
#include <QtCore/QDir>

#define CACHE_PATH_VERSION "300"

QGC_LOGGING_CATEGORY(QGCMapEngineLog, "qgc.qtlocationplugin.qgcmapengine")

Q_DECLARE_METATYPE(QList<QGCTile*>)

Q_APPLICATION_STATIC(QGCMapEngine, s_mapEngine);
Q_APPLICATION_STATIC(QGCMapEngine, _mapEngine);

QGCMapEngine* getQGCMapEngine()
QGCMapEngine *getQGCMapEngine()
{
return QGCMapEngine::instance();
}

QGCMapEngine* QGCMapEngine::instance()
{
return s_mapEngine();
}

QGCMapEngine::QGCMapEngine(QObject *parent)
: QObject(parent)
, m_worker(new QGCCacheWorker(this))
Expand All @@ -72,93 +63,24 @@ QGCMapEngine::~QGCMapEngine()
// qCDebug(QGCMapEngineLog) << Q_FUNC_INFO << this;
}

void QGCMapEngine::init()
QGCMapEngine *QGCMapEngine::instance()
{
_wipeOldCaches();

// QString cacheDir = QAbstractGeoTileCache::baseCacheDirectory()
#ifdef __mobile__
QString cacheDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
#else
QString cacheDir = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation);
#endif
cacheDir += QStringLiteral("/QGCMapCache" CACHE_PATH_VERSION);
if (!QDir::root().mkpath(cacheDir)) {
qCWarning(QGCMapEngineLog) << "Could not create mapping disk cache directory:" << cacheDir;

cacheDir = QDir::homePath() + QStringLiteral("/.qgcmapscache/");
if (!QDir::root().mkpath(cacheDir)) {
qCWarning(QGCMapEngineLog) << "Could not create mapping disk cache directory:" << cacheDir;
cacheDir.clear();
}
}

m_cachePath = cacheDir;
if (!m_cachePath.isEmpty()) {
const QString databaseFilePath(m_cachePath + "/" + QGeoFileTileCacheQGC::getCacheFilename());
m_worker->setDatabaseFile(databaseFilePath);
return _mapEngine();
}

qCDebug(QGCMapEngineLog) << "Map Cache in:" << databaseFilePath;
} else {
qCCritical(QGCMapEngineLog) << "Could not find suitable map cache directory.";
}
void QGCMapEngine::init()
{
m_worker->setDatabaseFile(QGeoFileTileCacheQGC::getDatabaseFilePath());

QGCMapTask* const task = new QGCMapTask(QGCMapTask::taskInit);
(void) addTask(task);

if (m_cacheWasReset) {
qgcApp()->showAppMessage(tr(
"The Offline Map Cache database has been upgraded. "
"Your old map cache sets have been reset."));
}
}

bool QGCMapEngine::addTask(QGCMapTask *task)
{
return m_worker->enqueueTask(task);
}

bool QGCMapEngine::_wipeDirectory(const QString &dirPath)
{
bool result = true;

const QDir dir(dirPath);
if (dir.exists(dirPath)) {
m_cacheWasReset = true;

const QFileInfoList fileList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst);
for (const QFileInfo &info : fileList) {
if (info.isDir()) {
result = _wipeDirectory(info.absoluteFilePath());
} else {
result = QFile::remove(info.absoluteFilePath());
}

if (!result) {
return result;
}
}
result = dir.rmdir(dirPath);
}

return result;
}

void QGCMapEngine::_wipeOldCaches()
{
const QStringList oldCaches = {"/QGCMapCache55", "/QGCMapCache100"};
for (const QString &cache : oldCaches) {
QString oldCacheDir;
#ifdef __mobile__
oldCacheDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
#else
oldCacheDir = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation);
#endif
oldCacheDir += cache;
_wipeDirectory(oldCacheDir);
}
}

void QGCMapEngine::_updateTotals(quint32 totaltiles, quint64 totalsize, quint32 defaulttiles, quint64 defaultsize)
{
emit updateTotals(totaltiles, totalsize, defaulttiles, defaultsize);
Expand Down
12 changes: 3 additions & 9 deletions src/QtLocationPlugin/QGCMapEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,11 @@ class QGCMapEngine : public QObject
QGCMapEngine(QObject *parent = nullptr);
~QGCMapEngine();

/// Must be init after fileTileCache
void init();
bool addTask(QGCMapTask *task);

QString getCachePath() const { return m_cachePath; }

static QGCMapEngine* instance();
static QGCMapEngine *instance();

signals:
void updateTotals(quint32 totaltiles, quint64 totalsize, quint32 defaulttiles, quint64 defaultsize);
Expand All @@ -50,13 +49,8 @@ private slots:
void _pruned() { m_prunning = false; }

private:
bool _wipeDirectory(const QString &dirPath);
void _wipeOldCaches();

QGCCacheWorker *m_worker = nullptr;
bool m_prunning = false;
bool m_cacheWasReset = false;
QString m_cachePath;
};

QGCMapEngine* getQGCMapEngine();
extern QGCMapEngine *getQGCMapEngine();
143 changes: 117 additions & 26 deletions src/QtLocationPlugin/QGeoFileTileCacheQGC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,12 @@

QGC_LOGGING_CATEGORY(QGeoFileTileCacheQGCLog, "qgc.qtlocationplugin.qgeofiletilecacheqgc")

QString QGeoFileTileCacheQGC::_databaseFilePath;
QString QGeoFileTileCacheQGC::_cachePath;
bool QGeoFileTileCacheQGC::_cacheWasReset = false;

QGeoFileTileCacheQGC::QGeoFileTileCacheQGC(const QVariantMap &parameters, QObject *parent)
: QGeoFileTileCache(_getCachePath(parameters), parent)
: QGeoFileTileCache(baseCacheDirectory(), parent)
{
// qCDebug(QGeoFileTileCacheQGCLog) << Q_FUNC_INFO << this;

Expand All @@ -26,40 +30,24 @@ QGeoFileTileCacheQGC::QGeoFileTileCacheQGC(const QVariantMap &parameters, QObjec
setCostStrategyTexture(QGeoFileTileCache::ByteSize);
setMinTextureUsage(_getDefaultMinTexture());
setExtraTextureUsage(_getDefaultExtraTexture() - minTextureUsage());

static std::once_flag cacheInit;
std::call_once(cacheInit, [this]() {
_initCache();
});

directory_ = _getCachePath(parameters);
}

QGeoFileTileCacheQGC::~QGeoFileTileCacheQGC()
{
#ifdef QT_DEBUG
// printStats();
#endif

// qCDebug(QGeoFileTileCacheQGCLog) << Q_FUNC_INFO << this;
}

QString QGeoFileTileCacheQGC::_getCachePath(const QVariantMap &parameters)
{
QString cacheDir;
if (parameters.contains(QStringLiteral("mapping.cache.directory"))) {
cacheDir = parameters.value(QStringLiteral("mapping.cache.directory")).toString();
} else {
cacheDir = getQGCMapEngine()->getCachePath() + QLatin1String("/providers");
if (!QFileInfo::exists(cacheDir)) {
if (!QDir::root().mkpath(cacheDir)) {
qCWarning(QGeoFileTileCacheQGCLog) << "Could not create mapping disk cache directory:" << cacheDir;
cacheDir = QDir::homePath() + QStringLiteral("/.qgcmapscache/");
}
}
}

if (!QFileInfo::exists(cacheDir)) {
if (!QDir::root().mkpath(cacheDir)) {
qCWarning(QGeoFileTileCacheQGCLog) << "Could not create mapping disk cache directory:" << cacheDir;
cacheDir.clear();
}
}

return cacheDir;
}

uint32_t QGeoFileTileCacheQGC::_getMemLimit(const QVariantMap &parameters)
{
uint32_t memLimit = 0;
Expand Down Expand Up @@ -122,3 +110,106 @@ QGCFetchTileTask* QGeoFileTileCacheQGC::createFetchTileTask(const QString &type,
QGCFetchTileTask* const task = new QGCFetchTileTask(hash);
return task;
}

QString QGeoFileTileCacheQGC::_getCachePath(const QVariantMap &parameters)
{
QString cacheDir;
if (parameters.contains(QStringLiteral("mapping.cache.directory"))) {
cacheDir = parameters.value(QStringLiteral("mapping.cache.directory")).toString();
} else {
cacheDir = _cachePath + QLatin1String("/providers");
if (!QFileInfo::exists(cacheDir)) {
if (!QDir::root().mkpath(cacheDir)) {
qCWarning(QGeoFileTileCacheQGCLog) << "Could not create mapping disk cache directory:" << cacheDir;
cacheDir = QDir::homePath() + QStringLiteral("/.qgcmapscache/");
}
}
}

if (!QFileInfo::exists(cacheDir)) {
if (!QDir::root().mkpath(cacheDir)) {
qCWarning(QGeoFileTileCacheQGCLog) << "Could not create mapping disk cache directory:" << cacheDir;
cacheDir.clear();
}
}

return cacheDir;
}

bool QGeoFileTileCacheQGC::_wipeDirectory(const QString &dirPath)
{
bool result = true;

const QDir dir(dirPath);
if (dir.exists(dirPath)) {
_cacheWasReset = true;

const QFileInfoList fileList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst);
for (const QFileInfo &info : fileList) {
if (info.isDir()) {
result = _wipeDirectory(info.absoluteFilePath());
} else {
result = QFile::remove(info.absoluteFilePath());
}

if (!result) {
return result;
}
}
result = dir.rmdir(dirPath);
}

return result;
}

void QGeoFileTileCacheQGC::_wipeOldCaches()
{
const QStringList oldCaches = {"/QGCMapCache55", "/QGCMapCache100"};
for (const QString &cache : oldCaches) {
QString oldCacheDir;
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
oldCacheDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
#else
oldCacheDir = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation);
#endif
oldCacheDir += cache;
_wipeDirectory(oldCacheDir);
}
}

void QGeoFileTileCacheQGC::_initCache()
{
_wipeOldCaches();

// QString cacheDir = QAbstractGeoTileCache::baseCacheDirectory()
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
QString cacheDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
#else
QString cacheDir = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation);
#endif
cacheDir += QStringLiteral("/QGCMapCache") + QString(kCachePathVersion);
if (!QDir::root().mkpath(cacheDir)) {
qCWarning(QGeoFileTileCacheQGCLog) << "Could not create mapping disk cache directory:" << cacheDir;

cacheDir = QDir::homePath() + QStringLiteral("/.qgcmapscache/");
if (!QDir::root().mkpath(cacheDir)) {
qCWarning(QGeoFileTileCacheQGCLog) << "Could not create mapping disk cache directory:" << cacheDir;
cacheDir.clear();
}
}

_cachePath = cacheDir;
if (!_cachePath.isEmpty()) {
_databaseFilePath = QString(_cachePath + QStringLiteral("/qgcMapCache.db"));

qCDebug(QGeoFileTileCacheQGCLog) << "Map Cache in:" << _databaseFilePath;
} else {
qCCritical(QGeoFileTileCacheQGCLog) << "Could not find suitable map cache directory.";
}

if (_cacheWasReset) {
qgcApp()->showAppMessage(tr(
"The Offline Map Cache database has been upgraded. "
"Your old map cache sets have been reset."));
}
}
17 changes: 14 additions & 3 deletions src/QtLocationPlugin/QGeoFileTileCacheQGC.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,31 @@ class QGeoFileTileCacheQGC : public QGeoFileTileCache
static quint32 getMaxDiskCacheSetting();
static void cacheTile(const QString &type, int x, int y, int z, const QByteArray &image, const QString &format, qulonglong set = UINT64_MAX);
static void cacheTile(const QString &type, const QString &hash, const QByteArray &image, const QString &format, qulonglong set = UINT64_MAX);
static QGCFetchTileTask* createFetchTileTask (const QString &type, int x, int y, int z);
static QString getCacheFilename() { return QStringLiteral("qgcMapCache.db"); }
static QGCFetchTileTask *createFetchTileTask(const QString &type, int x, int y, int z);
static QString getDatabaseFilePath() { return _databaseFilePath; }
static QString getCachePath() { return _cachePath; }

private:
// QString tileSpecToFilename(const QGeoTileSpec &spec, const QString &format, const QString &directory) const final;
// QGeoTileSpec filenameToTileSpec(const QString &filename) const final;

static void _initCache();
static bool _wipeDirectory(const QString &dirPath);
static void _wipeOldCaches();

static QString _getCachePath(const QVariantMap &parameters);
static uint32_t _getMemLimit(const QVariantMap &Parameters);

static uint32_t _getDefaultMaxMemLimit() { return (3 * pow(1024, 2)); }
static uint32_t _getDefaultMaxDiskCache() { return 0; /*(50 * pow(1024, 2));*/ }
static uint32_t _getDefaultMaxDiskCache() { return 0; } // (50 * pow(1024, 2));
static uint32_t _getDefaultExtraTexture() { return (6 * pow(1024, 2)); }
static uint32_t _getDefaultMinTexture() { return 0; }

static quint32 _getMaxMemCacheSetting();

static QString _databaseFilePath;
static QString _cachePath;
static bool _cacheWasReset;

static constexpr const char *kCachePathVersion = "300";
};
Loading

0 comments on commit d2dd96d

Please sign in to comment.