Ref T660, FSX/P3D config file functions

This commit is contained in:
Klaus Basan
2019-06-08 22:10:43 +02:00
committed by Mat Sutcliffe
parent 08fcc54695
commit 3510e20290
3 changed files with 134 additions and 22 deletions

View File

@@ -23,7 +23,7 @@ namespace BlackSample
const QSet<QString> configFiles = CFsCommonUtil::findP3dAddOnConfigFiles("v4");
streamOut << BlackMisc::joinStringSet(configFiles, ", ") << endl;
const QSet<QString> addOnPaths = CFsCommonUtil::allP3dAddOnPaths(configFiles.toList(), false);
const QSet<QString> addOnPaths = CFsCommonUtil::allConfigFilesPathValues(configFiles.toList(), false, {});
streamOut << BlackMisc::joinStringSet(addOnPaths, ", ") << endl;
const QSet<QString> simObjectPaths = CFsCommonUtil::fsxSimObjectsPaths("B:/fsx.cfg", false);

View File

@@ -206,7 +206,7 @@ namespace BlackMisc
{
QString dir(CFsCommonUtil::p3dDir());
if (dir.isEmpty()) { return {}; }
return CFsCommonUtil::fsxSimObjectsDirFromSimDir(dir);
return CFsCommonUtil::p3dSimObjectsDirFromSimDir(dir);
}
const QString &CFsCommonUtil::p3dSimObjectsDir()
@@ -404,6 +404,18 @@ namespace BlackMisc
}
QSet<QString> CFsCommonUtil::findP3dAddOnConfigFiles(const QString &versionHint)
{
static const QString cfgFile("add-ons.cfg");
return CFsCommonUtil::findP3dConfigFiles(cfgFile, versionHint);
}
QSet<QString> CFsCommonUtil::findP3dSimObjectsConfigFiles(const QString &versionHint)
{
static const QString cfgFile("simobjects.cfg");
return CFsCommonUtil::findP3dConfigFiles(cfgFile, versionHint);
}
QSet<QString> CFsCommonUtil::findP3dConfigFiles(const QString &configFile, const QString &versionHint)
{
const QStringList locations = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation);
QSet<QString> files;
@@ -413,16 +425,15 @@ namespace BlackMisc
const QDir d(pathUp);
if (!d.exists()) { continue; }
// all version sub directories
// looking for "add-ons.cfg"
static const QString cfgFile("add-ons.cfg");
// all versions sub directories
// looking for "add-ons.cfg" or simobjects.cfg
const QStringList entries = d.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
for (const QString &entry : entries)
{
// right version or just one file
if (entry.contains(versionHint, Qt::CaseInsensitive))
{
const QString f = CFileUtils::appendFilePaths(d.absolutePath(), entry, cfgFile);
const QString f = CFileUtils::appendFilePaths(d.absolutePath(), entry, configFile);
const QFileInfo fi(f);
if (fi.exists()) { files.insert(f); }
}
@@ -431,11 +442,11 @@ namespace BlackMisc
return files;
}
QSet<QString> CFsCommonUtil::allP3dAddOnPaths(const QStringList &addOnConfigsFiles, bool checked)
QSet<QString> CFsCommonUtil::allConfigFilesPathValues(const QStringList &configFiles, bool checked, const QString &pathPrefix)
{
if (addOnConfigsFiles.isEmpty()) { return QSet<QString>(); }
if (configFiles.isEmpty()) { return QSet<QString>(); }
QSet<QString> paths;
for (const QString &configFile : addOnConfigsFiles)
for (const QString &configFile : configFiles)
{
// manually parsing because QSettings did not work properly
const QString fileContent = CFileUtils::readFileToString(configFile);
@@ -444,10 +455,10 @@ namespace BlackMisc
static const QString p("PATH=");
for (const QStringRef &line : lines)
{
const int i = line.lastIndexOf(p, Qt::CaseInsensitive);
const int i = line.lastIndexOf(p, -1, Qt::CaseInsensitive);
if (i < 0 || line.endsWith('=')) { continue; }
const QStringRef path = line.mid(i + p.length());
const QDir dir(QDir::fromNativeSeparators(path.toString()));
const QDir dir(QDir::fromNativeSeparators(pathPrefix.isEmpty() ? path.toString() : CFileUtils::appendFilePathsAndFixUnc(pathPrefix, path.toString())));
if (!checked || dir.exists()) { paths.insert(dir.absolutePath()); }
}
}
@@ -483,11 +494,25 @@ namespace BlackMisc
QSet<QString> CFsCommonUtil::allP3dAddOnSimObjectPaths(const QString &versionHint)
{
const QStringList configFiles = CFsCommonUtil::findP3dAddOnConfigFiles(versionHint).toList();
const QStringList addOnPaths = CFsCommonUtil::allP3dAddOnPaths(configFiles, true).toList();
const QStringList addOnPaths = CFsCommonUtil::allConfigFilesPathValues(configFiles, true, {}).toList();
const QSet<QString> all = CFsCommonUtil::allP3dAddOnSimObjectPaths(addOnPaths, true);
return all;
}
QSet<QString> CFsCommonUtil::allP3dSimObjectsConfigPaths(const QString &simulatorDir, const QString &versionHint)
{
const QStringList configFiles = CFsCommonUtil::findP3dSimObjectsConfigFiles(versionHint).toList();
return CFsCommonUtil::allConfigFilesPathValues(configFiles, true, simulatorDir);
}
QSet<QString> CFsCommonUtil::allP3dSimObjectPaths(const QString &simulatorDir, const QString &versionHint)
{
const QSet<QString> configFiles = CFsCommonUtil::allP3dSimObjectsConfigPaths(simulatorDir, versionHint);
const QSet<QString> addOnFiles = CFsCommonUtil::allP3dAddOnSimObjectPaths(versionHint);
QSet<QString> all(configFiles);
return all.unite(addOnFiles);
}
QStringList CFsCommonUtil::findFsxConfigFiles()
{
const QStringList locations = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation);
@@ -521,7 +546,7 @@ namespace BlackMisc
QSet<QString> paths;
for (const QStringRef &line : lines)
{
const int i1 = line.lastIndexOf(p, Qt::CaseInsensitive);
const int i1 = line.lastIndexOf(p, -1, Qt::CaseInsensitive);
if (i1 < 0) { continue; }
const int i2 = line.lastIndexOf('=');
if (i2 < 0 || i1 >= i2 || line.endsWith('=')) { continue; }
@@ -544,8 +569,8 @@ namespace BlackMisc
CStatusMessageList CFsCommonUtil::validateConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped)
{
CAircraftModelList sorted(models);
CStatusMessage m;
CAircraftModelList sorted(models);
sorted.sortByFileName();
stopped = false;
CStatusMessageList msgs = sorted.validateFiles(validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, stopped, "", true);
@@ -579,8 +604,8 @@ namespace BlackMisc
removedCfgEntries++;
m = CStatusMessage(getLogCategories(), CStatusMessage::SeverityError, QStringLiteral("'%1' removed because no longer in '%2'").arg(removedModel.getModelStringAndDbKey(), removedModel.getFileName()), true);
msgs.push_back(m);
CAircraftModelList::addAsValidOrInvalidModel(removedModel, false, validModels, invalidModels);
}
invalidModels.push_back(removedModels);
}
if (removedCfgEntries < 1)
@@ -604,9 +629,72 @@ namespace BlackMisc
return msgs;
}
CStatusMessageList CFsCommonUtil::validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped)
CStatusMessageList CFsCommonUtil::validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped, const QString &simulatorDir)
{
return {};
const QSet<QString> simObjectDirs = CFsCommonUtil::allP3dSimObjectPaths(simulatorDir, "v4");
return CFsCommonUtil::validateSimObjectsPath(simObjectDirs, models, validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, stopped);
}
CStatusMessageList CFsCommonUtil::validateFSXSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped)
{
const QSet<QString> simObjectDirs = CFsCommonUtil::fsxSimObjectsPaths(CFsCommonUtil::findFsxConfigFiles(), true);
return CFsCommonUtil::validateSimObjectsPath(simObjectDirs, models, validModels, invalidModels, ignoreEmptyFileNames, stopAtFailedFiles, stopped);
}
CStatusMessageList CFsCommonUtil::validateSimObjectsPath(const QSet<QString> &simObjectDirs, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped)
{
CAircraftModelList sorted(models);
sorted.sortByFileName();
CStatusMessageList msgs;
if (sorted.isEmpty())
{
msgs.push_back(CStatusMessage(getLogCategories()).validationInfo(u"No models to validate"));
return msgs;
}
if (simObjectDirs.isEmpty())
{
msgs.push_back(CStatusMessage(getLogCategories()).validationInfo(u"No SimObject directories from cfg files, skipping validation"));
return msgs;
}
// info
msgs.push_back(CStatusMessage(getLogCategories()).validationInfo(u"Validating %1 models against %2 SimObject paths: %3") << models.size() << simObjectDirs.size() << joinStringSet(simObjectDirs, ", "));
// validate
int failed = 0;
for (const CAircraftModel &model : models)
{
if (!model.hasFileName())
{
if (ignoreEmptyFileNames) { continue; }
msgs.push_back(CStatusMessage(getLogCategories()).validationWarning(u"No file name for model '%1'") << model.getModelString());
CAircraftModelList::addAsValidOrInvalidModel(model, false, validModels, invalidModels);
continue;
}
bool ok = false;
for (const QString &path : simObjectDirs)
{
if (!model.isInPath(path, CFileUtils::osFileNameCaseSensitivity())) { continue; }
ok = true;
break;
}
CAircraftModelList::addAsValidOrInvalidModel(model, ok, validModels, invalidModels);
if (!ok)
{
msgs.push_back(CStatusMessage(getLogCategories()).validationWarning(u"Model '%1' '%2' in none of the %3 paths") << model.getModelString() << model.getFileName() << simObjectDirs.size());
failed++;
}
if (stopAtFailedFiles > 0 && failed >= stopAtFailedFiles)
{
stopped = true;
msgs.push_back(CStatusMessage(getLogCategories()).validationWarning(u"Stopping after %1 failed models") << failed);
break;
}
} // models
return msgs;
}
} // namespace
} // namespace

View File

@@ -105,8 +105,13 @@ namespace BlackMisc
//! \param versionHint like "v4"
static QSet<QString> findP3dAddOnConfigFiles(const QString &versionHint = "v4");
//! All add-on paths from the config files
static QSet<QString> allP3dAddOnPaths(const QStringList &addOnConfigsFiles, bool checked);
//! Find the config files (simobjects.cfg)
//! \note "C:/Users/Joe Doe/AppData/Roaming/Lockheed Martin/Prepar3D v4"
//! \param versionHint like "v4"
static QSet<QString> findP3dSimObjectsConfigFiles(const QString &versionHint = "v4");
//! All PATH values from the config files
static QSet<QString> allConfigFilesPathValues(const QStringList &configFiles, bool checked, const QString &pathPrefix);
//! All add-on paths from the config files
static QSet<QString> allP3dAddOnSimObjectPaths(const QStringList &addOnPaths, bool checked);
@@ -114,11 +119,17 @@ namespace BlackMisc
//! All add-on paths from the config files
static QSet<QString> allP3dAddOnSimObjectPaths(const QString &versionHint = "v4");
//! All paths from the simobjects.cfg files
static QSet<QString> allP3dSimObjectsConfigPaths(const QString &simulatorDir, const QString &versionHint = "v4");
//! All add-on paths from the config files and the simobjects.cfg files
static QSet<QString> allP3dSimObjectPaths(const QString &simulatorDir, const QString &versionHint = "v4");
//! Find the config files (fsx.cfg)
// C:/Users/Joe Doe/AppData/Roaming/Lockheed Martin/Prepar3D v4
static QStringList findFsxConfigFiles();
//! Get all the SimObjects files from fsx.cfg
//! Get all the SimObjects paths from fsx.cfg
// SimObjectPaths.0=SimObjects\Airplanes
static QSet<QString> fsxSimObjectsPaths(const QStringList &fsxFiles, bool checked);
@@ -130,9 +141,22 @@ namespace BlackMisc
//! \remark only for FSX/P3D/FS9 models
static CStatusMessageList validateConfigFiles(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped);
//! Validate if known SimObjects path
//! Validate if known SimObjects path are used
//! \remark only for P3D
static CStatusMessageList validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped);
static CStatusMessageList validateP3DSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped, const QString &simulatorDir);
//! Validate if known SimObjects path are used
//! \remark only for FSX
static CStatusMessageList validateFSXSimObjectsPath(const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped);
private:
//! Utility functions @{
static QSet<QString> findP3dConfigFiles(const QString &configFile, const QString &versionHint = "v4");
//! @}
//! Validate if known SimObjects path are used
//! \remark only for P3D
static CStatusMessageList validateSimObjectsPath(const QSet<QString> &simObjectDirs, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool ignoreEmptyFileNames, int stopAtFailedFiles, bool &stopped);
};
} // namespace
} // namespace