4#include <QtCore/QCoreApplication>
5#include <QtCore/QSettings>
17 qCDebug(QGCTileCacheWorkerLog) <<
this;
25 qCDebug(QGCTileCacheWorkerLog) <<
this;
32 _stopRequested =
true;
33 QMutexLocker lock(&_taskQueueMutex);
34 qDeleteAll(_taskQueue);
46 task->
setError(tr(
"Database Not Initialized"));
51 QMutexLocker lock(&_taskQueueMutex);
52 _taskQueue.enqueue(task);
58 start(QThread::NormalPriority);
66 _stopRequested =
false;
67 _database = std::make_unique<QGCTileCacheDatabase>(_databasePath);
69 if (!_database->init()) {
70 qCWarning(QGCTileCacheWorkerLog) <<
"Failed To Init Database";
73 QMutexLocker lock(&_taskQueueMutex);
75 orphan->setError(tr(
"Database Init Failed"));
76 orphan->deleteLater();
82 if (_database->isValid()) {
83 if (_database->connectDB()) {
84 _database->deleteBingNoTileTiles();
88 _dbValid = _database->isValid();
93 QMutexLocker lock(&_taskQueueMutex);
94 while (!_stopRequested) {
95 if (!_taskQueue.isEmpty()) {
102 const qsizetype count = _taskQueue.count();
104 _updateTimeout = kLongTimeoutMs;
105 }
else if (count < 25) {
106 _updateTimeout = kShortTimeoutMs;
109 if ((count == 0) || _updateTimer.hasExpired(_updateTimeout)) {
110 if (_database && _database->isValid()) {
117 (void) _waitc.wait(lock.mutex(), 5000);
124 orphan->setError(tr(
"Worker shutting down"));
125 orphan->deleteLater();
132 _database->disconnectDB();
137void QGCCacheWorker::_runTask(
QGCMapTask *task)
139 switch (task->
type()) {
153 _createTileSet(task);
156 _getTileDownloadList(task);
159 _updateTileDownloadState(task);
162 _deleteTileSet(task);
165 _renameTileSet(task);
171 _resetCacheDatabase(task);
180 qCWarning(QGCTileCacheWorkerLog) <<
"given unhandled task type" << task->
type();
185bool QGCCacheWorker::_testTask(
QGCMapTask *mtask)
187 if (!_database || !_database->isValid()) {
188 mtask->
setError(
"No Cache Database");
195void QGCCacheWorker::_emitTotals()
199 _updateTimer.restart();
203void QGCCacheWorker::_saveTile(
QGCMapTask *mtask)
205 if (!_testTask(mtask)) {
212 mtask->
setError(
"Error saving tile to cache");
216void QGCCacheWorker::_getTile(
QGCMapTask *mtask)
218 if (!_testTask(mtask)) {
223 auto tile = _database->getTile(task->
hash());
227 task->
setError(
"Tile not in cache database");
233void QGCCacheWorker::_getTileSets(
QGCMapTask *mtask)
235 if (!_testTask(mtask)) {
240 const QList<TileSetRecord> records = _database->getTileSets();
242 for (
const auto &rec : records) {
244 set->blockSignals(
true);
246 set->setId(rec.setID);
247 set->setMapTypeStr(rec.mapTypeStr);
248 set->setTopleftLat(rec.topleftLat);
249 set->setTopleftLon(rec.topleftLon);
250 set->setBottomRightLat(rec.bottomRightLat);
251 set->setBottomRightLon(rec.bottomRightLon);
252 set->setMinZoom(rec.minZoom);
253 set->setMaxZoom(rec.maxZoom);
255 set->setTotalTileCount(rec.numTiles);
256 set->setDefaultSet(rec.defaultSet);
257 set->setCreationDate(QDateTime::fromSecsSinceEpoch(rec.date));
259 const SetTotalsResult totals = _database->computeSetTotals(rec.setID, rec.defaultSet, rec.numTiles, set->type());
266 set->blockSignals(
false);
267 (void) set->moveToThread(QCoreApplication::instance()->thread());
275void QGCCacheWorker::_createTileSet(
QGCMapTask *mtask)
277 if (!_testTask(mtask)) {
282 const auto setID = _database->createTileSet(
285 task->
tileSet()->bottomRightLat(), task->
tileSet()->bottomRightLon(),
289 if (!setID.has_value()) {
290 mtask->
setError(
"Error saving tile set");
294 task->
tileSet()->blockSignals(
true);
295 task->
tileSet()->setId(setID.value());
298 setID.value(), task->
tileSet()->defaultSet(),
305 task->
tileSet()->blockSignals(
false);
310void QGCCacheWorker::_getTileDownloadList(
QGCMapTask *mtask)
312 if (!_testTask(mtask)) {
317 const QList<QGCTile> tileValues = _database->getTileDownloadList(task->
setID(), task->
count());
318 QQueue<QGCTile*> tiles;
319 for (
const auto &t : tileValues) {
325void QGCCacheWorker::_updateTileDownloadState(
QGCMapTask *mtask)
327 if (!_testTask(mtask)) {
333 if (task->
hash() == QStringLiteral(
"*")) {
334 ok = _database->updateAllTileDownloadStates(task->
setID(),
static_cast<int>(task->
state()));
336 ok = _database->updateTileDownloadState(task->
setID(),
static_cast<int>(task->
state()), task->
hash());
339 mtask->
setError(
"Error updating tile download state");
344void QGCCacheWorker::_pruneCache(
QGCMapTask *mtask)
346 if (!_testTask(mtask)) {
351 if (!_database->pruneCache(task->
amount())) {
352 mtask->
setError(
"Error pruning cache");
359void QGCCacheWorker::_deleteTileSet(
QGCMapTask *mtask)
361 if (!_testTask(mtask)) {
366 if (!_database->deleteTileSet(task->
setID())) {
367 mtask->
setError(
"Error deleting tile set");
374void QGCCacheWorker::_renameTileSet(
QGCMapTask *mtask)
376 if (!_testTask(mtask)) {
381 if (!_database->renameTileSet(task->
setID(), task->
newName())) {
382 task->
setError(
"Error renaming tile set");
387void QGCCacheWorker::_resetCacheDatabase(
QGCMapTask *mtask)
389 if (!_testTask(mtask)) {
394 if (!_database->resetDatabase()) {
395 mtask->
setError(
"Error resetting cache database");
398 _dbValid = _database->isValid();
403void QGCCacheWorker::_importSets(
QGCMapTask *mtask)
405 if (!_testTask(mtask)) {
410 auto progress = [task](
int pct) { task->
setProgress(pct); };
414 result = _database->importSetsReplace(task->
path(), progress);
416 result = _database->importSetsMerge(task->
path(), progress);
419 _dbValid = _database->isValid();
426 if (task->
replace() && _database->isValid()) {
429 _database->deleteBingNoTileTiles();
438void QGCCacheWorker::_exportSets(
QGCMapTask *mtask)
440 if (!_testTask(mtask)) {
446 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)
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)