14 namespace swift::misc::simulation::data
25 if (models.
isEmpty()) {
return 0; }
28 if (c < 1) {
return 0; }
30 return allModels.
size();
35 static const QString is(
"FSX: %1 P3D: %2 FS9: %3 XP: %4 FG: %5");
45 static const QString is(
"FSX: %1, P3D: %2, FS9: %3, MSFS: %4, MSFS2024: %5");
55 static const QString s(
"%1 models, ts: %2");
70 case CSimulatorInfo::FS9: m_syncFS9 =
synchronized;
break;
71 case CSimulatorInfo::FSX: m_syncFsx =
synchronized;
break;
72 case CSimulatorInfo::P3D: m_syncP3D =
synchronized;
break;
73 case CSimulatorInfo::XPLANE: m_syncXPlane =
synchronized;
break;
74 case CSimulatorInfo::FG: m_syncFG =
synchronized;
break;
75 case CSimulatorInfo::MSFS: m_syncMsfs =
synchronized;
break;
76 case CSimulatorInfo::MSFS2024: m_syncMsfs2024 =
synchronized;
break;
77 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
129 if (filename.isEmpty()) {
return {}; }
131 const QString compareFileName(QFileInfo(filename).fileName());
134 const QString singleSimFile(
getFilename(singleSim));
135 if (singleSimFile.isEmpty())
continue;
136 const QString singleSimFileName(QFileInfo(singleSimFile).fileName());
137 if (singleSimFileName == compareFileName)
162 static const QDateTime outdated = QDateTime::currentDateTimeUtc().addDays(-365 * 5);
167 if (ts.isValid() && ts > outdated) { withInitializedCache.
add(simInfo); }
169 return withInitializedCache;
185 const QString simStr(sim.
toQString(
true));
188 this->synchronizeCacheImpl(sim);
193 if (this->admitCacheImpl(sim))
211 case CSimulatorInfo::FS9:
return m_modelCacheFs9.get();
212 case CSimulatorInfo::FSX:
return m_modelCacheFsx.get();
213 case CSimulatorInfo::P3D:
return m_modelCacheP3D.get();
214 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.get();
215 case CSimulatorInfo::FG:
return m_modelCacheFG.get();
216 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.get();
217 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.get();
218 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
return CAircraftModelList();
231 case CSimulatorInfo::FS9: msg = m_modelCacheFs9.set(setModels);
break;
232 case CSimulatorInfo::FSX: msg = m_modelCacheFsx.set(setModels);
break;
233 case CSimulatorInfo::P3D: msg = m_modelCacheP3D.set(setModels);
break;
234 case CSimulatorInfo::XPLANE: msg = m_modelCacheXP.set(setModels);
break;
235 case CSimulatorInfo::FG: msg = m_modelCacheFG.set(setModels);
break;
236 case CSimulatorInfo::MSFS: msg = m_modelCacheMsfs.set(setModels);
break;
237 case CSimulatorInfo::MSFS2024: msg = m_modelCacheMsfs2024.set(setModels);
break;
238 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
return CStatusMessage();
255 case CSimulatorInfo::FS9:
return m_syncFS9;
256 case CSimulatorInfo::FSX:
return m_syncFsx;
257 case CSimulatorInfo::P3D:
return m_syncP3D;
258 case CSimulatorInfo::XPLANE:
return m_syncXPlane;
259 case CSimulatorInfo::FG:
return m_syncFG;
260 case CSimulatorInfo::MSFS:
return m_syncMsfs;
261 case CSimulatorInfo::MSFS2024:
return m_syncMsfs2024;
262 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
288 case CSimulatorInfo::FS9:
return m_modelCacheFs9.getAvailableTimestamp();
289 case CSimulatorInfo::FSX:
return m_modelCacheFsx.getAvailableTimestamp();
290 case CSimulatorInfo::P3D:
return m_modelCacheP3D.getAvailableTimestamp();
291 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.getAvailableTimestamp();
292 case CSimulatorInfo::FG:
return m_modelCacheFG.getAvailableTimestamp();
293 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.getAvailableTimestamp();
294 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.getAvailableTimestamp();
295 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
return QDateTime();
308 case CSimulatorInfo::FS9:
return m_modelCacheFs9.set(m_modelCacheFs9.get(), ts.toMSecsSinceEpoch());
309 case CSimulatorInfo::FSX:
return m_modelCacheFsx.set(m_modelCacheFsx.get(), ts.toMSecsSinceEpoch());
310 case CSimulatorInfo::P3D:
return m_modelCacheP3D.set(m_modelCacheP3D.get(), ts.toMSecsSinceEpoch());
311 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.set(m_modelCacheXP.get(), ts.toMSecsSinceEpoch());
312 case CSimulatorInfo::FG:
return m_modelCacheFG.set(m_modelCacheFG.get(), ts.toMSecsSinceEpoch());
313 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.set(m_modelCacheMsfs.get(), ts.toMSecsSinceEpoch());
314 case CSimulatorInfo::MSFS2024:
315 return m_modelCacheMsfs2024.set(m_modelCacheMsfs2024.get(), ts.toMSecsSinceEpoch());
316 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
break;
330 case CSimulatorInfo::FS9:
return m_modelCacheFs9.getFilename();
331 case CSimulatorInfo::FSX:
return m_modelCacheFsx.getFilename();
332 case CSimulatorInfo::P3D:
return m_modelCacheP3D.getFilename();
333 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.getFilename();
334 case CSimulatorInfo::FG:
return m_modelCacheFG.getFilename();
335 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.getFilename();
336 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.getFilename();
337 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
347 case CSimulatorInfo::FS9:
return m_modelCacheFs9.isSaved();
348 case CSimulatorInfo::FSX:
return m_modelCacheFsx.isSaved();
349 case CSimulatorInfo::P3D:
return m_modelCacheP3D.isSaved();
350 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.isSaved();
351 case CSimulatorInfo::FG:
return m_modelCacheFG.isSaved();
352 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.isSaved();
353 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.isSaved();
354 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
359 void CModelCaches::synchronizeCacheImpl(
const CSimulatorInfo &simulator)
366 case CSimulatorInfo::FS9: m_modelCacheFs9.synchronize();
break;
367 case CSimulatorInfo::FSX: m_modelCacheFsx.synchronize();
break;
368 case CSimulatorInfo::P3D: m_modelCacheP3D.synchronize();
break;
369 case CSimulatorInfo::XPLANE: m_modelCacheXP.synchronize();
break;
370 case CSimulatorInfo::FG: m_modelCacheFG.synchronize();
break;
371 case CSimulatorInfo::MSFS: m_modelCacheMsfs.synchronize();
break;
372 case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.synchronize();
break;
373 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
379 bool CModelCaches::admitCacheImpl(
const CSimulatorInfo &simulator)
381 Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
384 switch (simulator.getSimulator())
386 case CSimulatorInfo::FS9: m_modelCacheFs9.admit();
break;
387 case CSimulatorInfo::FSX: m_modelCacheFsx.admit();
break;
388 case CSimulatorInfo::P3D: m_modelCacheP3D.admit();
break;
389 case CSimulatorInfo::XPLANE: m_modelCacheXP.admit();
break;
390 case CSimulatorInfo::FG: m_modelCacheFG.admit();
break;
391 case CSimulatorInfo::MSFS: m_modelCacheMsfs.admit();
break;
392 case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.admit();
break;
393 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
401 const QString simStr(simulator.
toQString(
true));
405 this->synchronizeCacheImpl(simulator);
410 if (this->admitCacheImpl(simulator))
428 case CSimulatorInfo::FS9:
return m_modelCacheFs9.get();
429 case CSimulatorInfo::FSX:
return m_modelCacheFsx.get();
430 case CSimulatorInfo::P3D:
return m_modelCacheP3D.get();
431 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.get();
432 case CSimulatorInfo::FG:
return m_modelCacheFG.get();
433 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.get();
434 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.get();
435 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
return CAircraftModelList();
450 if (removed > 0) {
CLogMessage(
this).
info(u
"Removed %1 flyable models from XPlane model set!"); }
459 case CSimulatorInfo::FS9: msg = m_modelCacheFs9.set(orderedModels);
break;
460 case CSimulatorInfo::FSX: msg = m_modelCacheFsx.set(orderedModels);
break;
461 case CSimulatorInfo::P3D: msg = m_modelCacheP3D.set(orderedModels);
break;
462 case CSimulatorInfo::XPLANE: msg = m_modelCacheXP.set(orderedModels);
break;
463 case CSimulatorInfo::FG: msg = m_modelCacheFG.set(orderedModels);
break;
464 case CSimulatorInfo::MSFS: msg = m_modelCacheMsfs.set(orderedModels);
break;
465 case CSimulatorInfo::MSFS2024: msg = m_modelCacheMsfs2024.set(orderedModels);
break;
466 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
return CStatusMessage();
477 case CSimulatorInfo::FS9:
return m_modelCacheFs9.getAvailableTimestamp();
478 case CSimulatorInfo::FSX:
return m_modelCacheFsx.getAvailableTimestamp();
479 case CSimulatorInfo::P3D:
return m_modelCacheP3D.getAvailableTimestamp();
480 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.getAvailableTimestamp();
481 case CSimulatorInfo::FG:
return m_modelCacheFG.getAvailableTimestamp();
482 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.getAvailableTimestamp();
483 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.getAvailableTimestamp();
484 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
return QDateTime();
497 case CSimulatorInfo::FS9:
return m_modelCacheFs9.set(m_modelCacheFs9.get(), ts.toMSecsSinceEpoch());
498 case CSimulatorInfo::FSX:
return m_modelCacheFsx.set(m_modelCacheFsx.get(), ts.toMSecsSinceEpoch());
499 case CSimulatorInfo::P3D:
return m_modelCacheP3D.set(m_modelCacheP3D.get(), ts.toMSecsSinceEpoch());
500 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.set(m_modelCacheXP.get(), ts.toMSecsSinceEpoch());
501 case CSimulatorInfo::FG:
return m_modelCacheFG.set(m_modelCacheFG.get(), ts.toMSecsSinceEpoch());
502 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.set(m_modelCacheMsfs.get(), ts.toMSecsSinceEpoch());
503 case CSimulatorInfo::MSFS2024:
504 return m_modelCacheMsfs2024.set(m_modelCacheMsfs2024.get(), ts.toMSecsSinceEpoch());
505 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
break;
519 case CSimulatorInfo::FS9:
return m_modelCacheFs9.getFilename();
520 case CSimulatorInfo::FSX:
return m_modelCacheFsx.getFilename();
521 case CSimulatorInfo::P3D:
return m_modelCacheP3D.getFilename();
522 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.getFilename();
523 case CSimulatorInfo::FG:
return m_modelCacheFG.getFilename();
524 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.getFilename();
525 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.getFilename();
526 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
break;
536 case CSimulatorInfo::FS9:
return m_modelCacheFs9.isSaved();
537 case CSimulatorInfo::FSX:
return m_modelCacheFsx.isSaved();
538 case CSimulatorInfo::P3D:
return m_modelCacheP3D.isSaved();
539 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.isSaved();
540 case CSimulatorInfo::FG:
return m_modelCacheFG.isSaved();
541 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.isSaved();
542 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.isSaved();
543 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
break;
548 void CModelSetCaches::synchronizeCacheImpl(
const CSimulatorInfo &simulator)
555 case CSimulatorInfo::FS9: m_modelCacheFs9.synchronize();
break;
556 case CSimulatorInfo::FSX: m_modelCacheFsx.synchronize();
break;
557 case CSimulatorInfo::P3D: m_modelCacheP3D.synchronize();
break;
558 case CSimulatorInfo::XPLANE: m_modelCacheXP.synchronize();
break;
559 case CSimulatorInfo::FG: m_modelCacheFG.synchronize();
break;
560 case CSimulatorInfo::MSFS: m_modelCacheMsfs.synchronize();
break;
561 case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.synchronize();
break;
562 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
break;
568 bool CModelSetCaches::admitCacheImpl(
const CSimulatorInfo &simulator)
570 Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
573 switch (simulator.getSimulator())
575 case CSimulatorInfo::FS9: m_modelCacheFs9.admit();
break;
576 case CSimulatorInfo::FSX: m_modelCacheFsx.admit();
break;
577 case CSimulatorInfo::P3D: m_modelCacheP3D.admit();
break;
578 case CSimulatorInfo::XPLANE: m_modelCacheXP.admit();
break;
579 case CSimulatorInfo::FG: m_modelCacheFG.admit();
break;
580 case CSimulatorInfo::MSFS: m_modelCacheMsfs.admit();
break;
581 case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.admit();
break;
582 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
break;
Description of a swift application.
static bool hasOtherVersionCacheFile(const swift::misc::CApplicationInfo &info, const QString &myCacheFile)
Has the cache file for the given other version?
static const QString & modelSetCache()
Model set cache.
static const QString & modelCache()
Model cache.
Class for emitting a log message.
Derived & error(const char16_t(&format)[N])
Set the severity to error, providing a format string.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
size_type size() const
Returns number of elements in the sequence.
bool isEmpty() const
Synonym for empty.
Streamable status message, e.g.
void sortAscendingByOrder()
Sort ascending.
void resetOrder(int offset=0)
Set order member to current order.
bool needsOrder() const
All order values set or missing some?
QString toQString(bool i18n=false) const
Cast as QString.
@ TypeOwnSimulatorModel
represents own simulator model (AI model, model on disk)
Value object encapsulating a list of aircraft models.
int replaceOrAddModelsWithString(const CAircraftModelList &addOrReplaceList, Qt::CaseSensitivity sensitivity)
Replace or add based on model string.
int removeXPlaneFlyablePlanes()
Remove the XPlane flyable planes.
int setModelType(CAircraftModel::ModelType type)
Set type for all elements.
Simple hardcoded info about the corresponding simulator.
static const QSet< CSimulatorInfo > & allSimulatorsSet()
All simulators as set.
void addSimulator(Simulator s)
Add simulator flags.
CSimulatorInfo add(const CSimulatorInfo &other)
Add simulator.
QSet< CSimulatorInfo > asSingleSimulatorSet() const
As a set of single simulator info objects.
static const CSimulatorInfo & allSimulators()
All simulators.
bool isSingleSimulator() const
Single simulator selected.
static const CSimulatorInfo & guessDefaultSimulator()
Guess a default simulator based on installation.
Simulator getSimulator() const
Simulator.
static const CSimulatorInfo & msfs()
Const simulator info objects.
static const CSimulatorInfo & fs9()
Const simulator info objects.
static const CSimulatorInfo & fsx()
Const simulator info objects.
static const CSimulatorInfo & p3d()
Const simulator info objects.
static const CSimulatorInfo & xplane()
Const simulator info objects.
static const CSimulatorInfo & msfs2024()
Const simulator info objects.
bool isXPlane() const
XPlane.
static const CSimulatorInfo & fg()
Const simulator info objects.
CAircraftModelList getCachedModels(const CSimulatorInfo &simulator) const
Models for simulator.
CModelCaches(bool synchronizeCache, QObject *parent=nullptr)
Construtor.
QString getDescription() const
Descriptive text.
CStatusMessage setCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator)
Set cached models.
bool isSaved(const CSimulatorInfo &simulator) const
Cache saved?
void synchronizeCache(const CSimulatorInfo &simulator)
Synchronize for given simulator.
QDateTime getCacheTimestamp(const CSimulatorInfo &simulator) const
Cache timestamp.
void admitCache(const CSimulatorInfo &simulator)
Admit the cache for given simulator.
CStatusMessage setCacheTimestamp(const QDateTime &ts, const CSimulatorInfo &simulator)
Set cache timestamp.
static const QStringList & getLogCategories()
Log categories.
QString getFilename(const CSimulatorInfo &simulator) const
Get filename for simulator cache file.
void admitCache(const CSimulatorInfo &simulator)
Admit the cache for given simulator.
QString getDescription() const
Descriptive text.
QString getFilename(const CSimulatorInfo &simulator) const
Get filename for simulator cache file.
CModelSetCaches(bool synchronizeCache, QObject *parent=nullptr)
Construtor.
CStatusMessage setCacheTimestamp(const QDateTime &ts, const CSimulatorInfo &simulator)
Set cache timestamp.
CStatusMessage setCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator)
Set cached models.
bool isSaved(const CSimulatorInfo &simulator) const
Cache saved?
void synchronizeCache(const CSimulatorInfo &simulator)
Synchronize for given simulator.
static const QStringList & getLogCategories()
Log categories.
QDateTime getCacheTimestamp(const CSimulatorInfo &simulator) const
Cache timestamp.
CAircraftModelList getCachedModels(const CSimulatorInfo &simulator) const
Models for simulator.
Cache for multiple simulators specified by CSimulatorInfo.
CSimulatorInfo simulatorsWithInitializedCache() const
Initialized caches for which simulator?
virtual void gracefulShutdown()
Graceful shutdown.
CSimulatorInfo otherVersionSimulatorsWithFile(const swift::misc::CApplicationInfo &info) const
Simulators of given other versionwhich have a cache file.
CSimulatorInfo getSimulatorForFilename(const QString &filename) const
Simulator which uses cache with filename.
bool isCacheAlreadySynchronized(const CSimulatorInfo &simulator) const
Is the cache already synchronized?
QString getInfoString() const
Info string about models in cache.
virtual void synchronizeCache(const CSimulatorInfo &simulator)=0
Synchronize for given simulator.
int getCachedModelsCount(const CSimulatorInfo &simulator) const
Count of models for simulator.
virtual CStatusMessage clearCachedModels(const CSimulatorInfo &simulator)
Clear cached models.
bool hasOtherVersionFile(const swift::misc::CApplicationInfo &info, const CSimulatorInfo &simulator) const
Has the other version the file?
virtual CAircraftModelList getCachedModels(const CSimulatorInfo &simulator) const =0
Models for simulator.
CAircraftModelList getSynchronizedCachedModels(const CSimulatorInfo &simulator)
Models.
CSimulatorInfo simulatorsWithModels() const
Simulators which have models.
virtual CStatusMessage setCachedModels(const CAircraftModelList &models, const CSimulatorInfo &simulator)=0
Set cached models.
virtual QString getFilename(const CSimulatorInfo &simulator) const =0
Get filename for simulator cache file.
virtual void synchronizeMultiCaches(const CSimulatorInfo &simulator)
Synchronize multiple simulators.
void emitCacheChanged(const CSimulatorInfo &simulator)
Emit cacheChanged() utility function (allows breakpoint)
QString getCacheCountAndTimestamp(const CSimulatorInfo &simulator) const
Cache count and timestamp.
virtual QStringList getAllFilenames() const
All file names.
void cacheChanged(const swift::misc::simulation::CSimulatorInfo &simulator)
Cache has been changed.
void setModelsForSimulator(const CAircraftModelList &models, const CSimulatorInfo &simulator)
Set models.
void markCacheAsAlreadySynchronized(const CSimulatorInfo &simulator, bool synchronized)
Is the cache already synchronized?
QDateTime getSynchronizedTimestamp(const CSimulatorInfo &simulator)
Timestamp.
virtual void admitMultiCaches(const CSimulatorInfo &simulator)
Synchronize multiple simulators.
QString getInfoStringFsFamily() const
Info string without XPlane (FSX,P3D, FS9)
virtual QDateTime getCacheTimestamp(const CSimulatorInfo &simulator) const =0
Cache timestamp.
int updateModelsForSimulator(const CAircraftModelList &models, const CSimulatorInfo &simulator)
Set models.
Free functions in swift::misc.
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.