Allow some long lasting validation functions to be stopped/interrupted from "outside"

This commit is contained in:
Klaus Basan
2020-02-29 19:22:23 +01:00
committed by Mat Sutcliffe
parent f3bfaa3179
commit 049ded16cc
6 changed files with 24 additions and 21 deletions

View File

@@ -1527,9 +1527,9 @@ namespace BlackMisc
return msgs; return msgs;
} }
CStatusMessageList CAircraftModelList::validateFiles(CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped, const QString &simRootDirectory, bool alreadySortedByFn) const CStatusMessageList CAircraftModelList::validateFiles(CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped, const QString &simRootDirectory, bool alreadySortedByFn) const
{ {
stopped = false; wasStopped = false;
CStatusMessageList msgs; CStatusMessageList msgs;
QSet<QString> failedFiles; QSet<QString> failedFiles;
@@ -1549,6 +1549,7 @@ namespace BlackMisc
for (const CAircraftModel &model : as_const(sorted)) for (const CAircraftModel &model : as_const(sorted))
{ {
if (wasStopped) { break; } // allow breaking from external
bool ok = false; bool ok = false;
do do
{ {
@@ -1600,7 +1601,7 @@ namespace BlackMisc
CAircraftModelList::addAsValidOrInvalidModel(model, ok, validModels, invalidModels); CAircraftModelList::addAsValidOrInvalidModel(model, ok, validModels, invalidModels);
if (stopAtFailedFiles > 0 && failedFilesCount >= stopAtFailedFiles) if (stopAtFailedFiles > 0 && failedFilesCount >= stopAtFailedFiles)
{ {
stopped = true; wasStopped = true;
msgs.push_back(CStatusMessage(this).validationWarning(u"Stopping after %1 failed files") << failedFilesCount); msgs.push_back(CStatusMessage(this).validationWarning(u"Stopping after %1 failed files") << failedFilesCount);
break; break;
} }

View File

@@ -509,7 +509,7 @@ namespace BlackMisc
CStatusMessageList validateDistributors(const CDistributorList &distributors, CAircraftModelList &validModels, CAircraftModelList &invalidModels) const; CStatusMessageList validateDistributors(const CDistributorList &distributors, CAircraftModelList &validModels, CAircraftModelList &invalidModels) const;
//! Validate files (file exists etc.) //! Validate files (file exists etc.)
CStatusMessageList validateFiles(CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped, const QString &simRootDirectory, bool alreadySortedByFn = false) const; CStatusMessageList validateFiles(CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped, const QString &simRootDirectory, bool alreadySortedByFn = false) const;
//! To compact JSON format //! To compact JSON format
QJsonObject toMemoizedJson() const; QJsonObject toMemoizedJson() const;

View File

@@ -140,7 +140,7 @@ namespace BlackMisc
return ok ? dir.absoluteFilePath(fn) : ""; return ok ? dir.absoluteFilePath(fn) : "";
} }
CStatusMessageList CAircraftModelUtilities::validateModelFiles(const CSimulatorInfo &simulator, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmpty, int stopAtFailedFiles, bool &stopped, const QString &simulatorDir) CStatusMessageList CAircraftModelUtilities::validateModelFiles(const CSimulatorInfo &simulator, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmpty, int stopAtFailedFiles, bool &wasStopped, const QString &simulatorDir)
{ {
// some generic tests // some generic tests
CStatusMessageList msgs; CStatusMessageList msgs;
@@ -170,27 +170,27 @@ namespace BlackMisc
CStatusMessageList specificTests; CStatusMessageList specificTests;
if (simulator.isMicrosoftOrPrepare3DSimulator() || models.isLikelyFsFamilyModelList()) if (simulator.isMicrosoftOrPrepare3DSimulator() || models.isLikelyFsFamilyModelList())
{ {
const CStatusMessageList specificTests1 = FsCommon::CFsCommonUtil::validateAircraftConfigFiles(models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, stopped); const CStatusMessageList specificTests1 = FsCommon::CFsCommonUtil::validateAircraftConfigFiles(models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped);
specificTests.push_back(specificTests1); specificTests.push_back(specificTests1);
if (simulator.isP3D()) if (simulator.isP3D())
{ {
const CStatusMessageList specificTests2 = FsCommon::CFsCommonUtil::validateP3DSimObjectsPath(models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, stopped, simulatorDir); const CStatusMessageList specificTests2 = FsCommon::CFsCommonUtil::validateP3DSimObjectsPath(models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped, simulatorDir);
specificTests.push_back(specificTests2); specificTests.push_back(specificTests2);
} }
else if (simulator.isFSX()) else if (simulator.isFSX())
{ {
const CStatusMessageList specificTests2 = FsCommon::CFsCommonUtil::validateFSXSimObjectsPath(models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, stopped, simulatorDir); const CStatusMessageList specificTests2 = FsCommon::CFsCommonUtil::validateFSXSimObjectsPath(models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped, simulatorDir);
specificTests.push_back(specificTests2); specificTests.push_back(specificTests2);
} }
} }
else if (simulator.isXPlane() || models.isLikelyXPlaneModelList()) else if (simulator.isXPlane() || models.isLikelyXPlaneModelList())
{ {
specificTests = models.validateFiles(validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, stopped, simulatorDir); specificTests = models.validateFiles(validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped, simulatorDir);
} }
else else
{ {
specificTests = models.validateFiles(validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, stopped, {}); specificTests = models.validateFiles(validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped, {});
} }
msgs.push_back(specificTests); msgs.push_back(specificTests);

View File

@@ -36,7 +36,7 @@ namespace BlackMisc
static QString createIcaoAirlineAircraftHtmlMatrixFile(const BlackMisc::Simulation::CAircraftModelList &models, const QString &tempDir); static QString createIcaoAirlineAircraftHtmlMatrixFile(const BlackMisc::Simulation::CAircraftModelList &models, const QString &tempDir);
//! Validate aircraft.cfg entries //! Validate aircraft.cfg entries
static CStatusMessageList validateModelFiles(const CSimulatorInfo &simulator, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmpty, int stopAtFailedFiles, bool &stopped, const QString &simulatorDir); static CStatusMessageList validateModelFiles(const CSimulatorInfo &simulator, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmpty, int stopAtFailedFiles, bool &wasStopped, const QString &simulatorDir);
}; };
} //namespace } //namespace
} // namespace } // namespace

View File

@@ -639,14 +639,14 @@ namespace BlackMisc
return paths; return paths;
} }
CStatusMessageList CFsCommonUtil::validateAircraftConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped) CStatusMessageList CFsCommonUtil::validateAircraftConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped)
{ {
CStatusMessage m; CStatusMessage m;
CAircraftModelList sorted(models); CAircraftModelList sorted(models);
sorted.sortByFileName(); sorted.sortByFileName();
stopped = false; wasStopped = false;
CStatusMessageList msgs = sorted.validateFiles(validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, stopped, QString(), true); CStatusMessageList msgs = sorted.validateFiles(validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, wasStopped, QString(), true);
if (stopped || validModels.isEmpty()) { return msgs; } if (wasStopped || validModels.isEmpty()) { return msgs; }
const CAircraftModelList nonFsModels = validModels.findNonFsFamilyModels(); const CAircraftModelList nonFsModels = validModels.findNonFsFamilyModels();
if (!nonFsModels.isEmpty()) if (!nonFsModels.isEmpty())
@@ -655,6 +655,7 @@ namespace BlackMisc
{ {
m = CStatusMessage(getLogCategories(), CStatusMessage::SeverityError, QStringLiteral("Removed '%1' non FS family model").arg(model.getModelStringAndDbKey()), true); m = CStatusMessage(getLogCategories(), CStatusMessage::SeverityError, QStringLiteral("Removed '%1' non FS family model").arg(model.getModelStringAndDbKey()), true);
msgs.push_back(m); msgs.push_back(m);
if (wasStopped) { break; } // allow to break from "outside"
} }
const int d = validModels.removeIfNotFsFamily(); const int d = validModels.removeIfNotFsFamily();
@@ -668,6 +669,7 @@ namespace BlackMisc
for (const QString &fileName : fileNames) for (const QString &fileName : fileNames)
{ {
bool ok = false; bool ok = false;
if (wasStopped) { break; } // allow to break from "outside"
const CAircraftCfgEntriesList entries = CAircraftCfgParser::performParsingOfSingleFile(fileName, ok, msgs); const CAircraftCfgEntriesList entries = CAircraftCfgParser::performParsingOfSingleFile(fileName, ok, msgs);
const QSet<QString> removeModelStrings = entries.getTitleSetUpperCase(); const QSet<QString> removeModelStrings = entries.getTitleSetUpperCase();
const CAircraftModelList removedModels = validModels.removeIfFileButNotInSet(fileName, removeModelStrings); const CAircraftModelList removedModels = validModels.removeIfFileButNotInSet(fileName, removeModelStrings);
@@ -701,16 +703,16 @@ namespace BlackMisc
return msgs; return msgs;
} }
CStatusMessageList CFsCommonUtil::validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped, const QString &simulatorDir) CStatusMessageList CFsCommonUtil::validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped, const QString &simulatorDir)
{ {
const QString simObjectsDir = simulatorDir.isEmpty() ? CFsCommonUtil::p3dSimObjectsDir() : CFsCommonUtil::p3dSimObjectsDirFromSimDir(simulatorDir); const QString simObjectsDir = simulatorDir.isEmpty() ? CFsCommonUtil::p3dSimObjectsDir() : CFsCommonUtil::p3dSimObjectsDirFromSimDir(simulatorDir);
const QStringList simObjectPaths = CFsCommonUtil::p3dSimObjectsDirPlusAddOnXmlSimObjectsPaths(simObjectsDir, "v4"); const QStringList simObjectPaths = CFsCommonUtil::p3dSimObjectsDirPlusAddOnXmlSimObjectsPaths(simObjectsDir, "v4");
return CFsCommonUtil::validateSimObjectsPath(QSet<QString>(simObjectPaths.begin(), simObjectPaths.end()), models, validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, stopped); return CFsCommonUtil::validateSimObjectsPath(QSet<QString>(simObjectPaths.begin(), simObjectPaths.end()), models, validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, wasStopped);
} }
CStatusMessageList CFsCommonUtil::validateFSXSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped, const QString &simulatorDir) CStatusMessageList CFsCommonUtil::validateFSXSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped, const QString &simulatorDir)
{ {
Q_UNUSED(simulatorDir); Q_UNUSED(simulatorDir)
const QStringList simObjectPaths = CFsCommonUtil::fsxSimObjectsDirPlusAddOnXmlSimObjectsPaths(); const QStringList simObjectPaths = CFsCommonUtil::fsxSimObjectsDirPlusAddOnXmlSimObjectsPaths();
return CFsCommonUtil::validateSimObjectsPath(QSet<QString>(simObjectPaths.begin(), simObjectPaths.end()), models, validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, stopped); return CFsCommonUtil::validateSimObjectsPath(QSet<QString>(simObjectPaths.begin(), simObjectPaths.end()), models, validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, stopped);
} }

View File

@@ -139,15 +139,15 @@ namespace BlackMisc
//! Validate aircraft.cfg entries (sometimes also sim.cfg) //! Validate aircraft.cfg entries (sometimes also sim.cfg)
//! \remark only for FSX/P3D/FS9 models //! \remark only for FSX/P3D/FS9 models
static CStatusMessageList validateAircraftConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped); static CStatusMessageList validateAircraftConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped);
//! Validate if known SimObjects path are used //! Validate if known SimObjects path are used
//! \remark only for P3D //! \remark only for P3D
static CStatusMessageList validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped, const QString &simulatorDir); static CStatusMessageList validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped, const QString &simulatorDir);
//! Validate if known SimObjects path are used //! Validate if known SimObjects path are used
//! \remark only for FSX //! \remark only for FSX
static CStatusMessageList validateFSXSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped, const QString &simulatorDir); static CStatusMessageList validateFSXSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &wasStopped, const QString &simulatorDir);
//! .air file filter //! .air file filter
static const QString airFileFilter(); static const QString airFileFilter();