From bc344c73fcae3ec644764d7e1d7a81f6e602f567 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 12 Jun 2016 03:06:17 +0200 Subject: [PATCH] refs #585, adjusted loaders * use paths from settings * no longer pass model directory and exclude directories --- .../simulation/aircraftmodelloader.cpp | 20 +++---- .../simulation/aircraftmodelloader.h | 24 ++++---- .../simulation/fscommon/aircraftcfgparser.cpp | 56 +++++++------------ .../simulation/fscommon/aircraftcfgparser.h | 8 +-- .../xplane/aircraftmodelloaderxplane.cpp | 23 ++++---- .../xplane/aircraftmodelloaderxplane.h | 4 +- 6 files changed, 59 insertions(+), 76 deletions(-) diff --git a/src/blackmisc/simulation/aircraftmodelloader.cpp b/src/blackmisc/simulation/aircraftmodelloader.cpp index b657c0bf3..9f43ec375 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.cpp +++ b/src/blackmisc/simulation/aircraftmodelloader.cpp @@ -18,6 +18,7 @@ #include using namespace BlackMisc::Simulation::Data; +using namespace BlackMisc::Simulation::Settings; using namespace BlackMisc::Simulation::FsCommon; using namespace BlackMisc::Simulation::XPlane; @@ -25,8 +26,7 @@ namespace BlackMisc { namespace Simulation { - IAircraftModelLoader::IAircraftModelLoader(const CSimulatorInfo &simulator, const QString &rootDirectory, const QStringList &excludeDirs) : - m_rootDirectory(rootDirectory), m_excludedDirectories(excludeDirs) + IAircraftModelLoader::IAircraftModelLoader(const CSimulatorInfo &simulator) { Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Only one simulator per loader"); this->m_caches.setCurrentSimulator(simulator); @@ -42,6 +42,7 @@ namespace BlackMisc { if (directory.isEmpty()) { return false; } QDir dir(directory); + //! \todo not available network dir can make this hang here, however there is no obvious solution to that return dir.exists(); } @@ -76,13 +77,14 @@ namespace BlackMisc this->m_loadingInProgress = false; } - bool IAircraftModelLoader::changeRootDirectory(const QString &directory) + QString IAircraftModelLoader::getModelDirectory() const { - if (m_rootDirectory == directory) { return false; } - if (directory.isEmpty() || !existsDir(directory)) { return false; } + return this->m_settings.getModelDirectoryOrDefault(this->getSimulator()); + } - m_rootDirectory = directory; - return true; + QStringList IAircraftModelLoader::getModelExcludeDirectories(bool relative) const + { + return this->m_settings.getModelExcludeDirectoryPatternsOrDefault(this->getSimulator(), relative); } CAircraftModelList IAircraftModelLoader::getAircraftModels() const @@ -165,9 +167,7 @@ namespace BlackMisc std::unique_ptr loader; if (simulator.xplane()) { - loader = std::make_unique( - CSimulatorInfo(CSimulatorInfo::XPLANE), - CXPlaneUtil::xplaneRootDir()); + loader = std::make_unique(); } else { diff --git a/src/blackmisc/simulation/aircraftmodelloader.h b/src/blackmisc/simulation/aircraftmodelloader.h index f949b639a..784be2975 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.h +++ b/src/blackmisc/simulation/aircraftmodelloader.h @@ -16,6 +16,7 @@ #include "blackmisc/simulation/aircraftmodelinterfaces.h" #include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/data/modelcaches.h" +#include "blackmisc/simulation/settings/settingssimulator.h" #include "blackmisc/simulation/simulatorinfo.h" #include "blackmisc/statusmessage.h" @@ -71,12 +72,6 @@ namespace BlackMisc //! Optional DB models can be passed and used for data consolidation. void startLoading(LoadMode mode = InBackgroundWithCache, const CAircraftModelList &dbModels = {}); - //! Change the directory - bool changeRootDirectory(const QString &directory); - - //! Current root directory - QString getRootDirectory() const { return this->m_rootDirectory; } - //! Loading finished? virtual bool isLoadingFinished() const = 0; @@ -99,6 +94,12 @@ namespace BlackMisc //! Is the given simulator supported? bool supportsSimulator(const BlackMisc::Simulation::CSimulatorInfo &info); + //! Current root directory + QString getModelDirectory() const; + + //! Exclude directories + QStringList getModelExcludeDirectories(bool relative) const; + //! Cancel read void cancelLoading(); @@ -131,7 +132,7 @@ namespace BlackMisc protected: //! Constructor - IAircraftModelLoader(const CSimulatorInfo &simulator, const QString &rootDirectory, const QStringList &excludeDirs = {}); + IAircraftModelLoader(const CSimulatorInfo &simulator); //! Cache timestamp QDateTime getCacheTimestamp() const; @@ -148,11 +149,10 @@ namespace BlackMisc //! Start the loading process from disk virtual void startLoadingFromDisk(LoadMode mode, const BlackMisc::Simulation::CAircraftModelList &dbModels) = 0; - 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 + std::atomic m_cancelLoading { false }; //!< flag + std::atomic m_loadingInProgress { false }; //!< Loading in progress + BlackMisc::Simulation::Data::CModelCaches m_caches { this }; //!< caches + BlackMisc::Simulation::Settings::CMultiSimulatorSimulatorSettings m_settings { this }; //!< settings protected slots: //! Loading finished diff --git a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp index 59337410d..6a418ae1d 100644 --- a/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp +++ b/src/blackmisc/simulation/fscommon/aircraftcfgparser.cpp @@ -35,6 +35,7 @@ using namespace BlackMisc; using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation::FsCommon; +using namespace BlackMisc::Simulation::Settings; using namespace BlackMisc::Network; namespace BlackMisc @@ -46,35 +47,13 @@ namespace BlackMisc // response for async. loading using LoaderResponse = std::tuple; - CAircraftCfgParser::CAircraftCfgParser(const CSimulatorInfo &simInfo, const QString &rootDirectory, const QStringList &excludeDirs) : - IAircraftModelLoader(simInfo, rootDirectory, excludeDirs) + CAircraftCfgParser::CAircraftCfgParser(const CSimulatorInfo &simInfo) : + IAircraftModelLoader(simInfo) { } std::unique_ptr CAircraftCfgParser::createModelLoader(const CSimulatorInfo &simInfo) { - if (simInfo.fsx()) - { - return std::make_unique( - CSimulatorInfo(CSimulatorInfo::FSX), - CFsCommonUtil::fsxSimObjectsDir(), - CFsCommonUtil::fsxSimObjectsExcludeDirectories()); - } - else if (simInfo.fs9()) - { - return std::make_unique( - CSimulatorInfo(CSimulatorInfo::FS9), - CFsCommonUtil::fs9AircraftDir(), - CFsCommonUtil::fs9AircraftObjectsExcludeDirectories()); - } - else if (simInfo.p3d()) - { - return std::make_unique( - CSimulatorInfo(CSimulatorInfo::P3D), - CFsCommonUtil::p3dSimObjectsDir(), - CFsCommonUtil::p3dSimObjectsExcludeDirectories()); - } - Q_ASSERT_X(false, Q_FUNC_INFO, "Illegal simulator info"); - return {}; + return std::make_unique(simInfo); } CAircraftCfgParser::~CAircraftCfgParser() @@ -85,25 +64,27 @@ namespace BlackMisc void CAircraftCfgParser::startLoadingFromDisk(LoadMode mode, const CAircraftModelList &dbModels) { + const CSimulatorInfo simulator = this->getSimulator(); + const QString modelDirectory(this->m_settings.getModelDirectoryOrDefault(simulator)); // copy + const QStringList excludedDirectories(this->m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator, true)); // copy + if (mode.testFlag(LoadInBackground)) { if (m_parserWorker && !m_parserWorker->isFinished()) { return; } - const QString rootDirectory(m_rootDirectory); // copy - const QStringList excludedDirectories(m_excludedDirectories); // copy m_parserWorker = BlackMisc::CWorker::fromTask(this, "CAircraftCfgParser::changeDirectory", - [this, rootDirectory, excludedDirectories, dbModels]() + [this, modelDirectory, excludedDirectories, simulator, dbModels]() { bool ok = false; - const auto aircraftCfgEntriesList = this->performParsing(rootDirectory, excludedDirectories, &ok); + const auto aircraftCfgEntriesList = this->performParsing(modelDirectory, excludedDirectories, &ok); CAircraftModelList models; if (ok) { - models = (aircraftCfgEntriesList.toAircraftModelList(this->getSimulator())); + models = aircraftCfgEntriesList.toAircraftModelList(simulator); CAircraftModelUtilities::mergeWithDbData(models, dbModels); } return std::make_tuple(aircraftCfgEntriesList, models, ok); }); - m_parserWorker->thenWithResult(this, [this](const LoaderResponse & tuple) + m_parserWorker->thenWithResult(this, [this, simulator](const LoaderResponse & tuple) { const bool ok = std::get<2>(tuple); if (ok) @@ -116,19 +97,19 @@ namespace BlackMisc this->setCachedModels(models); // not thread safe } // currently I treat no data as error - emit this->loadingFinished(hasData, this->getSimulator()); + emit this->loadingFinished(hasData, simulator); } else { - emit this->loadingFinished(false, this->getSimulator()); + emit this->loadingFinished(false, simulator); } }); } else if (mode == LoadDirectly) { bool ok; - this->m_parsedCfgEntriesList = performParsing(m_rootDirectory, m_excludedDirectories, &ok); - CAircraftModelList models(this->m_parsedCfgEntriesList.toAircraftModelList(this->getSimulator())); + this->m_parsedCfgEntriesList = performParsing(modelDirectory, excludedDirectories, &ok); + CAircraftModelList models(this->m_parsedCfgEntriesList.toAircraftModelList(simulator)); CAircraftModelUtilities::mergeWithDbData(models, dbModels); const bool hasData = !models.isEmpty(); if (hasData) @@ -136,7 +117,7 @@ namespace BlackMisc this->setCachedModels(models); // not thread safe } // currently I treat no data as error - emit this->loadingFinished(hasData, this->getSimulator()); + emit this->loadingFinished(hasData, simulator); } } @@ -156,8 +137,9 @@ namespace BlackMisc bool CAircraftCfgParser::areModelFilesUpdated() const { const QDateTime cacheTs(getCacheTimestamp()); + if (!cacheTs.isValid()) { return true; } - return CFileUtils::containsFileNewerThan(cacheTs, this->getRootDirectory(), true, { fileFilter() }, this->m_excludedDirectories); + return CFileUtils::containsFileNewerThan(cacheTs, this->getModelDirectory(), true, { fileFilter() }, this->getModelExcludeDirectories(true)); } 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 3eaef20d2..929176f1d 100644 --- a/src/blackmisc/simulation/fscommon/aircraftcfgparser.h +++ b/src/blackmisc/simulation/fscommon/aircraftcfgparser.h @@ -42,7 +42,7 @@ namespace BlackMisc public: //! Constructor - CAircraftCfgParser(const BlackMisc::Simulation::CSimulatorInfo &simInfo, const QString &rootDirectory, const QStringList &exludes = {}); + CAircraftCfgParser(const BlackMisc::Simulation::CSimulatorInfo &simInfo); //! Virtual destructor virtual ~CAircraftCfgParser(); @@ -91,11 +91,11 @@ namespace BlackMisc //! Content after "=" static QString getFixedIniLineContent(const QString &line); - CAircraftCfgEntriesList m_parsedCfgEntriesList; //!< parsed entries - QPointer m_parserWorker; //!< worker will destroy itself, so weak pointer - //! Files to be used static const QString &fileFilter(); + + CAircraftCfgEntriesList m_parsedCfgEntriesList; //!< parsed entries + QPointer m_parserWorker; //!< worker will destroy itself, so weak pointer }; } // namespace } // namespace diff --git a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp index c5b8eaa66..e03c250d8 100644 --- a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp +++ b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp @@ -47,9 +47,9 @@ namespace BlackMisc { namespace XPlane { + //! Normalizes CSL model "designators" e.g. __XPFW_Jets:A320_a:A320_a_Austrian_Airlines.obj static void normalizePath(QString &path) { - //! \todo KB consider CFileUtil::normalizeFilePathToQtStandard ?? for (auto &e : path) { if (e == '/' || e == ':' || e == '\\') @@ -59,8 +59,7 @@ namespace BlackMisc } } - CAircraftModelLoaderXPlane::CAircraftModelLoaderXPlane(const CSimulatorInfo &simInfo, const QString &rootDirectory, const QStringList &excludeDirs) : - IAircraftModelLoader(simInfo, rootDirectory, excludeDirs) + CAircraftModelLoaderXPlane::CAircraftModelLoaderXPlane() : IAircraftModelLoader(CSimulatorInfo::XPLANE) { } CAircraftModelLoaderXPlane::~CAircraftModelLoaderXPlane() @@ -71,22 +70,24 @@ namespace BlackMisc void CAircraftModelLoaderXPlane::startLoadingFromDisk(LoadMode mode, const CAircraftModelList &dbModels) { - if (m_rootDirectory.isEmpty()) + const CSimulatorInfo simulator = this->getSimulator(); + const QString modelDirectory(this->m_settings.getModelDirectoryOrDefault(simulator)); // copy + const QStringList excludedDirectories(this->m_settings.getModelExcludeDirectoryPatternsOrDefault(simulator, true)); // copy + + if (modelDirectory.isEmpty()) { this->clearCache(); - emit loadingFinished(false, this->getSimulator()); + emit loadingFinished(false, simulator); return; } if (mode.testFlag(LoadInBackground)) { if (m_parserWorker && !m_parserWorker->isFinished()) { return; } - auto rootDirectory = m_rootDirectory; - auto excludedDirectories = m_excludedDirectories; m_parserWorker = BlackMisc::CWorker::fromTask(this, "CAircraftModelLoaderXPlane::performParsing", - [this, rootDirectory, excludedDirectories, dbModels]() + [this, modelDirectory, excludedDirectories, dbModels]() { - auto models = performParsing(rootDirectory, excludedDirectories); + auto models = performParsing(modelDirectory, excludedDirectories); CAircraftModelUtilities::mergeWithDbData(models, dbModels); return models; }); @@ -97,7 +98,7 @@ namespace BlackMisc } else if (mode.testFlag(LoadDirectly)) { - CAircraftModelList models(performParsing(m_rootDirectory, m_excludedDirectories)); + CAircraftModelList models(performParsing(this->getModelDirectory(), excludedDirectories)); CAircraftModelUtilities::mergeWithDbData(models, dbModels); updateInstalledModels(models); } @@ -112,7 +113,7 @@ namespace BlackMisc { const QDateTime cacheTs(getCacheTimestamp()); if (!cacheTs.isValid()) { return true; } - return CFileUtils::containsFileNewerThan(cacheTs, this->getRootDirectory(), true, {fileFilterCsl(), fileFilterFlyable()}, this->m_excludedDirectories); + return CFileUtils::containsFileNewerThan(cacheTs, this->getModelDirectory(), true, {fileFilterCsl(), fileFilterFlyable()}, this->getModelExcludeDirectories(false)); } diff --git a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h index 8a74cf699..3bf45f805 100644 --- a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h +++ b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h @@ -33,7 +33,7 @@ namespace BlackMisc namespace XPlane { /*! - * \brief XPlane aircraft model loader + * XPlane aircraft model loader * \todo Obj8Aircraft and Obj8 parsers are not yet implemented */ class BLACKMISC_EXPORT CAircraftModelLoaderXPlane : public BlackMisc::Simulation::IAircraftModelLoader @@ -42,7 +42,7 @@ namespace BlackMisc public: //! Constructor - CAircraftModelLoaderXPlane(const BlackMisc::Simulation::CSimulatorInfo &simInfo, const QString &rootDirectory, const QStringList &exludes = {}); + CAircraftModelLoaderXPlane(); //! Virtual destructor virtual ~CAircraftModelLoaderXPlane();