Ref T660, FSX path handling

* exclude paths from exclude patterns
* check for *air file
* use absolute paths
This commit is contained in:
Klaus Basan
2019-07-10 03:11:16 +02:00
committed by Mat Sutcliffe
parent 878a207f85
commit 242bea3636
4 changed files with 40 additions and 10 deletions

View File

@@ -436,7 +436,7 @@ namespace BlackMisc
bool CDirectoryUtils::containsFileInDir(const QString &dir, const QString &filter, bool recursively) bool CDirectoryUtils::containsFileInDir(const QString &dir, const QString &filter, bool recursively)
{ {
QDir directory(dir); const QDir directory(dir);
if (!directory.exists()) { return false; } if (!directory.exists()) { return false; }
const QStringList nameFilter({ filter }); const QStringList nameFilter({ filter });

View File

@@ -176,7 +176,7 @@ namespace BlackMisc
// the sim.cfg/aircraft.cfg file should have an *.air file sibling // the sim.cfg/aircraft.cfg file should have an *.air file sibling
// if not we assume these files can be ignored // if not we assume these files can be ignored
const QDir dirForAir(directory, QStringLiteral("*.air"), QDir::Name, QDir::Files | QDir::NoDotAndDotDot); const QDir dirForAir(directory, CFsCommonUtil::airFileFilter(), QDir::Name, QDir::Files | QDir::NoDotAndDotDot);
const int airFilesCount = dirForAir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot, QDir::DirsLast).size(); const int airFilesCount = dirForAir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot, QDir::DirsLast).size();
const bool hasAirFile = airFilesCount > 0; const bool hasAirFile = airFilesCount > 0;

View File

@@ -577,7 +577,7 @@ namespace BlackMisc
QSet<QString> paths; QSet<QString> paths;
for (const QString &fsxFile : fsxFiles) for (const QString &fsxFile : fsxFiles)
{ {
paths.unite(fsxSimObjectsPaths(fsxFile, checked)); paths.unite(CFsCommonUtil::fsxSimObjectsPaths(fsxFile, checked));
} }
return paths; return paths;
} }
@@ -589,6 +589,9 @@ namespace BlackMisc
const QList<QStringRef> lines = splitLinesRefs(fileContent); const QList<QStringRef> lines = splitLinesRefs(fileContent);
static const QString p("SimObjectPaths."); static const QString p("SimObjectPaths.");
const QFileInfo fsxFileInfo(fsxFile);
const QString relPath = fsxFileInfo.absolutePath();
QSet<QString> paths; QSet<QString> paths;
for (const QStringRef &line : lines) for (const QStringRef &line : lines)
{ {
@@ -597,14 +600,32 @@ namespace BlackMisc
const int i2 = line.lastIndexOf('='); const int i2 = line.lastIndexOf('=');
if (i2 < 0 || i1 >= i2 || line.endsWith('=')) { continue; } if (i2 < 0 || i1 >= i2 || line.endsWith('=')) { continue; }
const QStringRef path = line.mid(i2 + 1); const QStringRef path = line.mid(i2 + 1);
const QString soPath = QDir::fromNativeSeparators(path.toString()); QString soPath = QDir::fromNativeSeparators(path.toString());
const QFileInfo fi(soPath); if (logConfigPathReading()) { CLogMessage(getLogCategories()).info(u"FSX SimObjects path checked: '%1' in '%2'") << line << fsxFile; }
// relative or absolute paths // ignore exclude patterns
const QString p = (fi.isAbsolute() && (!checked || fi.exists())) ? if (containsAny(soPath, CFsCommonUtil::fsxSimObjectsExcludeDirectoryPatterns(), Qt::CaseInsensitive)) { continue; }
fi.absolutePath() : soPath;
paths.insert(p); // make absolute
if (logConfigPathReading()) { CLogMessage(getLogCategories()).info(u"FSX SimObjects path: '%1'") << p; } if (!soPath.left(3).contains(':')) { soPath = CFileUtils::appendFilePaths(relPath, soPath); }
const QDir p(soPath); // always absolute path now
if (checked && !p.exists())
{
// skip, not existing
if (logConfigPathReading()) { CLogMessage(getLogCategories()).info(u"FSX SimObjects path skipped, not existing: '%1' in '%2'") << p.absolutePath() << fsxFile; }
continue;
}
const QString afp = p.absolutePath().toLower();
if (!CDirectoryUtils::containsFileInDir(afp, airFileFilter(), true))
{
if (logConfigPathReading()) { CLogMessage(getLogCategories()).info(u"FSX SimObjects path: Skipping '%1' from '%2', no '%3' file") << afp << fsxFile << airFileFilter(); }
continue;
}
paths.insert(afp);
if (logConfigPathReading()) { CLogMessage(getLogCategories()).info(u"FSX SimObjects path: '%1' from '%2'") << afp << fsxFile; }
} }
return paths; return paths;
} }
@@ -685,6 +706,12 @@ namespace BlackMisc
return CFsCommonUtil::validateSimObjectsPath(simObjectPaths, models, validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, stopped); return CFsCommonUtil::validateSimObjectsPath(simObjectPaths, models, validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, stopped);
} }
const QString CFsCommonUtil::airFileFilter()
{
static const QString a("*.air");
return a;
}
CStatusMessageList CFsCommonUtil::validateSimObjectsPath( CStatusMessageList CFsCommonUtil::validateSimObjectsPath(
const QSet<QString> &simObjectDirs, const CAircraftModelList &models, const QSet<QString> &simObjectDirs, const CAircraftModelList &models,
CAircraftModelList &validModels, CAircraftModelList &invalidModels, CAircraftModelList &validModels, CAircraftModelList &invalidModels,

View File

@@ -149,6 +149,9 @@ namespace BlackMisc
//! \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 &stopped, const QString &simulatorDir);
//! .air file filter
static const QString airFileFilter();
private: private:
//! Utility functions @{ //! Utility functions @{
static QSet<QString> findP3dConfigFiles(const QString &configFile, const QString &versionHint = "v4"); static QSet<QString> findP3dConfigFiles(const QString &configFile, const QString &versionHint = "v4");