Ref T515, validate aircraft config values

This commit is contained in:
Klaus Basan
2019-01-18 21:18:40 +01:00
committed by Mat Sutcliffe
parent de680f4fcd
commit f3dd2425ee
2 changed files with 63 additions and 9 deletions

View File

@@ -7,7 +7,8 @@
* contained in the LICENSE file.
*/
#include "blackmisc/simulation/fscommon/fscommonutil.h"
#include "fscommonutil.h"
#include "aircraftcfgparser.h"
#include "blackmisc/directoryutils.h"
#include "blackmisc/fileutils.h"
#include "blackmisc/stringutils.h"
@@ -37,6 +38,12 @@ namespace BlackMisc
{
using FsRegistryPathPair = QList<QPair<QString, QString>>;
const CLogCategoryList &CFsCommonUtil::getLogCategories()
{
static const CLogCategoryList cats({ CLogCategory::validation(), CLogCategory::driver() });
return cats;
}
QString fsxDirFromRegistryImpl()
{
QString fsxPath;
@@ -362,17 +369,16 @@ namespace BlackMisc
int CFsCommonUtil::copyFsxTerrainProbeFiles(const QString &simObjectDir, CStatusMessageList &messages)
{
static const CLogCategoryList cats({ CLogCategory::validation(), CLogCategory::driver() });
messages.clear();
if (!CDirectoryUtils::existsUnemptyDirectory(CDirectoryUtils::shareTerrainProbeDirectory()))
{
messages.push_back(CStatusMessage(cats, CStatusMessage::SeverityError, QStringLiteral("No terrain probe source files in '%1'").arg(CDirectoryUtils::shareTerrainProbeDirectory())));
messages.push_back(CStatusMessage(getLogCategories(), CStatusMessage::SeverityError, QStringLiteral("No terrain probe source files in '%1'").arg(CDirectoryUtils::shareTerrainProbeDirectory())));
return -1;
}
if (simObjectDir.isEmpty())
{
messages.push_back(CStatusMessage(cats, CStatusMessage::SeverityError, "No simObject directory"));
messages.push_back(CStatusMessage(getLogCategories(), CStatusMessage::SeverityError, "No simObject directory"));
return -1;
}
@@ -380,7 +386,7 @@ namespace BlackMisc
QDir td(targetDir);
if (!td.exists())
{
messages.push_back(CStatusMessage(cats, CStatusMessage::SeverityError, QStringLiteral("Cannot access target directory '%1'").arg(targetDir)));
messages.push_back(CStatusMessage(getLogCategories(), CStatusMessage::SeverityError, QStringLiteral("Cannot access target directory '%1'").arg(targetDir)));
return -1;
}
@@ -389,12 +395,12 @@ namespace BlackMisc
const bool hasDir = td.mkpath(targetDir);
if (!hasDir)
{
messages.push_back(CStatusMessage(cats, CStatusMessage::SeverityError, QStringLiteral("Cannot create target directory '%1'").arg(targetDir)));
messages.push_back(CStatusMessage(getLogCategories(), CStatusMessage::SeverityError, QStringLiteral("Cannot create target directory '%1'").arg(targetDir)));
return -1;
}
const int copied = CDirectoryUtils::copyDirectoryRecursively(CDirectoryUtils::shareTerrainProbeDirectory(), targetDir, true);
messages.push_back(CStatusMessage(cats, CStatusMessage::SeverityInfo, QStringLiteral("Copied %1 files from '%2' to '%3'").arg(copied).arg(CDirectoryUtils::shareTerrainProbeDirectory(), targetDir)));
messages.push_back(CStatusMessage(getLogCategories(), CStatusMessage::SeverityInfo, QStringLiteral("Copied %1 files from '%2' to '%3'").arg(copied).arg(CDirectoryUtils::shareTerrainProbeDirectory(), targetDir)));
return copied;
}
@@ -489,7 +495,7 @@ namespace BlackMisc
QStringList files;
for (const QString &path : locations)
{
QString file = CFileUtils::appendFilePaths(CFileUtils::pathUp(path), "Microsoft/FSX/fsx.cfg");
const QString file = CFileUtils::appendFilePaths(CFileUtils::pathUp(path), "Microsoft/FSX/fsx.cfg");
const QFileInfo fi(file);
if (fi.exists()) { files.push_back(fi.absoluteFilePath()); }
}
@@ -536,6 +542,45 @@ namespace BlackMisc
}
return paths;
}
CStatusMessageList CFsCommonUtil::validateConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmpty, int stopAtFailedFiles, bool &stopped)
{
CAircraftModelList sorted(models);
sorted.sortByFileName();
stopped = false;
CStatusMessageList msgs = sorted.validateFiles(validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, stopped, true);
if (stopped || validModels.isEmpty()) { return msgs; }
const int d = validModels.removeIfNotFsFamily();
if (d > 0)
{
const CStatusMessage m = CStatusMessage(getLogCategories(), CStatusMessage::SeverityError, QStringLiteral("Removed %1 non FS family models").arg(d), true);
msgs.push_back(m);
}
// all those files should work
int removedCfgEntries = 0;
const QSet<QString> fileNames = validModels.getAllFileNames();
for (const QString &fileName : fileNames)
{
bool ok = false;
const CAircraftCfgEntriesList entries = CAircraftCfgParser::performParsingOfSingleFile(fileName, ok, msgs);
const CAircraftModelList removedModels = validModels.removeIfFileButNotInSet(fileName, entries.getTitleSetUpperCase());
for (const CAircraftModel &removedModel : removedModels)
{
removedCfgEntries++;
const CStatusMessage m = CStatusMessage(getLogCategories(), CStatusMessage::SeverityError, QStringLiteral("'%1', removed because no longer in '%1'").arg(removedModel.getModelStringAndDbKey(), removedModel.getFileName()), true);
msgs.push_back(m);
}
}
if (removedCfgEntries < 1)
{
const CStatusMessage m = CStatusMessage(getLogCategories(), CStatusMessage::SeverityInfo, QStringLiteral("Not removed any models, all OK!"), true);
msgs.push_back(m);
}
return msgs;
}
} // namespace
} // namespace
} // namespace

View File

@@ -12,8 +12,10 @@
#ifndef BLACKMISC_SIMULATION_FSCOMMONUTIL_H
#define BLACKMISC_SIMULATION_FSCOMMONUTIL_H
#include "blackmisc/simulation/aircraftmodel.h"
#include "blackmisc/simulation/aircraftmodellist.h"
#include "blackmisc/logcategorylist.h"
#include "blackmisc/blackmiscexport.h"
#include <QSet>
#include <QStringList>
@@ -27,6 +29,9 @@ namespace BlackMisc
class BLACKMISC_EXPORT CFsCommonUtil
{
public:
//! Log categories
static const BlackMisc::CLogCategoryList &getLogCategories();
//! Constructor
CFsCommonUtil() = delete;
@@ -121,6 +126,10 @@ namespace BlackMisc
//! Get all the SimObjects files from fsx.cfg
// SimObjectPaths.0=SimObjects\Airplanes
static QSet<QString> fsxSimObjectsPaths(const QString &fsxFile, bool checked);
//! Validate aircraft.cfg entries
//! \remark only for FSX/P3D/FS9 models
static CStatusMessageList validateConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmpty, int stopAtFailedFiles, bool &stopped);
};
} // namespace
} // namespace