refs #585, adjusted loaders

* use paths from settings
* no longer pass model directory and exclude directories
This commit is contained in:
Klaus Basan
2016-06-12 03:06:17 +02:00
parent 1ef1cc0021
commit bc344c73fc
6 changed files with 59 additions and 76 deletions

View File

@@ -18,6 +18,7 @@
#include <QtGlobal> #include <QtGlobal>
using namespace BlackMisc::Simulation::Data; using namespace BlackMisc::Simulation::Data;
using namespace BlackMisc::Simulation::Settings;
using namespace BlackMisc::Simulation::FsCommon; using namespace BlackMisc::Simulation::FsCommon;
using namespace BlackMisc::Simulation::XPlane; using namespace BlackMisc::Simulation::XPlane;
@@ -25,8 +26,7 @@ namespace BlackMisc
{ {
namespace Simulation namespace Simulation
{ {
IAircraftModelLoader::IAircraftModelLoader(const CSimulatorInfo &simulator, const QString &rootDirectory, const QStringList &excludeDirs) : IAircraftModelLoader::IAircraftModelLoader(const CSimulatorInfo &simulator)
m_rootDirectory(rootDirectory), m_excludedDirectories(excludeDirs)
{ {
Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Only one simulator per loader"); Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "Only one simulator per loader");
this->m_caches.setCurrentSimulator(simulator); this->m_caches.setCurrentSimulator(simulator);
@@ -42,6 +42,7 @@ namespace BlackMisc
{ {
if (directory.isEmpty()) { return false; } if (directory.isEmpty()) { return false; }
QDir dir(directory); QDir dir(directory);
//! \todo not available network dir can make this hang here, however there is no obvious solution to that //! \todo not available network dir can make this hang here, however there is no obvious solution to that
return dir.exists(); return dir.exists();
} }
@@ -76,13 +77,14 @@ namespace BlackMisc
this->m_loadingInProgress = false; this->m_loadingInProgress = false;
} }
bool IAircraftModelLoader::changeRootDirectory(const QString &directory) QString IAircraftModelLoader::getModelDirectory() const
{ {
if (m_rootDirectory == directory) { return false; } return this->m_settings.getModelDirectoryOrDefault(this->getSimulator());
if (directory.isEmpty() || !existsDir(directory)) { return false; } }
m_rootDirectory = directory; QStringList IAircraftModelLoader::getModelExcludeDirectories(bool relative) const
return true; {
return this->m_settings.getModelExcludeDirectoryPatternsOrDefault(this->getSimulator(), relative);
} }
CAircraftModelList IAircraftModelLoader::getAircraftModels() const CAircraftModelList IAircraftModelLoader::getAircraftModels() const
@@ -165,9 +167,7 @@ namespace BlackMisc
std::unique_ptr<IAircraftModelLoader> loader; std::unique_ptr<IAircraftModelLoader> loader;
if (simulator.xplane()) if (simulator.xplane())
{ {
loader = std::make_unique<CAircraftModelLoaderXPlane>( loader = std::make_unique<CAircraftModelLoaderXPlane>();
CSimulatorInfo(CSimulatorInfo::XPLANE),
CXPlaneUtil::xplaneRootDir());
} }
else else
{ {

View File

@@ -16,6 +16,7 @@
#include "blackmisc/simulation/aircraftmodelinterfaces.h" #include "blackmisc/simulation/aircraftmodelinterfaces.h"
#include "blackmisc/simulation/aircraftmodellist.h" #include "blackmisc/simulation/aircraftmodellist.h"
#include "blackmisc/simulation/data/modelcaches.h" #include "blackmisc/simulation/data/modelcaches.h"
#include "blackmisc/simulation/settings/settingssimulator.h"
#include "blackmisc/simulation/simulatorinfo.h" #include "blackmisc/simulation/simulatorinfo.h"
#include "blackmisc/statusmessage.h" #include "blackmisc/statusmessage.h"
@@ -71,12 +72,6 @@ namespace BlackMisc
//! Optional DB models can be passed and used for data consolidation. //! Optional DB models can be passed and used for data consolidation.
void startLoading(LoadMode mode = InBackgroundWithCache, const CAircraftModelList &dbModels = {}); 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? //! Loading finished?
virtual bool isLoadingFinished() const = 0; virtual bool isLoadingFinished() const = 0;
@@ -99,6 +94,12 @@ namespace BlackMisc
//! Is the given simulator supported? //! Is the given simulator supported?
bool supportsSimulator(const BlackMisc::Simulation::CSimulatorInfo &info); bool supportsSimulator(const BlackMisc::Simulation::CSimulatorInfo &info);
//! Current root directory
QString getModelDirectory() const;
//! Exclude directories
QStringList getModelExcludeDirectories(bool relative) const;
//! Cancel read //! Cancel read
void cancelLoading(); void cancelLoading();
@@ -131,7 +132,7 @@ namespace BlackMisc
protected: protected:
//! Constructor //! Constructor
IAircraftModelLoader(const CSimulatorInfo &simulator, const QString &rootDirectory, const QStringList &excludeDirs = {}); IAircraftModelLoader(const CSimulatorInfo &simulator);
//! Cache timestamp //! Cache timestamp
QDateTime getCacheTimestamp() const; QDateTime getCacheTimestamp() const;
@@ -148,11 +149,10 @@ namespace BlackMisc
//! Start the loading process from disk //! Start the loading process from disk
virtual void startLoadingFromDisk(LoadMode mode, const BlackMisc::Simulation::CAircraftModelList &dbModels) = 0; virtual void startLoadingFromDisk(LoadMode mode, const BlackMisc::Simulation::CAircraftModelList &dbModels) = 0;
std::atomic<bool> m_cancelLoading { false }; //!< flag std::atomic<bool> m_cancelLoading { false }; //!< flag
std::atomic<bool> m_loadingInProgress { false }; //!< Loading in progress std::atomic<bool> m_loadingInProgress { false }; //!< Loading in progress
QString m_rootDirectory; //!< root directory parsing aircraft.cfg files BlackMisc::Simulation::Data::CModelCaches m_caches { this }; //!< caches
QStringList m_excludedDirectories; //!< directories not to be parsed BlackMisc::Simulation::Settings::CMultiSimulatorSimulatorSettings m_settings { this }; //!< settings
BlackMisc::Simulation::Data::CModelCaches m_caches { this }; //!< caches
protected slots: protected slots:
//! Loading finished //! Loading finished

View File

@@ -35,6 +35,7 @@
using namespace BlackMisc; using namespace BlackMisc;
using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation;
using namespace BlackMisc::Simulation::FsCommon; using namespace BlackMisc::Simulation::FsCommon;
using namespace BlackMisc::Simulation::Settings;
using namespace BlackMisc::Network; using namespace BlackMisc::Network;
namespace BlackMisc namespace BlackMisc
@@ -46,35 +47,13 @@ namespace BlackMisc
// response for async. loading // response for async. loading
using LoaderResponse = std::tuple<CAircraftCfgEntriesList, CAircraftModelList, bool>; using LoaderResponse = std::tuple<CAircraftCfgEntriesList, CAircraftModelList, bool>;
CAircraftCfgParser::CAircraftCfgParser(const CSimulatorInfo &simInfo, const QString &rootDirectory, const QStringList &excludeDirs) : CAircraftCfgParser::CAircraftCfgParser(const CSimulatorInfo &simInfo) :
IAircraftModelLoader(simInfo, rootDirectory, excludeDirs) IAircraftModelLoader(simInfo)
{ } { }
std::unique_ptr<CAircraftCfgParser> CAircraftCfgParser::createModelLoader(const CSimulatorInfo &simInfo) std::unique_ptr<CAircraftCfgParser> CAircraftCfgParser::createModelLoader(const CSimulatorInfo &simInfo)
{ {
if (simInfo.fsx()) return std::make_unique<CAircraftCfgParser>(simInfo);
{
return std::make_unique<CAircraftCfgParser>(
CSimulatorInfo(CSimulatorInfo::FSX),
CFsCommonUtil::fsxSimObjectsDir(),
CFsCommonUtil::fsxSimObjectsExcludeDirectories());
}
else if (simInfo.fs9())
{
return std::make_unique<CAircraftCfgParser>(
CSimulatorInfo(CSimulatorInfo::FS9),
CFsCommonUtil::fs9AircraftDir(),
CFsCommonUtil::fs9AircraftObjectsExcludeDirectories());
}
else if (simInfo.p3d())
{
return std::make_unique<CAircraftCfgParser>(
CSimulatorInfo(CSimulatorInfo::P3D),
CFsCommonUtil::p3dSimObjectsDir(),
CFsCommonUtil::p3dSimObjectsExcludeDirectories());
}
Q_ASSERT_X(false, Q_FUNC_INFO, "Illegal simulator info");
return {};
} }
CAircraftCfgParser::~CAircraftCfgParser() CAircraftCfgParser::~CAircraftCfgParser()
@@ -85,25 +64,27 @@ namespace BlackMisc
void CAircraftCfgParser::startLoadingFromDisk(LoadMode mode, const CAircraftModelList &dbModels) 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 (mode.testFlag(LoadInBackground))
{ {
if (m_parserWorker && !m_parserWorker->isFinished()) { return; } 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", m_parserWorker = BlackMisc::CWorker::fromTask(this, "CAircraftCfgParser::changeDirectory",
[this, rootDirectory, excludedDirectories, dbModels]() [this, modelDirectory, excludedDirectories, simulator, dbModels]()
{ {
bool ok = false; bool ok = false;
const auto aircraftCfgEntriesList = this->performParsing(rootDirectory, excludedDirectories, &ok); const auto aircraftCfgEntriesList = this->performParsing(modelDirectory, excludedDirectories, &ok);
CAircraftModelList models; CAircraftModelList models;
if (ok) if (ok)
{ {
models = (aircraftCfgEntriesList.toAircraftModelList(this->getSimulator())); models = aircraftCfgEntriesList.toAircraftModelList(simulator);
CAircraftModelUtilities::mergeWithDbData(models, dbModels); CAircraftModelUtilities::mergeWithDbData(models, dbModels);
} }
return std::make_tuple(aircraftCfgEntriesList, models, ok); return std::make_tuple(aircraftCfgEntriesList, models, ok);
}); });
m_parserWorker->thenWithResult<LoaderResponse>(this, [this](const LoaderResponse & tuple) m_parserWorker->thenWithResult<LoaderResponse>(this, [this, simulator](const LoaderResponse & tuple)
{ {
const bool ok = std::get<2>(tuple); const bool ok = std::get<2>(tuple);
if (ok) if (ok)
@@ -116,19 +97,19 @@ namespace BlackMisc
this->setCachedModels(models); // not thread safe this->setCachedModels(models); // not thread safe
} }
// currently I treat no data as error // currently I treat no data as error
emit this->loadingFinished(hasData, this->getSimulator()); emit this->loadingFinished(hasData, simulator);
} }
else else
{ {
emit this->loadingFinished(false, this->getSimulator()); emit this->loadingFinished(false, simulator);
} }
}); });
} }
else if (mode == LoadDirectly) else if (mode == LoadDirectly)
{ {
bool ok; bool ok;
this->m_parsedCfgEntriesList = performParsing(m_rootDirectory, m_excludedDirectories, &ok); this->m_parsedCfgEntriesList = performParsing(modelDirectory, excludedDirectories, &ok);
CAircraftModelList models(this->m_parsedCfgEntriesList.toAircraftModelList(this->getSimulator())); CAircraftModelList models(this->m_parsedCfgEntriesList.toAircraftModelList(simulator));
CAircraftModelUtilities::mergeWithDbData(models, dbModels); CAircraftModelUtilities::mergeWithDbData(models, dbModels);
const bool hasData = !models.isEmpty(); const bool hasData = !models.isEmpty();
if (hasData) if (hasData)
@@ -136,7 +117,7 @@ namespace BlackMisc
this->setCachedModels(models); // not thread safe this->setCachedModels(models); // not thread safe
} }
// currently I treat no data as error // 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 bool CAircraftCfgParser::areModelFilesUpdated() const
{ {
const QDateTime cacheTs(getCacheTimestamp()); const QDateTime cacheTs(getCacheTimestamp());
if (!cacheTs.isValid()) { return true; } 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) CAircraftCfgEntriesList CAircraftCfgParser::performParsing(const QString &directory, const QStringList &excludeDirectories, bool *ok)

View File

@@ -42,7 +42,7 @@ namespace BlackMisc
public: public:
//! Constructor //! Constructor
CAircraftCfgParser(const BlackMisc::Simulation::CSimulatorInfo &simInfo, const QString &rootDirectory, const QStringList &exludes = {}); CAircraftCfgParser(const BlackMisc::Simulation::CSimulatorInfo &simInfo);
//! Virtual destructor //! Virtual destructor
virtual ~CAircraftCfgParser(); virtual ~CAircraftCfgParser();
@@ -91,11 +91,11 @@ namespace BlackMisc
//! Content after "=" //! Content after "="
static QString getFixedIniLineContent(const QString &line); static QString getFixedIniLineContent(const QString &line);
CAircraftCfgEntriesList m_parsedCfgEntriesList; //!< parsed entries
QPointer<BlackMisc::CWorker> m_parserWorker; //!< worker will destroy itself, so weak pointer
//! Files to be used //! Files to be used
static const QString &fileFilter(); static const QString &fileFilter();
CAircraftCfgEntriesList m_parsedCfgEntriesList; //!< parsed entries
QPointer<BlackMisc::CWorker> m_parserWorker; //!< worker will destroy itself, so weak pointer
}; };
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -47,9 +47,9 @@ namespace BlackMisc
{ {
namespace XPlane namespace XPlane
{ {
//! Normalizes CSL model "designators" e.g. __XPFW_Jets:A320_a:A320_a_Austrian_Airlines.obj
static void normalizePath(QString &path) static void normalizePath(QString &path)
{ {
//! \todo KB consider CFileUtil::normalizeFilePathToQtStandard ??
for (auto &e : path) for (auto &e : path)
{ {
if (e == '/' || e == ':' || e == '\\') if (e == '/' || e == ':' || e == '\\')
@@ -59,8 +59,7 @@ namespace BlackMisc
} }
} }
CAircraftModelLoaderXPlane::CAircraftModelLoaderXPlane(const CSimulatorInfo &simInfo, const QString &rootDirectory, const QStringList &excludeDirs) : CAircraftModelLoaderXPlane::CAircraftModelLoaderXPlane() : IAircraftModelLoader(CSimulatorInfo::XPLANE)
IAircraftModelLoader(simInfo, rootDirectory, excludeDirs)
{ } { }
CAircraftModelLoaderXPlane::~CAircraftModelLoaderXPlane() CAircraftModelLoaderXPlane::~CAircraftModelLoaderXPlane()
@@ -71,22 +70,24 @@ namespace BlackMisc
void CAircraftModelLoaderXPlane::startLoadingFromDisk(LoadMode mode, const CAircraftModelList &dbModels) 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(); this->clearCache();
emit loadingFinished(false, this->getSimulator()); emit loadingFinished(false, simulator);
return; return;
} }
if (mode.testFlag(LoadInBackground)) if (mode.testFlag(LoadInBackground))
{ {
if (m_parserWorker && !m_parserWorker->isFinished()) { return; } if (m_parserWorker && !m_parserWorker->isFinished()) { return; }
auto rootDirectory = m_rootDirectory;
auto excludedDirectories = m_excludedDirectories;
m_parserWorker = BlackMisc::CWorker::fromTask(this, "CAircraftModelLoaderXPlane::performParsing", 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); CAircraftModelUtilities::mergeWithDbData(models, dbModels);
return models; return models;
}); });
@@ -97,7 +98,7 @@ namespace BlackMisc
} }
else if (mode.testFlag(LoadDirectly)) else if (mode.testFlag(LoadDirectly))
{ {
CAircraftModelList models(performParsing(m_rootDirectory, m_excludedDirectories)); CAircraftModelList models(performParsing(this->getModelDirectory(), excludedDirectories));
CAircraftModelUtilities::mergeWithDbData(models, dbModels); CAircraftModelUtilities::mergeWithDbData(models, dbModels);
updateInstalledModels(models); updateInstalledModels(models);
} }
@@ -112,7 +113,7 @@ namespace BlackMisc
{ {
const QDateTime cacheTs(getCacheTimestamp()); const QDateTime cacheTs(getCacheTimestamp());
if (!cacheTs.isValid()) { return true; } 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));
} }

View File

@@ -33,7 +33,7 @@ namespace BlackMisc
namespace XPlane namespace XPlane
{ {
/*! /*!
* \brief XPlane aircraft model loader * XPlane aircraft model loader
* \todo Obj8Aircraft and Obj8 parsers are not yet implemented * \todo Obj8Aircraft and Obj8 parsers are not yet implemented
*/ */
class BLACKMISC_EXPORT CAircraftModelLoaderXPlane : public BlackMisc::Simulation::IAircraftModelLoader class BLACKMISC_EXPORT CAircraftModelLoaderXPlane : public BlackMisc::Simulation::IAircraftModelLoader
@@ -42,7 +42,7 @@ namespace BlackMisc
public: public:
//! Constructor //! Constructor
CAircraftModelLoaderXPlane(const BlackMisc::Simulation::CSimulatorInfo &simInfo, const QString &rootDirectory, const QStringList &exludes = {}); CAircraftModelLoaderXPlane();
//! Virtual destructor //! Virtual destructor
virtual ~CAircraftModelLoaderXPlane(); virtual ~CAircraftModelLoaderXPlane();