From f3dd2425ee59344b49f0d632cd9ce6e132463290 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 18 Jan 2019 21:18:40 +0100 Subject: [PATCH] Ref T515, validate aircraft config values --- .../simulation/fscommon/fscommonutil.cpp | 61 ++++++++++++++++--- .../simulation/fscommon/fscommonutil.h | 11 +++- 2 files changed, 63 insertions(+), 9 deletions(-) diff --git a/src/blackmisc/simulation/fscommon/fscommonutil.cpp b/src/blackmisc/simulation/fscommon/fscommonutil.cpp index e0eba1d77..89f7ec4e6 100644 --- a/src/blackmisc/simulation/fscommon/fscommonutil.cpp +++ b/src/blackmisc/simulation/fscommon/fscommonutil.cpp @@ -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>; + 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 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 diff --git a/src/blackmisc/simulation/fscommon/fscommonutil.h b/src/blackmisc/simulation/fscommon/fscommonutil.h index ef8cd39c4..083272428 100644 --- a/src/blackmisc/simulation/fscommon/fscommonutil.h +++ b/src/blackmisc/simulation/fscommon/fscommonutil.h @@ -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 #include @@ -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 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