4#include <QtCore/QCoreApplication>
5#include <QtCore/QSettings>
18 qCDebug(QGCTileCacheWorkerLog) <<
this;
25 qCDebug(QGCTileCacheWorkerLog) <<
this;
30 _stopRequested =
true;
31 QMutexLocker lock(&_taskQueueMutex);
32 qDeleteAll(_taskQueue);
44 task->
setError(tr(
"Database Not Initialized"));
49 QMutexLocker lock(&_taskQueueMutex);
50 _taskQueue.enqueue(task);
56 start(QThread::NormalPriority);
64 _stopRequested =
false;
65 _database = std::make_unique<QGCTileCacheDatabase>(_databasePath);
67 if (!_database->init()) {
68 qCWarning(QGCTileCacheWorkerLog) <<
"Failed To Init Database";
71 QMutexLocker lock(&_taskQueueMutex);
73 orphan->setError(tr(
"Database Init Failed"));
74 orphan->deleteLater();
80 if (_database->isValid()) {
81 if (_database->connectDB()) {
82 _database->deleteBingNoTileTiles();
86 _dbValid = _database->isValid();
90 QMutexLocker lock(&_taskQueueMutex);
91 while (!_stopRequested) {
92 if (!_taskQueue.isEmpty()) {
99 const qsizetype count = _taskQueue.count();
101 _updateTimeout = kLongTimeoutMs;
102 }
else if (count < 25) {
103 _updateTimeout = kShortTimeoutMs;
106 if ((count == 0) || _updateTimer.hasExpired(_updateTimeout)) {
107 if (_database && _database->isValid()) {
114 (void) _waitc.wait(lock.mutex(), 5000);
119 orphan->setError(tr(
"Worker shutting down"));
120 orphan->deleteLater();
127 _database->disconnectDB();
132void QGCCacheWorker::_runTask(
QGCMapTask *task)
134 switch (task->
type()) {
147 _createTileSet(task);
150 _getTileDownloadList(task);
153 _updateTileDownloadState(task);
156 _deleteTileSet(task);
159 _renameTileSet(task);
165 _resetCacheDatabase(task);
174 qCWarning(QGCTileCacheWorkerLog) <<
"given unhandled task type" << task->
type();
179bool QGCCacheWorker::_testTask(
QGCMapTask *mtask)
181 if (!_database || !_database->isValid()) {
182 mtask->
setError(
"No Cache Database");
189void QGCCacheWorker::_emitTotals()
193 _updateTimer.restart();
196void QGCCacheWorker::_saveTile(
QGCMapTask *mtask)
198 if (!_testTask(mtask)) {
205 mtask->
setError(
"Error saving tile to cache");
209void QGCCacheWorker::_getTile(
QGCMapTask *mtask)
211 if (!_testTask(mtask)) {
216 auto tile = _database->getTile(task->
hash());
220 task->
setError(
"Tile not in cache database");
224void QGCCacheWorker::_getTileSets(
QGCMapTask *mtask)
226 if (!_testTask(mtask)) {
231 const QList<TileSetRecord> records = _database->getTileSets();
233 for (
const auto &rec : records) {
235 set->blockSignals(
true);
237 set->
setId(rec.setID);
250 const SetTotalsResult totals = _database->computeSetTotals(rec.setID, rec.defaultSet, rec.numTiles, set->
type());
257 set->blockSignals(
false);
258 (void) set->moveToThread(QCoreApplication::instance()->thread());
263void QGCCacheWorker::_createTileSet(
QGCMapTask *mtask)
265 if (!_testTask(mtask)) {
270 const auto setID = _database->createTileSet(
277 if (!setID.has_value()) {
278 mtask->
setError(
"Error saving tile set");
282 task->
tileSet()->blockSignals(
true);
293 task->
tileSet()->blockSignals(
false);
298void QGCCacheWorker::_getTileDownloadList(
QGCMapTask *mtask)
300 if (!_testTask(mtask)) {
305 const QList<QGCTile> tileValues = _database->getTileDownloadList(task->
setID(), task->
count());
306 QQueue<QGCTile*> tiles;
307 for (
const auto &t : tileValues) {
313void QGCCacheWorker::_updateTileDownloadState(
QGCMapTask *mtask)
315 if (!_testTask(mtask)) {
321 if (task->
hash() == QStringLiteral(
"*")) {
322 ok = _database->updateAllTileDownloadStates(task->
setID(),
static_cast<int>(task->
state()));
324 ok = _database->updateTileDownloadState(task->
setID(),
static_cast<int>(task->
state()), task->
hash());
327 mtask->
setError(
"Error updating tile download state");
331void QGCCacheWorker::_pruneCache(
QGCMapTask *mtask)
333 if (!_testTask(mtask)) {
338 if (!_database->pruneCache(task->
amount())) {
339 mtask->
setError(
"Error pruning cache");
345void QGCCacheWorker::_deleteTileSet(
QGCMapTask *mtask)
347 if (!_testTask(mtask)) {
352 if (!_database->deleteTileSet(task->
setID())) {
353 mtask->
setError(
"Error deleting tile set");
360void QGCCacheWorker::_renameTileSet(
QGCMapTask *mtask)
362 if (!_testTask(mtask)) {
367 if (!_database->renameTileSet(task->
setID(), task->
newName())) {
368 task->
setError(
"Error renaming tile set");
372void QGCCacheWorker::_resetCacheDatabase(
QGCMapTask *mtask)
374 if (!_testTask(mtask)) {
379 if (!_database->resetDatabase()) {
380 mtask->
setError(
"Error resetting cache database");
383 _dbValid = _database->isValid();
387void QGCCacheWorker::_importSets(
QGCMapTask *mtask)
389 if (!_testTask(mtask)) {
394 auto progress = [task](
int pct) { task->
setProgress(pct); };
398 result = _database->importSetsReplace(task->
path(), progress);
400 result = _database->importSetsMerge(task->
path(), progress);
403 _dbValid = _database->isValid();
410 if (task->
replace() && _database->isValid()) {
413 _database->deleteBingNoTileTiles();
419void QGCCacheWorker::_exportSets(
QGCMapTask *mtask)
421 if (!_testTask(mtask)) {
427 auto progress = [task](
int pct) { task->
setProgress(pct); };
#define QGC_LOGGING_CATEGORY(name, categoryStr)
bool enqueueTask(QGCMapTask *task)
void updateTotals(quint32 totaltiles, quint64 totalsize, quint32 defaulttiles, quint64 defaultsize)
void setTotalTileCount(quint32 num)
double bottomRightLon() const
double topleftLat() const
void setUniqueTileCount(quint32 num)
void setTotalTileSize(quint64 size)
void setSavedTileCount(quint32 num)
void setMinZoom(int zoom)
void setSavedTileSize(quint64 size)
void setMaxZoom(int zoom)
void setTopleftLat(double lat)
const QString & type() const
double topleftLon() const
void setDefaultSet(bool def)
quint32 totalTileCount() const
const QString & name() const
void setBottomRightLon(double lon)
void setType(const QString &type)
const QString & mapTypeStr() const
void setBottomRightLat(double lat)
void setCreationDate(const QDateTime &date)
void setMapTypeStr(const QString &typeStr)
double bottomRightLat() const
void setUniqueTileSize(quint64 size)
void setTopleftLon(double lon)
QGCCachedTileSet * tileSet()
void setProgress(int percentage)
void setExportCompleted()
const QList< TileSetRecord > & sets() const
void setTileSetFetched(QGCCachedTileSet *tileSet)
void setTileFetched(QGCCacheTile *tile)
void setTileListFetched(const QQueue< QGCTile * > &tiles)
void setImportCompleted()
void setProgress(int percentage)
void setError(const QString &errorString=QString())
@ taskUpdateTileDownloadState
@ taskGetTileDownloadList
const QGCCacheTile * tile() const
static constexpr const char * kBingNoTileDoneKey
QGCTile::TileState state() const
static QString getProviderTypeFromQtMapId(int qtMapId)