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(
"P3D: %1 XP: %2 FG: %3");
43 static const QString is(
"P3D: %1, MSFS: %2, MSFS2024: %3");
51 static const QString s(
"%1 models, ts: %2");
66 case CSimulatorInfo::P3D: m_syncP3D =
synchronized;
break;
67 case CSimulatorInfo::XPLANE: m_syncXPlane =
synchronized;
break;
68 case CSimulatorInfo::FG: m_syncFG =
synchronized;
break;
69 case CSimulatorInfo::MSFS: m_syncMsfs =
synchronized;
break;
70 case CSimulatorInfo::MSFS2024: m_syncMsfs2024 =
synchronized;
break;
71 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
119 if (filename.
isEmpty()) {
return {}; }
125 if (singleSimFile.
isEmpty())
continue;
127 if (singleSimFileName == compareFileName)
157 if (ts.
isValid() && ts > outdated) { withInitializedCache.
add(simInfo); }
159 return withInitializedCache;
178 this->synchronizeCacheImpl(sim);
183 if (this->admitCacheImpl(sim))
201 case CSimulatorInfo::P3D:
return m_modelCacheP3D.get();
202 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.get();
203 case CSimulatorInfo::FG:
return m_modelCacheFG.get();
204 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.get();
205 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.get();
206 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
return {};
219 case CSimulatorInfo::P3D: msg = m_modelCacheP3D.set(setModels);
break;
220 case CSimulatorInfo::XPLANE: msg = m_modelCacheXP.set(setModels);
break;
221 case CSimulatorInfo::FG: msg = m_modelCacheFG.set(setModels);
break;
222 case CSimulatorInfo::MSFS: msg = m_modelCacheMsfs.set(setModels);
break;
223 case CSimulatorInfo::MSFS2024: msg = m_modelCacheMsfs2024.set(setModels);
break;
224 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
return {};
241 case CSimulatorInfo::P3D:
return m_syncP3D;
242 case CSimulatorInfo::XPLANE:
return m_syncXPlane;
243 case CSimulatorInfo::FG:
return m_syncFG;
244 case CSimulatorInfo::MSFS:
return m_syncMsfs;
245 case CSimulatorInfo::MSFS2024:
return m_syncMsfs2024;
246 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
272 case CSimulatorInfo::P3D:
return m_modelCacheP3D.getAvailableTimestamp();
273 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.getAvailableTimestamp();
274 case CSimulatorInfo::FG:
return m_modelCacheFG.getAvailableTimestamp();
275 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.getAvailableTimestamp();
276 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.getAvailableTimestamp();
277 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
return {};
290 case CSimulatorInfo::P3D:
return m_modelCacheP3D.set(m_modelCacheP3D.get(), ts.
toMSecsSinceEpoch());
291 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.set(m_modelCacheXP.get(), ts.
toMSecsSinceEpoch());
292 case CSimulatorInfo::FG:
return m_modelCacheFG.set(m_modelCacheFG.get(), ts.
toMSecsSinceEpoch());
293 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.set(m_modelCacheMsfs.get(), ts.
toMSecsSinceEpoch());
294 case CSimulatorInfo::MSFS2024:
295 return m_modelCacheMsfs2024.set(m_modelCacheMsfs2024.get(), ts.
toMSecsSinceEpoch());
296 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
break;
310 case CSimulatorInfo::P3D:
return m_modelCacheP3D.getFilename();
311 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.getFilename();
312 case CSimulatorInfo::FG:
return m_modelCacheFG.getFilename();
313 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.getFilename();
314 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.getFilename();
315 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
325 case CSimulatorInfo::P3D:
return m_modelCacheP3D.isSaved();
326 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.isSaved();
327 case CSimulatorInfo::FG:
return m_modelCacheFG.isSaved();
328 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.isSaved();
329 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.isSaved();
330 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
335 void CModelCaches::synchronizeCacheImpl(
const CSimulatorInfo &simulator)
342 case CSimulatorInfo::P3D: m_modelCacheP3D.synchronize();
break;
343 case CSimulatorInfo::XPLANE: m_modelCacheXP.synchronize();
break;
344 case CSimulatorInfo::FG: m_modelCacheFG.synchronize();
break;
345 case CSimulatorInfo::MSFS: m_modelCacheMsfs.synchronize();
break;
346 case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.synchronize();
break;
347 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
353 bool CModelCaches::admitCacheImpl(
const CSimulatorInfo &simulator)
355 Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
358 switch (simulator.getSimulator())
360 case CSimulatorInfo::P3D: m_modelCacheP3D.admit();
break;
361 case CSimulatorInfo::XPLANE: m_modelCacheXP.admit();
break;
362 case CSimulatorInfo::FG: m_modelCacheFG.admit();
break;
363 case CSimulatorInfo::MSFS: m_modelCacheMsfs.admit();
break;
364 case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.admit();
break;
365 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
break;
377 this->synchronizeCacheImpl(simulator);
382 if (this->admitCacheImpl(simulator))
400 case CSimulatorInfo::P3D:
return m_modelCacheP3D.get();
401 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.get();
402 case CSimulatorInfo::FG:
return m_modelCacheFG.get();
403 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.get();
404 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.get();
405 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
return {};
420 if (removed > 0) {
CLogMessage(
this).
info(u
"Removed %1 flyable models from XPlane model set!"); }
429 case CSimulatorInfo::P3D: msg = m_modelCacheP3D.set(orderedModels);
break;
430 case CSimulatorInfo::XPLANE: msg = m_modelCacheXP.set(orderedModels);
break;
431 case CSimulatorInfo::FG: msg = m_modelCacheFG.set(orderedModels);
break;
432 case CSimulatorInfo::MSFS: msg = m_modelCacheMsfs.set(orderedModels);
break;
433 case CSimulatorInfo::MSFS2024: msg = m_modelCacheMsfs2024.set(orderedModels);
break;
434 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong simulator");
return {};
445 case CSimulatorInfo::P3D:
return m_modelCacheP3D.getAvailableTimestamp();
446 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.getAvailableTimestamp();
447 case CSimulatorInfo::FG:
return m_modelCacheFG.getAvailableTimestamp();
448 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.getAvailableTimestamp();
449 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.getAvailableTimestamp();
450 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
return {};
463 case CSimulatorInfo::P3D:
return m_modelCacheP3D.set(m_modelCacheP3D.get(), ts.
toMSecsSinceEpoch());
464 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.set(m_modelCacheXP.get(), ts.
toMSecsSinceEpoch());
465 case CSimulatorInfo::FG:
return m_modelCacheFG.set(m_modelCacheFG.get(), ts.
toMSecsSinceEpoch());
466 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.set(m_modelCacheMsfs.get(), ts.
toMSecsSinceEpoch());
467 case CSimulatorInfo::MSFS2024:
468 return m_modelCacheMsfs2024.set(m_modelCacheMsfs2024.get(), ts.
toMSecsSinceEpoch());
469 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
break;
483 case CSimulatorInfo::P3D:
return m_modelCacheP3D.getFilename();
484 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.getFilename();
485 case CSimulatorInfo::FG:
return m_modelCacheFG.getFilename();
486 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.getFilename();
487 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.getFilename();
488 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
break;
498 case CSimulatorInfo::P3D:
return m_modelCacheP3D.isSaved();
499 case CSimulatorInfo::XPLANE:
return m_modelCacheXP.isSaved();
500 case CSimulatorInfo::FG:
return m_modelCacheFG.isSaved();
501 case CSimulatorInfo::MSFS:
return m_modelCacheMsfs.isSaved();
502 case CSimulatorInfo::MSFS2024:
return m_modelCacheMsfs2024.isSaved();
503 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
break;
508 void CModelSetCaches::synchronizeCacheImpl(
const CSimulatorInfo &simulator)
515 case CSimulatorInfo::P3D: m_modelCacheP3D.synchronize();
break;
516 case CSimulatorInfo::XPLANE: m_modelCacheXP.synchronize();
break;
517 case CSimulatorInfo::FG: m_modelCacheFG.synchronize();
break;
518 case CSimulatorInfo::MSFS: m_modelCacheMsfs.synchronize();
break;
519 case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.synchronize();
break;
520 default: Q_ASSERT_X(
false, Q_FUNC_INFO,
"Wrong simulator");
break;
526 bool CModelSetCaches::admitCacheImpl(
const CSimulatorInfo &simulator)
528 Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO,
"No single simulator");
531 switch (simulator.getSimulator())
533 case CSimulatorInfo::P3D: m_modelCacheP3D.admit();
break;
534 case CSimulatorInfo::XPLANE: m_modelCacheXP.admit();
break;
535 case CSimulatorInfo::FG: m_modelCacheFG.admit();
break;
536 case CSimulatorInfo::MSFS: m_modelCacheMsfs.admit();
break;
537 case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.admit();
break;
538 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 & 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.
QDateTime addDays(qint64 ndays) const const
QDateTime currentDateTimeUtc()
bool isValid() const const
qint64 toMSecsSinceEpoch() const const
QString arg(Args &&... args) const const
bool isEmpty() const const
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.