diff --git a/src/blackmisc/simulation/data/modelcaches.cpp b/src/blackmisc/simulation/data/modelcaches.cpp index b30f74d2f..4ab97592f 100644 --- a/src/blackmisc/simulation/data/modelcaches.cpp +++ b/src/blackmisc/simulation/data/modelcaches.cpp @@ -10,7 +10,6 @@ #include "blackmisc/logmessage.h" #include "blackmisc/verify.h" #include "blackmisc/simulation/data/modelcaches.h" - #include using namespace BlackMisc; @@ -48,6 +47,25 @@ namespace BlackMisc return this->getCachedModels(simulator).size(); } + CSimulatorInfo IMultiSimulatorModelCaches::getSimulatorForFilename(const QString &filename) const + { + if (filename.isEmpty()) return CSimulatorInfo(); + CSimulatorInfo sims; + const QString compareFileName(QFileInfo(filename).fileName()); + for (const CSimulatorInfo &singleSim : CSimulatorInfo::allSimulatorsSet()) + { + const QString singleSimFile(getFilename(singleSim)); + if (singleSimFile.isEmpty()) continue; + const QString singleSimFileName(QFileInfo(singleSimFile).fileName()); + if (singleSimFileName == compareFileName) + { + sims.add(singleSim); + break; + } + } + return sims; + } + CAircraftModelList IMultiSimulatorModelCaches::getSynchronizedCachedModels(const CSimulatorInfo &simulator) { BLACK_VERIFY_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "need single simulator"); @@ -185,6 +203,23 @@ namespace BlackMisc } } + CStatusMessage CModelCaches::setCacheTimestamp(const QDateTime &ts, const CSimulatorInfo &simulator) + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + if (!ts.isValid()) { return CStatusMessage(this).error("Invalid timestamp for '%1'") << simulator.toQString() ; } + switch (simulator.getSimulator()) + { + case CSimulatorInfo::FS9: return this->m_modelCacheFs9.set(m_modelCacheFs9.get(), ts.toMSecsSinceEpoch()); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.set(m_modelCacheFsx.get(), ts.toMSecsSinceEpoch()); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.set(m_modelCacheP3D.get(), ts.toMSecsSinceEpoch()); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.set(m_modelCacheXP.get(), ts.toMSecsSinceEpoch()); + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + break; + } + return CStatusMessage(); + } + void CModelCaches::synchronizeCache(const CSimulatorInfo &simulator) { this->synchronizeCacheImpl(simulator); @@ -205,6 +240,38 @@ namespace BlackMisc return m; } + QString CModelCaches::getFilename(const CSimulatorInfo &simulator) const + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + switch (simulator.getSimulator()) + { + case CSimulatorInfo::FS9: return this->m_modelCacheFs9.getFilename(); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.getFilename(); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.getFilename(); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.getFilename(); + default: + Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); + break; + } + return {}; + } + + bool CModelCaches::isSaved(const CSimulatorInfo &simulator) const + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + switch (simulator.getSimulator()) + { + case CSimulatorInfo::FS9: return this->m_modelCacheFs9.isSaved(); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.isSaved(); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.isSaved(); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.isSaved(); + default: + Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); + break; + } + return false; + } + void CModelCaches::synchronizeCacheImpl(const CSimulatorInfo &simulator) { Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); @@ -320,6 +387,23 @@ namespace BlackMisc } } + CStatusMessage CModelSetCaches::setCacheTimestamp(const QDateTime &ts, const CSimulatorInfo &simulator) + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + if (!ts.isValid()) { return CStatusMessage(this).error("Invalid timestamp for '%1'") << simulator.toQString() ; } + switch (simulator.getSimulator()) + { + case CSimulatorInfo::FS9: return this->m_modelCacheFs9.set(m_modelCacheFs9.get(), ts.toMSecsSinceEpoch()); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.set(m_modelCacheFsx.get(), ts.toMSecsSinceEpoch()); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.set(m_modelCacheP3D.get(), ts.toMSecsSinceEpoch()); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.set(m_modelCacheXP.get(), ts.toMSecsSinceEpoch()); + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + break; + } + return CStatusMessage(); + } + void CModelSetCaches::synchronizeCache(const CSimulatorInfo &simulator) { this->synchronizeCacheImpl(simulator); @@ -340,6 +424,38 @@ namespace BlackMisc return m; } + QString CModelSetCaches::getFilename(const CSimulatorInfo &simulator) const + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + switch (simulator.getSimulator()) + { + case CSimulatorInfo::FS9: return this->m_modelCacheFs9.getFilename(); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.getFilename(); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.getFilename(); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.getFilename(); + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + break; + } + return {}; + } + + bool CModelSetCaches::isSaved(const CSimulatorInfo &simulator) const + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + switch (simulator.getSimulator()) + { + case CSimulatorInfo::FS9: return this->m_modelCacheFs9.isSaved(); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.isSaved(); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.isSaved(); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.isSaved(); + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + break; + } + return false; + } + void CModelSetCaches::synchronizeCacheImpl(const CSimulatorInfo &simulator) { Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); diff --git a/src/blackmisc/simulation/data/modelcaches.h b/src/blackmisc/simulation/data/modelcaches.h index b514f7288..72b7742df 100644 --- a/src/blackmisc/simulation/data/modelcaches.h +++ b/src/blackmisc/simulation/data/modelcaches.h @@ -147,6 +147,12 @@ namespace BlackMisc //! Count of models for simulator int getCachedModelsCount(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; + //! Get filename for simulator cache file + virtual QString getFilename(const BlackMisc::Simulation::CSimulatorInfo &simulator) const = 0; + + //! Simulator which uses cache with filename + BlackMisc::Simulation::CSimulatorInfo getSimulatorForFilename(const QString &filename) const; + //! Models CAircraftModelList getSynchronizedCachedModels(const BlackMisc::Simulation::CSimulatorInfo &simulator); @@ -158,6 +164,13 @@ namespace BlackMisc //! \threadsafe virtual QDateTime getCacheTimestamp(const BlackMisc::Simulation::CSimulatorInfo &simulator) const = 0; + //! Set cache timestamp + virtual BlackMisc::CStatusMessage setCacheTimestamp(const QDateTime &ts, const BlackMisc::Simulation::CSimulatorInfo &simulator) = 0; + + //! Cache saved? + //! \threadsafe + virtual bool isSaved(const BlackMisc::Simulation::CSimulatorInfo &simulator) const = 0; + //! Initialized caches for which simulator? //! \threadsafe BlackMisc::Simulation::CSimulatorInfo simulatorsWithInitializedCache() const; @@ -242,10 +255,13 @@ namespace BlackMisc virtual CAircraftModelList getCachedModels(const BlackMisc::Simulation::CSimulatorInfo &simulator) const override; virtual BlackMisc::CStatusMessage setCachedModels(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator) override; virtual QDateTime getCacheTimestamp(const BlackMisc::Simulation::CSimulatorInfo &simulator) const override; + virtual CStatusMessage setCacheTimestamp(const QDateTime &ts, const CSimulatorInfo &simulator) override; virtual void synchronizeCache(const BlackMisc::Simulation::CSimulatorInfo &simulator) override; virtual void admitCache(const BlackMisc::Simulation::CSimulatorInfo &simulator) override; virtual BlackMisc::Simulation::CSimulatorInfo getCurrentSimulator() const override { return this->m_currentSimulator.get(); } virtual BlackMisc::CStatusMessage setCurrentSimulator(const BlackMisc::Simulation::CSimulatorInfo &simulator) override; + virtual QString getFilename(const BlackMisc::Simulation::CSimulatorInfo &simulator) const override; + virtual bool isSaved(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; //! @} private: @@ -281,10 +297,13 @@ namespace BlackMisc virtual CAircraftModelList getCachedModels(const BlackMisc::Simulation::CSimulatorInfo &simulator) const override; virtual BlackMisc::CStatusMessage setCachedModels(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator) override; virtual QDateTime getCacheTimestamp(const BlackMisc::Simulation::CSimulatorInfo &simulator) const override; + virtual CStatusMessage setCacheTimestamp(const QDateTime &ts, const CSimulatorInfo &simulator) override; virtual void synchronizeCache(const BlackMisc::Simulation::CSimulatorInfo &simulator) override; virtual void admitCache(const BlackMisc::Simulation::CSimulatorInfo &simulator) override; virtual BlackMisc::Simulation::CSimulatorInfo getCurrentSimulator() const override { return this->m_currentSimulator.get(); } virtual BlackMisc::CStatusMessage setCurrentSimulator(const BlackMisc::Simulation::CSimulatorInfo &simulator) override; + virtual QString getFilename(const BlackMisc::Simulation::CSimulatorInfo &simulator) const override; + virtual bool isSaved(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; //! @} private: diff --git a/src/blackmisc/simulation/simulatorinfo.cpp b/src/blackmisc/simulation/simulatorinfo.cpp index 21416ecf6..031f39491 100644 --- a/src/blackmisc/simulation/simulatorinfo.cpp +++ b/src/blackmisc/simulation/simulatorinfo.cpp @@ -216,6 +216,12 @@ namespace BlackMisc return s; } + const QSet &CSimulatorInfo::allSimulatorsSet() + { + static const QSet all(allSimulators().asSingleSimulatorSet()); + return all; + } + const CSimulatorInfo &CSimulatorInfo::allFsFamilySimulators() { static const CSimulatorInfo s(CSimulatorInfo::AllFsFamily); diff --git a/src/blackmisc/simulation/simulatorinfo.h b/src/blackmisc/simulation/simulatorinfo.h index d8b2d0157..59b08d0cb 100644 --- a/src/blackmisc/simulation/simulatorinfo.h +++ b/src/blackmisc/simulation/simulatorinfo.h @@ -162,6 +162,9 @@ namespace BlackMisc //! All simulators static const CSimulatorInfo &allSimulators(); + //! All simulators as set + static const QSet &allSimulatorsSet(); + //! All simulators of the FS family (P3D FSX, FS9) static const CSimulatorInfo &allFsFamilySimulators();