From d2dd96dce68871ffaf9ce9eefca15f5443c24cd9 Mon Sep 17 00:00:00 2001 From: Holden Date: Thu, 19 Sep 2024 18:24:19 -0400 Subject: [PATCH] QtLocationPlugin: Minor Miscellaneous Improvements --- src/QtLocationPlugin/QGCMapEngine.cpp | 96 ++---------- src/QtLocationPlugin/QGCMapEngine.h | 12 +- src/QtLocationPlugin/QGeoFileTileCacheQGC.cpp | 143 ++++++++++++++---- src/QtLocationPlugin/QGeoFileTileCacheQGC.h | 17 ++- src/QtLocationPlugin/QGeoMapReplyQGC.cpp | 22 ++- src/QtLocationPlugin/QGeoMapReplyQGC.h | 2 - .../QGeoServiceProviderPluginQGC.cpp | 22 ++- .../QGeoServiceProviderPluginQGC.h | 2 +- src/QtLocationPlugin/QGeoTileFetcherQGC.cpp | 15 -- src/QtLocationPlugin/QGeoTileFetcherQGC.h | 2 - src/QtLocationPlugin/QGeoTiledMapQGC.cpp | 1 - .../QGeoTiledMappingManagerEngineQGC.cpp | 39 +++-- .../QGeoTiledMappingManagerEngineQGC.h | 4 +- .../QMLControl/QGCMapEngineManager.cc | 5 +- 14 files changed, 204 insertions(+), 178 deletions(-) diff --git a/src/QtLocationPlugin/QGCMapEngine.cpp b/src/QtLocationPlugin/QGCMapEngine.cpp index 19b83aed2259..e251e44b2c77 100644 --- a/src/QtLocationPlugin/QGCMapEngine.cpp +++ b/src/QtLocationPlugin/QGCMapEngine.cpp @@ -15,6 +15,7 @@ * @author Gus Grubba * */ + #include "QGCMapEngine.h" #include "QGCCachedTileSet.h" #include "QGCTileCacheWorker.h" @@ -23,31 +24,21 @@ #include "QGCTileSet.h" #include "QGCTile.h" #include "QGCCacheTile.h" -#include "QGCApplication.h" #include #include -#include -#include - -#define CACHE_PATH_VERSION "300" QGC_LOGGING_CATEGORY(QGCMapEngineLog, "qgc.qtlocationplugin.qgcmapengine") Q_DECLARE_METATYPE(QList) -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)) @@ -72,45 +63,17 @@ 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) @@ -118,47 +81,6 @@ 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); diff --git a/src/QtLocationPlugin/QGCMapEngine.h b/src/QtLocationPlugin/QGCMapEngine.h index 315b5a356d3b..a86b4313a0cc 100644 --- a/src/QtLocationPlugin/QGCMapEngine.h +++ b/src/QtLocationPlugin/QGCMapEngine.h @@ -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); @@ -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(); diff --git a/src/QtLocationPlugin/QGeoFileTileCacheQGC.cpp b/src/QtLocationPlugin/QGeoFileTileCacheQGC.cpp index cc47a0bc0510..199fefb5a184 100644 --- a/src/QtLocationPlugin/QGeoFileTileCacheQGC.cpp +++ b/src/QtLocationPlugin/QGeoFileTileCacheQGC.cpp @@ -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 ¶meters, QObject *parent) - : QGeoFileTileCache(_getCachePath(parameters), parent) + : QGeoFileTileCache(baseCacheDirectory(), parent) { // qCDebug(QGeoFileTileCacheQGCLog) << Q_FUNC_INFO << this; @@ -26,40 +30,24 @@ QGeoFileTileCacheQGC::QGeoFileTileCacheQGC(const QVariantMap ¶meters, 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 ¶meters) -{ - 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 ¶meters) { uint32_t memLimit = 0; @@ -122,3 +110,106 @@ QGCFetchTileTask* QGeoFileTileCacheQGC::createFetchTileTask(const QString &type, QGCFetchTileTask* const task = new QGCFetchTileTask(hash); return task; } + +QString QGeoFileTileCacheQGC::_getCachePath(const QVariantMap ¶meters) +{ + 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.")); + } +} diff --git a/src/QtLocationPlugin/QGeoFileTileCacheQGC.h b/src/QtLocationPlugin/QGeoFileTileCacheQGC.h index 271b220d4d96..e0c39ed8cdcf 100644 --- a/src/QtLocationPlugin/QGeoFileTileCacheQGC.h +++ b/src/QtLocationPlugin/QGeoFileTileCacheQGC.h @@ -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 ¶meters); 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"; }; diff --git a/src/QtLocationPlugin/QGeoMapReplyQGC.cpp b/src/QtLocationPlugin/QGeoMapReplyQGC.cpp index 760e2c702f9d..517b32d765f3 100644 --- a/src/QtLocationPlugin/QGeoMapReplyQGC.cpp +++ b/src/QtLocationPlugin/QGeoMapReplyQGC.cpp @@ -70,7 +70,7 @@ void QGeoTiledMapReplyQGC::_networkReplyFinished() { QNetworkReply* const reply = qobject_cast(sender()); if (!reply) { - setError(QGeoTiledMapReply::UnknownError, QStringLiteral("Unexpected Error")); + setError(QGeoTiledMapReply::UnknownError, tr("Unexpected Error")); return; } reply->deleteLater(); @@ -80,7 +80,7 @@ void QGeoTiledMapReplyQGC::_networkReplyFinished() } if (!reply->isOpen()) { - setError(QGeoTiledMapReply::ParseError, QStringLiteral("Empty Reply")); + setError(QGeoTiledMapReply::ParseError, tr("Empty Reply")); return; } @@ -92,7 +92,7 @@ void QGeoTiledMapReplyQGC::_networkReplyFinished() QByteArray image = reply->readAll(); if (image.isEmpty()) { - setError(QGeoTiledMapReply::ParseError, QStringLiteral("Image is Empty")); + setError(QGeoTiledMapReply::ParseError, tr("Image is Empty")); return; } @@ -100,7 +100,7 @@ void QGeoTiledMapReplyQGC::_networkReplyFinished() Q_CHECK_PTR(mapProvider); if (mapProvider->isBingProvider() && (image == _bingNoTileImage)) { - setError(QGeoTiledMapReply::CommunicationError, QStringLiteral("Bing Tile Above Zoom Level")); + setError(QGeoTiledMapReply::CommunicationError, tr("Bing Tile Above Zoom Level")); return; } @@ -108,7 +108,7 @@ void QGeoTiledMapReplyQGC::_networkReplyFinished() const SharedElevationProvider elevationProvider = std::dynamic_pointer_cast(mapProvider); image = elevationProvider->serialize(image); if (image.isEmpty()) { - setError(QGeoTiledMapReply::ParseError, QStringLiteral("Failed to Serialize Terrain Tile")); + setError(QGeoTiledMapReply::ParseError, tr("Failed to Serialize Terrain Tile")); return; } } @@ -116,7 +116,7 @@ void QGeoTiledMapReplyQGC::_networkReplyFinished() const QString format = mapProvider->getImageFormat(image); if (format.isEmpty()) { - setError(QGeoTiledMapReply::ParseError, QStringLiteral("Unknown Format")); + setError(QGeoTiledMapReply::ParseError, tr("Unknown Format")); return; } setMapImageFormat(format); @@ -131,7 +131,7 @@ void QGeoTiledMapReplyQGC::_networkReplyError(QNetworkReply::NetworkError error) if (error != QNetworkReply::OperationCanceledError) { const QNetworkReply* const reply = qobject_cast(sender()); if (!reply) { - setError(QGeoTiledMapReply::CommunicationError, QStringLiteral("Invalid Reply")); + setError(QGeoTiledMapReply::CommunicationError, tr("Invalid Reply")); } else { setError(QGeoTiledMapReply::CommunicationError, reply->errorString()); } @@ -140,7 +140,6 @@ void QGeoTiledMapReplyQGC::_networkReplyError(QNetworkReply::NetworkError error) } } -#if QT_CONFIG(ssl) void QGeoTiledMapReplyQGC::_networkReplySslErrors(const QList &errors) { QString errorString; @@ -155,7 +154,6 @@ void QGeoTiledMapReplyQGC::_networkReplySslErrors(const QList &errors setError(QGeoTiledMapReply::CommunicationError, errorString); } } -#endif void QGeoTiledMapReplyQGC::_cacheReply(QGCCacheTile *tile) { @@ -166,7 +164,7 @@ void QGeoTiledMapReplyQGC::_cacheReply(QGCCacheTile *tile) setFinished(true); delete tile; } else { - setError(QGeoTiledMapReply::UnknownError, QStringLiteral("Invalid Cache Tile")); + setError(QGeoTiledMapReply::UnknownError, tr("Invalid Cache Tile")); } } @@ -177,7 +175,7 @@ void QGeoTiledMapReplyQGC::_cacheError(QGCMapTask::TaskType type, QStringView er Q_ASSERT(type == QGCMapTask::taskFetchTile); if (!QGCDeviceInfo::isInternetAvailable()) { - setError(QGeoTiledMapReply::CommunicationError, QStringLiteral("Network Not Available")); + setError(QGeoTiledMapReply::CommunicationError, tr("Network Not Available")); return; } @@ -189,9 +187,7 @@ void QGeoTiledMapReplyQGC::_cacheError(QGCMapTask::TaskType type, QStringView er (void) connect(reply, &QNetworkReply::finished, this, &QGeoTiledMapReplyQGC::_networkReplyFinished); (void) connect(reply, &QNetworkReply::errorOccurred, this, &QGeoTiledMapReplyQGC::_networkReplyError); -#if QT_CONFIG(ssl) (void) connect(reply, &QNetworkReply::sslErrors, this, &QGeoTiledMapReplyQGC::_networkReplySslErrors); -#endif (void) connect(this, &QGeoTiledMapReplyQGC::aborted, reply, &QNetworkReply::abort); } diff --git a/src/QtLocationPlugin/QGeoMapReplyQGC.h b/src/QtLocationPlugin/QGeoMapReplyQGC.h index d7eec1b2106a..f6827d8cd851 100644 --- a/src/QtLocationPlugin/QGeoMapReplyQGC.h +++ b/src/QtLocationPlugin/QGeoMapReplyQGC.h @@ -25,9 +25,7 @@ class QGeoTiledMapReplyQGC : public QGeoTiledMapReply private slots: void _networkReplyFinished(); void _networkReplyError(QNetworkReply::NetworkError error); -#if QT_CONFIG(ssl) void _networkReplySslErrors(const QList &errors); -#endif void _cacheReply(QGCCacheTile *tile); void _cacheError(QGCMapTask::TaskType type, QStringView errorString); diff --git a/src/QtLocationPlugin/QGeoServiceProviderPluginQGC.cpp b/src/QtLocationPlugin/QGeoServiceProviderPluginQGC.cpp index e63e8d8c63f0..fbedf97f0e06 100644 --- a/src/QtLocationPlugin/QGeoServiceProviderPluginQGC.cpp +++ b/src/QtLocationPlugin/QGeoServiceProviderPluginQGC.cpp @@ -2,6 +2,8 @@ #include "QGeoTiledMappingManagerEngineQGC.h" #include +#include + QGC_LOGGING_CATEGORY(QGeoServiceProviderFactoryQGCLog, "qgc.qtlocationplugin.qgeoserviceproviderfactoryqgc") QGeoServiceProviderFactoryQGC::QGeoServiceProviderFactoryQGC(QObject *parent) @@ -15,7 +17,7 @@ QGeoServiceProviderFactoryQGC::~QGeoServiceProviderFactoryQGC() qCDebug(QGeoServiceProviderFactoryQGCLog) << Q_FUNC_INFO << this; } -QGeoCodingManagerEngine* QGeoServiceProviderFactoryQGC::createGeocodingManagerEngine( +QGeoCodingManagerEngine *QGeoServiceProviderFactoryQGC::createGeocodingManagerEngine( const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString) const { Q_UNUSED(parameters); @@ -25,10 +27,11 @@ QGeoCodingManagerEngine* QGeoServiceProviderFactoryQGC::createGeocodingManagerEn if (errorString) { *errorString = "Geocoding Not Supported"; } + return nullptr; } -QGeoMappingManagerEngine* QGeoServiceProviderFactoryQGC::createMappingManagerEngine( +QGeoMappingManagerEngine *QGeoServiceProviderFactoryQGC::createMappingManagerEngine( const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString) const { if (error) { @@ -37,11 +40,16 @@ QGeoMappingManagerEngine* QGeoServiceProviderFactoryQGC::createMappingManagerEng if (errorString) { *errorString = ""; } - // TODO: m_engine->networkAccessManager(); - return new QGeoTiledMappingManagerEngineQGC(parameters, error, errorString); + + QNetworkAccessManager *networkManager = nullptr; + if (m_engine) { + networkManager = m_engine->networkAccessManager(); + } + + return new QGeoTiledMappingManagerEngineQGC(parameters, error, errorString, networkManager, nullptr); } -QGeoRoutingManagerEngine* QGeoServiceProviderFactoryQGC::createRoutingManagerEngine( +QGeoRoutingManagerEngine *QGeoServiceProviderFactoryQGC::createRoutingManagerEngine( const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString) const { Q_UNUSED(parameters); @@ -51,10 +59,11 @@ QGeoRoutingManagerEngine* QGeoServiceProviderFactoryQGC::createRoutingManagerEng if (errorString) { *errorString = "Routing Not Supported"; } + return nullptr; } -QPlaceManagerEngine* QGeoServiceProviderFactoryQGC::createPlaceManagerEngine( +QPlaceManagerEngine *QGeoServiceProviderFactoryQGC::createPlaceManagerEngine( const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString) const { Q_UNUSED(parameters); @@ -64,5 +73,6 @@ QPlaceManagerEngine* QGeoServiceProviderFactoryQGC::createPlaceManagerEngine( if (errorString) { *errorString = "Place Not Supported"; } + return nullptr; } diff --git a/src/QtLocationPlugin/QGeoServiceProviderPluginQGC.h b/src/QtLocationPlugin/QGeoServiceProviderPluginQGC.h index 40eb7bbc46bb..866b1acb38c7 100644 --- a/src/QtLocationPlugin/QGeoServiceProviderPluginQGC.h +++ b/src/QtLocationPlugin/QGeoServiceProviderPluginQGC.h @@ -25,5 +25,5 @@ class QGeoServiceProviderFactoryQGC: public QObject, public QGeoServiceProviderF void setQmlEngine(QQmlEngine* engine) final { m_engine = engine; } private: - QQmlEngine* m_engine = nullptr; + QQmlEngine *m_engine = nullptr; }; diff --git a/src/QtLocationPlugin/QGeoTileFetcherQGC.cpp b/src/QtLocationPlugin/QGeoTileFetcherQGC.cpp index c99227282e2b..1d3a0dbdcfbc 100644 --- a/src/QtLocationPlugin/QGeoTileFetcherQGC.cpp +++ b/src/QtLocationPlugin/QGeoTileFetcherQGC.cpp @@ -5,8 +5,6 @@ #include "MapProvider.h" #include -// #include -#include #include #include #include @@ -16,7 +14,6 @@ QGC_LOGGING_CATEGORY(QGeoTileFetcherQGCLog, "qgc.qtlocationplugin.qgeotilefetche QGeoTileFetcherQGC::QGeoTileFetcherQGC(QNetworkAccessManager *networkManager, const QVariantMap ¶meters, QGeoTiledMappingManagerEngineQGC *parent) : QGeoTileFetcher(parent) , m_networkManager(networkManager) - // , m_diskCache(new QNetworkDiskCache(this)) { Q_CHECK_PTR(networkManager); @@ -26,18 +23,6 @@ QGeoTileFetcherQGC::QGeoTileFetcherQGC(QNetworkAccessManager *networkManager, co /*if (parameters.contains(QStringLiteral("useragent"))) { setUserAgent(parameters.value(QStringLiteral("useragent")).toString().toLatin1()); }*/ - -#ifndef __mobile__ - QNetworkProxy proxy = m_networkManager->proxy(); - proxy.setType(QNetworkProxy::DefaultProxy); - m_networkManager->setProxy(proxy); -#endif - - /*m_networkManager->setTransferTimeout(10000); - m_networkManager->setAutoDeleteReplies(true); - m_diskCache->setCacheDirectory(directory() + "/Downloads"); - m_diskCache->setMaximumCacheSize(static_cast(_getDefaultMaxDiskCache())); - m_networkManager->setCache(m_diskCache);*/ } QGeoTileFetcherQGC::~QGeoTileFetcherQGC() diff --git a/src/QtLocationPlugin/QGeoTileFetcherQGC.h b/src/QtLocationPlugin/QGeoTileFetcherQGC.h index 96566a94283f..2a1389fbf44a 100644 --- a/src/QtLocationPlugin/QGeoTileFetcherQGC.h +++ b/src/QtLocationPlugin/QGeoTileFetcherQGC.h @@ -10,7 +10,6 @@ class QGeoTiledMappingManagerEngineQGC; class QGeoTiledMapReplyQGC; class QGeoTileSpec; class QNetworkAccessManager; -class QNetworkDiskCache; class QGeoTileFetcherQGC : public QGeoTileFetcher { @@ -33,7 +32,6 @@ class QGeoTileFetcherQGC : public QGeoTileFetcher void handleReply(QGeoTiledMapReply *reply, const QGeoTileSpec &spec) final; QNetworkAccessManager *m_networkManager = nullptr; - // QNetworkDiskCache *m_diskCache = nullptr; #if defined Q_OS_MAC static constexpr const char* s_userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:125.0) Gecko/20100101 Firefox/125.0"; diff --git a/src/QtLocationPlugin/QGeoTiledMapQGC.cpp b/src/QtLocationPlugin/QGeoTiledMapQGC.cpp index 6eccb5a6bc73..f06ce1b364ad 100644 --- a/src/QtLocationPlugin/QGeoTiledMapQGC.cpp +++ b/src/QtLocationPlugin/QGeoTiledMapQGC.cpp @@ -18,7 +18,6 @@ QGeoTiledMapQGC::~QGeoTiledMapQGC() QGeoMap::Capabilities QGeoTiledMapQGC::capabilities() const { return Capabilities(SupportsVisibleRegion - | SupportsSetBearing | SupportsAnchoringCoordinate | SupportsVisibleArea); } diff --git a/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp b/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp index 7085532a58c5..604c9d9b5bf2 100644 --- a/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp +++ b/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp @@ -11,26 +11,24 @@ #include #include +#include +#include #include #include #include #include -#define TILE_VERSION 1 - QGC_LOGGING_CATEGORY(QGeoTiledMappingManagerEngineQGCLog, "qgc.qtlocationplugin.qgeotiledmappingmanagerengineqgc") -QGeoTiledMappingManagerEngineQGC::QGeoTiledMappingManagerEngineQGC(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString, QObject *parent) +QGeoTiledMappingManagerEngineQGC::QGeoTiledMappingManagerEngineQGC(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString, QNetworkAccessManager *networkManager, QObject *parent) : QGeoTiledMappingManagerEngine(parent) - , m_networkManager(new QNetworkAccessManager(this)) + , m_networkManager(networkManager) { // qCDebug(QGeoTiledMappingManagerEngineQGCLog) << Q_FUNC_INFO << this; // TODO: Better way to get current language without qgcApp()? setLocale(qgcApp()->getCurrentLanguage()); - getQGCMapEngine()->init(); - QGeoCameraCapabilities cameraCaps; cameraCaps.setTileSize(256); cameraCaps.setMinimumZoomLevel(2.0); @@ -45,7 +43,7 @@ QGeoTiledMappingManagerEngineQGC::QGeoTiledMappingManagerEngineQGC(const QVarian cameraCaps.setOverzoomEnabled(true); setCameraCapabilities(cameraCaps); - setTileVersion(TILE_VERSION); + setTileVersion(kTileVersion); setTileSize(QSize(256, 256)); QList mapList; @@ -69,12 +67,33 @@ QGeoTiledMappingManagerEngineQGC::QGeoTiledMappingManagerEngineQGC(const QVarian QGeoFileTileCacheQGC* const fileTileCache = new QGeoFileTileCacheQGC(parameters); setTileCache(fileTileCache); + static std::once_flag mapEngineInit; + std::call_once(mapEngineInit, []() { + getQGCMapEngine()->init(); + }); + m_prefetchStyle = QGeoTiledMap::PrefetchTwoNeighbourLayers; - *error = QGeoServiceProvider::NoError; - errorString->clear(); + if (!m_networkManager) { + m_networkManager = new QNetworkAccessManager(this); + #if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) + QNetworkProxy proxy = m_networkManager->proxy(); + proxy.setType(QNetworkProxy::DefaultProxy); + m_networkManager->setProxy(proxy); + #endif + m_networkManager->setTransferTimeout(10000); + // m_networkManager->setAutoDeleteReplies(true); + QNetworkDiskCache *diskCache = new QNetworkDiskCache(this); + diskCache->setCacheDirectory(fileTileCache->getCachePath() + "/Downloads"); + const qint64 maxCacheSize = (50 * pow(1024, 2)); // fileTileCache->getMaxDiskCache() + diskCache->setMaximumCacheSize(maxCacheSize); + m_networkManager->setCache(diskCache); + } QGeoTileFetcherQGC* const tileFetcher = new QGeoTileFetcherQGC(m_networkManager, parameters, this); + + *error = QGeoServiceProvider::NoError; + errorString->clear(); setTileFetcher(tileFetcher); // Calls engineInitialized } @@ -83,7 +102,7 @@ QGeoTiledMappingManagerEngineQGC::~QGeoTiledMappingManagerEngineQGC() // qCDebug(QGeoTiledMappingManagerEngineQGCLog) << Q_FUNC_INFO << this; } -QGeoMap* QGeoTiledMappingManagerEngineQGC::createMap() +QGeoMap *QGeoTiledMappingManagerEngineQGC::createMap() { QGeoTiledMapQGC* const map = new QGeoTiledMapQGC(this, this); map->setPrefetchStyle(m_prefetchStyle); diff --git a/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.h b/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.h index 0b9ff42ef576..266982dd2ff6 100644 --- a/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.h +++ b/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.h @@ -13,7 +13,7 @@ class QGeoTiledMappingManagerEngineQGC : public QGeoTiledMappingManagerEngine Q_OBJECT public: - QGeoTiledMappingManagerEngineQGC(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString, QObject *parent = nullptr); + QGeoTiledMappingManagerEngineQGC(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString, QNetworkAccessManager *networkManager = nullptr, QObject *parent = nullptr); ~QGeoTiledMappingManagerEngineQGC(); QGeoMap* createMap() final; @@ -21,4 +21,6 @@ class QGeoTiledMappingManagerEngineQGC : public QGeoTiledMappingManagerEngine private: QNetworkAccessManager *m_networkManager = nullptr; + + static constexpr int kTileVersion = 1; }; diff --git a/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc b/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc index d49e0a46a14a..bc6ad9c8012d 100644 --- a/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc +++ b/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc @@ -15,6 +15,7 @@ #include "QGCCachedTileSet.h" #include "QGCMapUrlEngine.h" #include "QGCMapEngine.h" +#include "QGeoFileTileCacheQGC.h" #include "ElevationMapProvider.h" #include "QmlObjectListModel.h" #include "QGCApplication.h" @@ -46,7 +47,7 @@ QGCMapEngineManager::QGCMapEngineManager(QObject *parent) (void) connect(getQGCMapEngine(), &QGCMapEngine::updateTotals, this, &QGCMapEngineManager::_updateTotals); - _updateDiskFreeSpace(); + // _updateDiskFreeSpace(); // qCDebug(QGCMapEngineManagerLog) << Q_FUNC_INFO << this; } @@ -298,7 +299,7 @@ void QGCMapEngineManager::taskError(QGCMapTask::TaskType type, const QString &er // FIXME: Results are unused void QGCMapEngineManager::_updateDiskFreeSpace() { - const QString path = getQGCMapEngine()->getCachePath(); + const QString path = QGeoFileTileCacheQGC::getCachePath(); if (path.isEmpty()) { return; }