refs #619, change model loader to use caches (one per simulator)

* removed caching from GUI component
* added caches in model loader
* adjusted samples
This commit is contained in:
Klaus Basan
2016-03-11 04:13:56 +01:00
parent eda68329f3
commit 4087d63d9c
13 changed files with 354 additions and 151 deletions

View File

@@ -11,6 +11,7 @@
#include "xplaneutil.h"
#include "blackmisc/predicates.h"
#include "blackmisc/logmessage.h"
#include "blackmisc/fileutils.h"
#include <QDirIterator>
#include <QTextStream>
@@ -43,13 +44,8 @@ namespace BlackMisc
}
}
CAircraftModelLoaderXPlane::CAircraftModelLoaderXPlane()
{ }
CAircraftModelLoaderXPlane::CAircraftModelLoaderXPlane(const CSimulatorInfo &simInfo, const QString &rootDirectory, const QStringList &exludes) :
IAircraftModelLoader(simInfo),
m_rootDirectory(rootDirectory),
m_excludedDirectories(exludes)
CAircraftModelLoaderXPlane::CAircraftModelLoaderXPlane(const CSimulatorInfo &simInfo, const QString &rootDirectory, const QStringList &excludeDirs) :
IAircraftModelLoader(simInfo, rootDirectory, excludeDirs)
{ }
CAircraftModelLoaderXPlane::~CAircraftModelLoaderXPlane()
@@ -58,15 +54,6 @@ namespace BlackMisc
if (this->m_parserWorker) { this->m_parserWorker->waitForFinished(); }
}
bool CAircraftModelLoaderXPlane::changeRootDirectory(const QString &directory)
{
if (m_rootDirectory == directory) { return false; }
if (directory.isEmpty() || !existsDir(directory)) { return false; }
m_rootDirectory = directory;
return true;
}
CPixmap CAircraftModelLoaderXPlane::iconForModel(const QString &modelString, CStatusMessage &statusMessage) const
{
// X-Plane does not have previews. Maybe we can just use the textures?
@@ -75,7 +62,7 @@ namespace BlackMisc
return {};
}
void CAircraftModelLoaderXPlane::startLoading(LoadMode mode)
void CAircraftModelLoaderXPlane::startLoadingFromDisk(LoadMode mode)
{
m_installedModels.clear();
if (m_rootDirectory.isEmpty())
@@ -84,7 +71,7 @@ namespace BlackMisc
return;
}
if (mode == ModeBackground)
if (mode.testFlag(LoadInBackground))
{
if (m_parserWorker && !m_parserWorker->isFinished()) { return; }
auto rootDirectory = m_rootDirectory;
@@ -100,7 +87,7 @@ namespace BlackMisc
this->updateInstalledModels(models);
});
}
else if (mode == ModeBlocking)
else if (mode.testFlag(LoadDirectly))
{
m_installedModels = performParsing(m_rootDirectory, m_excludedDirectories);
emit loadingFinished(true);
@@ -112,7 +99,27 @@ namespace BlackMisc
return !m_parserWorker || m_parserWorker->isFinished();
}
CAircraftModelList CAircraftModelLoaderXPlane::getAircraftModels() const
bool CAircraftModelLoaderXPlane::areModelFilesUpdated() const
{
const QDateTime cacheTs(getCacheTimestamp());
if (!cacheTs.isValid()) { return true; }
//! \todo KB we cannot use the exclude dirs, a minor disadvantege. Also wonder if it was better to parse a QStringList ofr wildcard
return CFileUtils::containsFileNewerThan(cacheTs, this->getRootDirectory(), true, "xsb_aircraft.txt");
}
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;
}
@@ -146,7 +153,7 @@ namespace BlackMisc
{
if (models.containsModelString(model.getModelString()))
{
CLogMessage(static_cast<CAircraftModelLoaderXPlane*>(nullptr)).warning("Model %1 exists already! Potential model string conflict! Ignoring it.") << model.getModelString();
CLogMessage(static_cast<CAircraftModelLoaderXPlane *>(nullptr)).warning("Model %1 exists already! Potential model string conflict! Ignoring it.") << model.getModelString();
}
models.push_back(model);
}
@@ -216,7 +223,6 @@ namespace BlackMisc
m_cslPackages.clear();
QDir searchPath(rootDirectory, "xsb_aircraft.txt");
QDirIterator it(searchPath, QDirIterator::Subdirectories);
while (it.hasNext())
@@ -282,14 +288,6 @@ namespace BlackMisc
return installedModels;
}
bool CAircraftModelLoaderXPlane::existsDir(const QString &directory) const
{
if (directory.isEmpty()) { return false; }
QDir dir(directory);
//! \todo not available network dir can make this hang here
return dir.exists();
}
bool CAircraftModelLoaderXPlane::doPackageSub(QString &ioPath)
{
for (auto i = m_cslPackages.begin(); i != m_cslPackages.end(); ++i)
@@ -353,7 +351,7 @@ namespace BlackMisc
{
line = stream.readLine();
}
while(line.isEmpty() && !stream.atEnd());
while (line.isEmpty() && !stream.atEnd());
return line;
}
@@ -376,7 +374,7 @@ namespace BlackMisc
// Get obj header
QFile objFile(fullPath);
if(!objFile.open(QIODevice::ReadOnly | QIODevice::Text))
if (!objFile.open(QIODevice::ReadOnly | QIODevice::Text))
{
CLogMessage(this).warning("Object %1 does not exist.") << fullPath;
return false;

View File

@@ -35,37 +35,32 @@ namespace BlackMisc
Q_OBJECT
public:
//! Constructor
CAircraftModelLoaderXPlane();
//! Constructor
CAircraftModelLoaderXPlane(const BlackMisc::Simulation::CSimulatorInfo &simInfo, const QString &rootDirectory, const QStringList &exludes = {});
//! Virtual destructor
virtual ~CAircraftModelLoaderXPlane();
//! Change the directory
bool changeRootDirectory(const QString &directory);
//! Current root directory
QString getRootDirectory() const { return this->m_rootDirectory; }
//! \copydoc IAircraftModelLoader::iconForModel
//! \name Interface functions
//! @{
virtual BlackMisc::CPixmap iconForModel(const QString &modelName, BlackMisc::CStatusMessage &statusMessage) const override;
//! \copydoc IAircraftModelLoader::startLoading
virtual void startLoading(LoadMode mode = ModeBackground) override;
//! \copydoc IAircraftModelLoader::isLoadingFinished
virtual bool isLoadingFinished() const override;
//! \copydoc IAircraftModelLoader::getAircraftModels
virtual BlackMisc::Simulation::CAircraftModelList getAircraftModels() 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:
//! Parsed or injected models
void updateInstalledModels(const BlackMisc::Simulation::CAircraftModelList &models);
protected:
//! \name Interface functions
//! @{
virtual void startLoadingFromDisk(LoadMode mode) override;
//! @}
private:
struct CSLPlane
{
@@ -98,8 +93,6 @@ namespace BlackMisc
BlackMisc::Simulation::CAircraftModelList parseFlyableAirplanes(const QString &rootDirectory, const QStringList &excludeDirectories);
BlackMisc::Simulation::CAircraftModelList parseCslPackages(const QString &rootDirectory, const QStringList &excludeDirectories);
//! Does the directory exist?
bool existsDir(const QString &directory = QString()) const;
bool doPackageSub(QString &ioPath);
bool parseExportCommand(const QStringList &tokens, CSLPackage &package, const QString &path, int lineNum);
@@ -118,8 +111,6 @@ namespace BlackMisc
CSLPackage parsePackageHeader(const QString &path, const QString &content);
void parseFullPackage(const QString &content, CSLPackage &package);
QString m_rootDirectory; //!< root directory parsing aircraft.cfg files
QStringList m_excludedDirectories; //!< directories not to be parsed
QPointer<BlackMisc::CWorker> m_parserWorker; //!< worker will destroy itself, so weak pointer
QVector<CSLPackage> m_cslPackages; //!< Parsed Packages. No lock required since accessed only from one thread
BlackMisc::Simulation::CAircraftModelList m_installedModels;