diff --git a/src/blackcore/data/aircraftmodels.h b/src/blackcore/data/aircraftmodels.h deleted file mode 100644 index 25ddd7f3b..000000000 --- a/src/blackcore/data/aircraftmodels.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2015 - * swift project community / contributors - * - * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level - * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, - * including this file, may be copied, modified, propagated, or distributed except according to the terms - * contained in the LICENSE file. - */ - -//! \file - -#ifndef BLACKCORE_DATA_AIRCRAFTMODELS_H -#define BLACKCORE_DATA_AIRCRAFTMODELS_H - -#include "blackcore/blackcoreexport.h" -#include "blackmisc/datacache.h" -#include "blackmisc/simulation/aircraftmodellist.h" -#include "blackmisc/variant.h" - -namespace BlackCore -{ - namespace Data - { - //! Trait for own simulator models - struct OwnSimulatorAircraftModels : public BlackMisc::CDataTrait - { - //! Key in data cache - static const char *key() { return "simulator/models"; } - - //! Default value - static const BlackMisc::Simulation::CAircraftModelList &defaultValue() - { - static const BlackMisc::Simulation::CAircraftModelList defaultValue; - return defaultValue; - } - }; - - //! Trait for vPilot derived models - struct VPilotAircraftModels : public BlackMisc::CDataTrait - { - //! Key in data cache - static const char *key() { return "vpilot/models"; } - - //! Default value - static const BlackMisc::Simulation::CAircraftModelList &defaultValue() - { - static const BlackMisc::Simulation::CAircraftModelList defaultValue; - return defaultValue; - } - }; - - } // ns -} // ns - -#endif // guard diff --git a/src/blackcore/modeldatareader.cpp b/src/blackcore/modeldatareader.cpp index da277c299..979655a3c 100644 --- a/src/blackcore/modeldatareader.cpp +++ b/src/blackcore/modeldatareader.cpp @@ -82,7 +82,7 @@ namespace BlackCore { if (modelString.isEmpty()) { return CAircraftModel(); } CAircraftModelList models(getModels()); - return models.findFirstByModelString(modelString); + return models.findFirstByModelStringOrDefault(modelString); } CAircraftModelList CModelDataReader::getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) diff --git a/src/blackmisc/blackmisc.pro b/src/blackmisc/blackmisc.pro index a67e8fd74..5eff8524d 100644 --- a/src/blackmisc/blackmisc.pro +++ b/src/blackmisc/blackmisc.pro @@ -55,7 +55,7 @@ SOURCES += *.cpp \ $$PWD/simulation/fscommon/*.cpp \ $$PWD/simulation/fsx/*.cpp \ $$PWD/simulation/xplane/*.cpp \ -# $$PWD/simulation/data/*.cpp \ + $$PWD/simulation/data/*.cpp \ $$PWD/weather/*.cpp win32 { diff --git a/src/blackmisc/simulation/aircraftmatcher.cpp b/src/blackmisc/simulation/aircraftmatcher.cpp index 8785a6acb..b4b68321e 100644 --- a/src/blackmisc/simulation/aircraftmatcher.cpp +++ b/src/blackmisc/simulation/aircraftmatcher.cpp @@ -197,7 +197,7 @@ namespace BlackMisc CAircraftModel CAircraftMatcher::matchByExactModelName(const CSimulatedAircraft &remoteAircraft) { - return this->m_installedModels.findFirstByModelString(remoteAircraft.getModelString()); + return this->m_installedModels.findFirstByModelStringOrDefault(remoteAircraft.getModelString()); } CAircraftModel CAircraftMatcher::matchInstalledModelsByIcaoData(const CSimulatedAircraft &remoteAircraft) diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index 4fe81be8e..925bbbe7b 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -50,7 +50,7 @@ namespace BlackMisc }); } - CAircraftModel CAircraftModelList::findFirstByModelString(const QString &modelString, Qt::CaseSensitivity sensitivity) const + CAircraftModel CAircraftModelList::findFirstByModelStringOrDefault(const QString &modelString, Qt::CaseSensitivity sensitivity) const { return this->findFirstByOrDefault([ = ](const CAircraftModel & model) { diff --git a/src/blackmisc/simulation/aircraftmodellist.h b/src/blackmisc/simulation/aircraftmodellist.h index db2123d71..ec8406eb8 100644 --- a/src/blackmisc/simulation/aircraftmodellist.h +++ b/src/blackmisc/simulation/aircraftmodellist.h @@ -49,7 +49,7 @@ namespace BlackMisc CAircraftModelList findByModelString(const QString &modelString, Qt::CaseSensitivity sensitivity = Qt::CaseInsensitive) const; //! Find first by model string - CAircraftModel findFirstByModelString(const QString &modelString, Qt::CaseSensitivity sensitivity = Qt::CaseInsensitive) const; + CAircraftModel findFirstByModelStringOrDefault(const QString &modelString, Qt::CaseSensitivity sensitivity = Qt::CaseInsensitive) const; //! Find models starting with CAircraftModelList findModelsStartingWith(const QString &modelString, Qt::CaseSensitivity sensitivity = Qt::CaseInsensitive) const; diff --git a/src/blackmisc/simulation/aircraftmodelloader.cpp b/src/blackmisc/simulation/aircraftmodelloader.cpp index b58dcef5d..b8ba7c0c0 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.cpp +++ b/src/blackmisc/simulation/aircraftmodelloader.cpp @@ -22,6 +22,7 @@ namespace BlackMisc IAircraftModelLoader::IAircraftModelLoader(const CSimulatorInfo &info, const QString &rootDirectory, const QStringList &excludeDirs) : m_simulatorInfo(info), m_rootDirectory(rootDirectory), m_excludedDirectories(excludeDirs) { + Q_ASSERT_X(info.isSingleSimulator(), Q_FUNC_INFO, "Only one simulator per loader"); connect(this, &IAircraftModelLoader::loadingFinished, this, &IAircraftModelLoader::ps_loadFinished); } @@ -34,7 +35,7 @@ namespace BlackMisc { if (directory.isEmpty()) { return false; } QDir dir(directory); - //! \todo not available network dir can make this hang here + //! \todo not available network dir can make this hang here, however there is no obvious solution to that return dir.exists(); } @@ -44,7 +45,7 @@ namespace BlackMisc for (CAircraftModel &simModel : modelsFromSimulator) { if (simModel.hasValidDbKey()) { continue; } // already done - CAircraftModel dbModel(dbModels.findFirstByModelString(simModel.getModelString())); + CAircraftModel dbModel(dbModels.findFirstByModelStringOrDefault(simModel.getModelString())); if (!dbModel.hasValidDbKey()) { continue; // not found @@ -70,6 +71,36 @@ namespace BlackMisc return true; } + CAircraftModelList IAircraftModelLoader::getAircraftModels() const + { + return this->m_caches.getModels(this->m_simulatorInfo); + } + + QDateTime IAircraftModelLoader::getCacheTimestamp() const + { + return this->m_caches.getCacheTimestamp(this->m_simulatorInfo); + } + + void IAircraftModelLoader::syncronizeCache() + { + return this->m_caches.syncronize(this->m_simulatorInfo); + } + + bool IAircraftModelLoader::hasCachedData() const + { + return !this->m_caches.getModels(this->m_simulatorInfo).isEmpty(); + } + + CStatusMessage IAircraftModelLoader::setModelsInCache(const CAircraftModelList &models) + { + return this->m_caches.setModels(models, this->m_simulatorInfo); + } + + CStatusMessage IAircraftModelLoader::clearCache() + { + return this->setModelsInCache(CAircraftModelList()); + } + void IAircraftModelLoader::startLoading(LoadMode mode, const CAircraftModelList &dbModels) { if (this->m_loadingInProgress) { return; } @@ -98,19 +129,19 @@ namespace BlackMisc this->startLoadingFromDisk(mode, dbModels); } - const CSimulatorInfo &IAircraftModelLoader::supportedSimulators() const + const CSimulatorInfo &IAircraftModelLoader::getSimulator() const { return m_simulatorInfo; } - QString IAircraftModelLoader::supportedSimulatorsAsString() const + QString IAircraftModelLoader::getSimulatorAsString() const { return m_simulatorInfo.toQString(); } bool IAircraftModelLoader::supportsSimulator(const CSimulatorInfo &info) { - return supportedSimulators().matchesAny(info); + return getSimulator().matchesAny(info); } void IAircraftModelLoader::cancelLoading() @@ -126,16 +157,20 @@ namespace BlackMisc std::unique_ptr IAircraftModelLoader::createModelLoader(const CSimulatorInfo &simInfo) { + std::unique_ptr loader; if (simInfo.xplane()) { - return std::make_unique( + loader = std::make_unique( CSimulatorInfo(CSimulatorInfo::XPLANE), CXPlaneUtil::xplaneRootDir()); } else { - return CAircraftCfgParser::createModelLoader(simInfo); + loader = CAircraftCfgParser::createModelLoader(simInfo); } + // make sure the cache is really available + loader->syncronizeCache(); + return loader; } } // ns } // ns diff --git a/src/blackmisc/simulation/aircraftmodelloader.h b/src/blackmisc/simulation/aircraftmodelloader.h index 73b514845..75b2bfa76 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.h +++ b/src/blackmisc/simulation/aircraftmodelloader.h @@ -65,28 +65,22 @@ namespace BlackMisc virtual bool isLoadingFinished() const = 0; //! The loaded models - virtual const BlackMisc::Simulation::CAircraftModelList &getAircraftModels() const = 0; + BlackMisc::Simulation::CAircraftModelList getAircraftModels() const; //! Count of loaded models - const int getAircraftModelsCount() const { return getAircraftModels().size(); } - - //! Cache timestamp - virtual QDateTime getCacheTimestamp() const = 0; + int getAircraftModelsCount() const { return getAircraftModels().size(); } //! Model files updated? virtual bool areModelFilesUpdated() const = 0; - //! Any cached data - virtual bool hasCachedData() const = 0; - //! A representive pixmap for given model virtual BlackMisc::CPixmap iconForModel(const QString &modelName, BlackMisc::CStatusMessage &statusMessage) const = 0; - //! Which simulators are supported by that very loader - const BlackMisc::Simulation::CSimulatorInfo &supportedSimulators() const; + //! Which simulator is supported by that very loader + const BlackMisc::Simulation::CSimulatorInfo &getSimulator() const; //! Supported simulators as string - QString supportedSimulatorsAsString() const; + QString getSimulatorAsString() const; //! Is the given simulator supported? bool supportsSimulator(const BlackMisc::Simulation::CSimulatorInfo &info); @@ -100,6 +94,9 @@ namespace BlackMisc //! Create a loader static std::unique_ptr createModelLoader(const BlackMisc::Simulation::CSimulatorInfo &simInfo); + //! Merge with DB data if possible + static bool mergeWithDbData(BlackMisc::Simulation::CAircraftModelList &modelsFromSimulator, const BlackMisc::Simulation::CAircraftModelList &dbModels); + signals: //! Parsing is finished void loadingFinished(bool success, const BlackMisc::Simulation::CSimulatorInfo &simulator); @@ -108,20 +105,33 @@ namespace BlackMisc //! Constructor IAircraftModelLoader(const CSimulatorInfo &info, const QString &rootDirectory, const QStringList &excludeDirs = {}); + //! Cache timestamp + QDateTime getCacheTimestamp() const; + + //! Make sure cache is syncronized + void syncronizeCache(); + + //! Any cached data? + bool hasCachedData() const; + + //! Set models in cache + BlackMisc::CStatusMessage setModelsInCache(const BlackMisc::Simulation::CAircraftModelList &models); + + //! Clear cache + BlackMisc::CStatusMessage clearCache(); + //! Check if directory exists bool existsDir(const QString &directory) const; //! Start the loading process from disk virtual void startLoadingFromDisk(LoadMode mode, const BlackMisc::Simulation::CAircraftModelList &dbModels) = 0; - //! Merge with DB data if possible - virtual bool mergeWithDbData(BlackMisc::Simulation::CAircraftModelList &modelsFromSimulator, const BlackMisc::Simulation::CAircraftModelList &dbModels); - - BlackMisc::Simulation::CSimulatorInfo m_simulatorInfo; //!< Corresponding simulator - std::atomic m_cancelLoading { false }; //!< flag - std::atomic m_loadingInProgress { false }; //!< Loading in progress - QString m_rootDirectory; //!< root directory parsing aircraft.cfg files - QStringList m_excludedDirectories; //!< directories not to be parsed + BlackMisc::Simulation::CSimulatorInfo m_simulatorInfo; //!< Corresponding simulator + std::atomic m_cancelLoading { false }; //!< flag + std::atomic m_loadingInProgress { false }; //!< Loading in progress + QString m_rootDirectory; //!< root directory parsing aircraft.cfg files + QStringList m_excludedDirectories; //!< directories not to be parsed + BlackMisc::Simulation::Data::CModelCaches m_caches { this }; //!< caches protected slots: //! Loading finished diff --git a/src/blackmisc/simulation/data/modelcaches.cpp b/src/blackmisc/simulation/data/modelcaches.cpp new file mode 100644 index 000000000..3c5d01aa8 --- /dev/null +++ b/src/blackmisc/simulation/data/modelcaches.cpp @@ -0,0 +1,144 @@ +/* Copyright (C) 2016 + * swift project community / contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "modelcaches.h" + +namespace BlackMisc +{ + namespace Simulation + { + namespace Data + { + CModelCaches::CModelCaches(QObject *parent) : QObject(parent) + { } + + CAircraftModelList CModelCaches::getModels(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.get(); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.get(); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.get(); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.get(); + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + return CAircraftModelList(); + } + } + + CStatusMessage CModelCaches::setModels(const CAircraftModelList &models, const CSimulatorInfo &simulator) + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + switch (simulator.getSimulator()) + { + case CSimulatorInfo::FS9: return this->m_modelCacheFs9.set(models); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.set(models); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.set(models); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.set(models); + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + return CStatusMessage(); + } + } + + QDateTime CModelCaches::getCacheTimestamp(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.getTimestamp(); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.getTimestamp(); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.getTimestamp(); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.getTimestamp(); + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + return QDateTime(); + } + } + + void CModelCaches::syncronize(const CSimulatorInfo &simulator) + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + switch (simulator.getSimulator()) + { + case CSimulatorInfo::FS9: return this->m_modelCacheFs9.synchronize(); break; + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.synchronize(); break; + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.synchronize(); break; + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.synchronize(); break; + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + } + } + + CModelSetCaches::CModelSetCaches(QObject *parent) : QObject(parent) + { } + + CAircraftModelList CModelSetCaches::getModels(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.get(); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.get(); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.get(); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.get(); + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + return CAircraftModelList(); + } + } + + CStatusMessage CModelSetCaches::setModels(const CAircraftModelList &models, const CSimulatorInfo &simulator) + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + switch (simulator.getSimulator()) + { + case CSimulatorInfo::FS9: return this->m_modelCacheFs9.set(models); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.set(models); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.set(models); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.set(models); + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + return CStatusMessage(); + } + } + + QDateTime CModelSetCaches::getCacheTimestamp(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.getTimestamp(); + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.getTimestamp(); + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.getTimestamp(); + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.getTimestamp(); + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + return QDateTime(); + } + } + + void CModelSetCaches::syncronize(const CSimulatorInfo &simulator) + { + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + switch (simulator.getSimulator()) + { + case CSimulatorInfo::FS9: return this->m_modelCacheFs9.synchronize(); break; + case CSimulatorInfo::FSX: return this->m_modelCacheFsx.synchronize(); break; + case CSimulatorInfo::P3D: return this->m_modelCacheP3D.synchronize(); break; + case CSimulatorInfo::XPLANE: return this->m_modelCacheXP.synchronize(); break; + default: + Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); + } + } + + } // ns + } // ns +} // ns diff --git a/src/blackmisc/simulation/data/modelcaches.h b/src/blackmisc/simulation/data/modelcaches.h index 0c9c1d73e..3f100681b 100644 --- a/src/blackmisc/simulation/data/modelcaches.h +++ b/src/blackmisc/simulation/data/modelcaches.h @@ -32,33 +32,137 @@ namespace BlackMisc } }; - //! Trait for XP model cache + //! \name Caches for own models on disk, loaded by BlackMisc::Simulation::IAircraftModelLoader + //! @{ + + //! XPlane struct ModelCacheXP : public ModelCache { //! Key in data cache static const char *key() { return "modelcachexp"; } }; - //! Trait for FSX model cache + //! FSX struct ModelCacheFsx : public ModelCache { //! Key in data cache static const char *key() { return "modelcachefsx"; } }; - //! Trait for FS9 model cache + //! FS9 struct ModelCacheFs9 : public ModelCache { //! Key in data cache static const char *key() { return "modelcachefs9"; } }; - //! Trait for P3D model cache + //! P3D struct ModelCacheP3D : public ModelCache { //! Key in data cache static const char *key() { return "modelcachep3d"; } }; + //! @} + + + //! \name Caches for choosen model sets + //! @{ + + //! XPlane + struct ModelSetCacheXP : public ModelCache + { + //! Key in data cache + static const char *key() { return "modelsetxp"; } + }; + + //! FSX + struct ModelSetCacheFsx : public ModelCache + { + //! Key in data cache + static const char *key() { return "modelsetfsx"; } + }; + + //! FS9 + struct ModelSetCacheFs9 : public ModelCache + { + //! Key in data cache + static const char *key() { return "modelsetfs9"; } + }; + + //! P3D + struct ModelSetCacheP3D : public ModelCache + { + //! Key in data cache + static const char *key() { return "modelsetp3d"; } + }; + //! @} + + + //! Trait for vPilot derived models + struct VPilotAircraftModels : public BlackMisc::CDataTrait + { + //! Key in data cache + static const char *key() { return "vpilot/models"; } + }; + + //! Bundle of caches for all simulators + //! \remark Temp. workaround + class CModelCaches : public QObject + { + Q_OBJECT + + public: + //! Construtor + CModelCaches(QObject *parent = nullptr); + + //! Models + CAircraftModelList getModels(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; + + //! Set models + BlackMisc::CStatusMessage setModels(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator); + + //! Cache timestamp + QDateTime getCacheTimestamp(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; + + //! Syncronize + void syncronize(const BlackMisc::Simulation::CSimulatorInfo &simulator); + + private: + BlackMisc::CData m_modelCacheFsx {this }; //!< FSX cache + BlackMisc::CData m_modelCacheFs9 {this }; //!< FS9 cache + BlackMisc::CData m_modelCacheP3D {this }; //!< P3D cache + BlackMisc::CData m_modelCacheXP {this }; //!< XP cache + }; + + + //! Bundle of caches for model sets of all simulators + //! \remark Temp. workaround + class CModelSetCaches : public QObject + { + Q_OBJECT + + public: + //! Construtor + CModelSetCaches(QObject *parent = nullptr); + + //! Models + CAircraftModelList getModels(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; + + //! Set models + BlackMisc::CStatusMessage setModels(const BlackMisc::Simulation::CAircraftModelList &models, const BlackMisc::Simulation::CSimulatorInfo &simulator); + + //! Cache timestamp + QDateTime getCacheTimestamp(const BlackMisc::Simulation::CSimulatorInfo &simulator) const; + + //! Syncronize + void syncronize(const BlackMisc::Simulation::CSimulatorInfo &simulator); + + private: + BlackMisc::CData m_modelCacheFsx {this }; //!< FSX cache + BlackMisc::CData m_modelCacheFs9 {this }; //!< FS9 cache + BlackMisc::CData m_modelCacheP3D {this }; //!< P3D cache + BlackMisc::CData m_modelCacheXP {this }; //!< XP cache + }; } // ns } // ns diff --git a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp index e4f73a08a..4e05b0315 100644 --- a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp +++ b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp @@ -109,7 +109,7 @@ namespace BlackMisc CAircraftModelList models; if (ok) { - models = (aircraftCfgEntriesList.toAircraftModelList(this->supportedSimulators())); + models = (aircraftCfgEntriesList.toAircraftModelList(this->getSimulator())); this->mergeWithDbData(models, dbModels); } return std::make_tuple(aircraftCfgEntriesList, models, ok); @@ -139,7 +139,7 @@ namespace BlackMisc { bool ok; this->m_parsedCfgEntriesList = performParsing(m_rootDirectory, m_excludedDirectories, &ok); - CAircraftModelList models(this->m_parsedCfgEntriesList.toAircraftModelList(this->supportedSimulators())); + CAircraftModelList models(this->m_parsedCfgEntriesList.toAircraftModelList(this->getSimulator())); this->mergeWithDbData(models, dbModels); const bool hasData = !models.isEmpty(); if (hasData) @@ -164,24 +164,6 @@ namespace BlackMisc return !m_parserWorker || m_parserWorker->isFinished(); } - QDateTime CAircraftCfgParser::getCacheTimestamp() const - { - if (this->m_simulatorInfo.fsx()) - { - return m_modelCacheFsx.getTimestamp(); - } - else if (this->m_simulatorInfo.fs9()) - { - return m_modelCacheFs9.getTimestamp(); - } - else if (this->m_simulatorInfo.p3d()) - { - return m_modelCacheP3D.getTimestamp(); - } - Q_ASSERT_X(false, Q_FUNC_INFO, "Illegal simulator info"); - return QDateTime(); - } - bool CAircraftCfgParser::areModelFilesUpdated() const { const QDateTime cacheTs(getCacheTimestamp()); @@ -189,61 +171,6 @@ namespace BlackMisc return CFileUtils::containsFileNewerThan(cacheTs, this->getRootDirectory(), true, { fileFilter() }, this->m_excludedDirectories); } - bool CAircraftCfgParser::hasCachedData() const - { - if (this->m_simulatorInfo.fsx()) - { - return !m_modelCacheFsx.get().isEmpty(); - } - else if (this->m_simulatorInfo.fs9()) - { - return !m_modelCacheFs9.get().isEmpty(); - } - else if (this->m_simulatorInfo.p3d()) - { - return !m_modelCacheP3D.get().isEmpty(); - } - Q_ASSERT_X(false, Q_FUNC_INFO, "Illegal simulator info"); - return false; - } - - const CAircraftModelList &CAircraftCfgParser::getAircraftModels() const - { - static const CAircraftModelList empty; - if (this->m_simulatorInfo.fsx()) - { - return m_modelCacheFsx.get(); - } - else if (this->m_simulatorInfo.fs9()) - { - return m_modelCacheFs9.get(); - } - else if (this->m_simulatorInfo.p3d()) - { - return m_modelCacheP3D.get(); - } - Q_ASSERT_X(false, Q_FUNC_INFO, "Illegal simulator info"); - return empty; - } - - CStatusMessage CAircraftCfgParser::setModelsInCache(const CAircraftModelList &models) - { - if (this->m_simulatorInfo.fsx()) - { - return m_modelCacheFsx.set(models); - } - else if (this->m_simulatorInfo.fs9()) - { - return m_modelCacheFs9.set(models); - } - else if (this->m_simulatorInfo.p3d()) - { - return m_modelCacheP3D.set(models); - } - Q_ASSERT_X(false, Q_FUNC_INFO, "Illegal simulator info"); - return CStatusMessage(this, CStatusMessage::SeverityError, "Wrong simulator type"); - } - CAircraftCfgEntriesList CAircraftCfgParser::performParsing(const QString &directory, const QStringList &excludeDirectories, bool *ok) { // diff --git a/src/blackmisc/simulation/fscommon/aircraftcfgparser.h b/src/blackmisc/simulation/fscommon/aircraftcfgparser.h index ecc52fc8a..31d250c86 100644 --- a/src/blackmisc/simulation/fscommon/aircraftcfgparser.h +++ b/src/blackmisc/simulation/fscommon/aircraftcfgparser.h @@ -48,18 +48,12 @@ namespace BlackMisc virtual BlackMisc::CPixmap iconForModel(const QString &modelName, BlackMisc::CStatusMessage &statusMessage) const override; virtual bool isLoadingFinished() const override; virtual bool areModelFilesUpdated() const override; - virtual bool hasCachedData() const override; - virtual QDateTime getCacheTimestamp() const override; - virtual const BlackMisc::Simulation::CAircraftModelList &getAircraftModels() const override; //! @} //! Create an parser object for given simulator static std::unique_ptr createModelLoader(const BlackMisc::Simulation::CSimulatorInfo &simInfo); protected: - //! Set cached values - BlackMisc::CStatusMessage setModelsInCache(const BlackMisc::Simulation::CAircraftModelList &models); - //! \name Interface functions //! @{ virtual void startLoadingFromDisk(LoadMode mode, const BlackMisc::Simulation::CAircraftModelList &dbModels) override; @@ -94,11 +88,7 @@ namespace BlackMisc CAircraftCfgEntriesList m_parsedCfgEntriesList; //!< parsed entries QPointer m_parserWorker; //!< worker will destroy itself, so weak pointer - //! \todo KB/MS Is there nothing better than having 3 cache members? - BlackMisc::CData m_modelCacheFsx {this, &CAircraftCfgParser::ps_cacheChanged}; //!< FSX cache - BlackMisc::CData m_modelCacheFs9 {this, &CAircraftCfgParser::ps_cacheChanged}; //!< FS9 cache - BlackMisc::CData m_modelCacheP3D {this, &CAircraftCfgParser::ps_cacheChanged}; //!< P3D cache - + //! Files to be used static const QString &fileFilter(); }; } // namespace diff --git a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp index 434ebdbb2..156b9908d 100644 --- a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp +++ b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp @@ -64,9 +64,9 @@ namespace BlackMisc void CAircraftModelLoaderXPlane::startLoadingFromDisk(LoadMode mode, const CAircraftModelList &dbModels) { - m_installedModels.clear(); if (m_rootDirectory.isEmpty()) { + this->clearCache(); emit loadingFinished(false, this->m_simulatorInfo); return; } @@ -90,9 +90,9 @@ namespace BlackMisc } else if (mode.testFlag(LoadDirectly)) { - m_installedModels = performParsing(m_rootDirectory, m_excludedDirectories); - mergeWithDbData(m_installedModels, dbModels); - emit loadingFinished(true, this->m_simulatorInfo); + CAircraftModelList models(performParsing(m_rootDirectory, m_excludedDirectories)); + mergeWithDbData(models, dbModels); + updateInstalledModels(models); } } @@ -108,26 +108,10 @@ namespace BlackMisc return CFileUtils::containsFileNewerThan(cacheTs, this->getRootDirectory(), true, {fileFilterCsl(), fileFilterFlyable()}, this->m_excludedDirectories); } - bool CAircraftModelLoaderXPlane::hasCachedData() const - { - //! \todo KB - return false; - } - - QDateTime CAircraftModelLoaderXPlane::getCacheTimestamp() const - { - //! \todo KB add cache and report back - return QDateTime(); - } - - const CAircraftModelList &CAircraftModelLoaderXPlane::getAircraftModels() const - { - return m_installedModels; - } void CAircraftModelLoaderXPlane::updateInstalledModels(const CAircraftModelList &models) { - m_installedModels = models; + this->setModelsInCache(models); emit loadingFinished(true, this->m_simulatorInfo); } diff --git a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h index 41ed27e2e..a416cc474 100644 --- a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h +++ b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h @@ -46,9 +46,6 @@ namespace BlackMisc virtual BlackMisc::CPixmap iconForModel(const QString &modelName, BlackMisc::CStatusMessage &statusMessage) const override; virtual bool isLoadingFinished() const override; virtual bool areModelFilesUpdated() const override; - virtual bool hasCachedData() const override; - virtual QDateTime getCacheTimestamp() const override; - virtual const BlackMisc::Simulation::CAircraftModelList &getAircraftModels() const override; //! @} public slots: @@ -113,7 +110,6 @@ namespace BlackMisc QPointer m_parserWorker; //!< worker will destroy itself, so weak pointer QVector m_cslPackages; //!< Parsed Packages. No lock required since accessed only from one thread - BlackMisc::Simulation::CAircraftModelList m_installedModels; static const QString &fileFilterFlyable(); static const QString &fileFilterCsl();