diff --git a/src/blackmisc/simulation/aircraftmodelloader.cpp b/src/blackmisc/simulation/aircraftmodelloader.cpp index 6045c23bd..a6d998334 100644 --- a/src/blackmisc/simulation/aircraftmodelloader.cpp +++ b/src/blackmisc/simulation/aircraftmodelloader.cpp @@ -61,7 +61,7 @@ namespace BlackMisc { return make_unique( CSimulatorInfo(CSimulatorInfo::XPLANE), - CXPlaneUtil::xbusLegacyDir()); + CXPlaneUtil::xplaneRootDir()); } else { diff --git a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp index a1f50b754..0ccb45331 100644 --- a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp +++ b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -123,6 +124,82 @@ namespace BlackMisc } CAircraftModelList CAircraftModelLoaderXPlane::performParsing(const QString &rootDirectory, const QStringList &excludeDirectories) + { + CAircraftModelList allModels; + allModels.push_back(parseCslPackages(CXPlaneUtil::xbusLegacyDir(), excludeDirectories)); + allModels.push_back(parseFlyableAirplanes(rootDirectory, excludeDirectories)); + return allModels; + } + + //! Add model only if there no other model with the same model string + void addUniqueModel(const CAircraftModel &model, CAircraftModelList &models) + { + if (models.containsModelString(model.getModelString())) + { + CLogMessage(static_cast(nullptr)).warning("Model %1 exists already! Potential model string conflict! Ignoring it.") << model.getModelString(); + } + models.push_back(model); + } + + CAircraftModelList CAircraftModelLoaderXPlane::parseFlyableAirplanes(const QString &rootDirectory, const QStringList &excludeDirectories) + { + Q_UNUSED(excludeDirectories); + if (rootDirectory.isEmpty()) { return {}; } + + QDir searchPath(rootDirectory, "*.acf"); + QDirIterator aircraftIt(searchPath, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks); + + CAircraftModelList installedModels; + while (aircraftIt.hasNext()) + { + aircraftIt.next(); + + // for the default model and for the liveries + QString modelString = QString("%1 %2").arg(aircraftIt.fileInfo().dir().dirName(), aircraftIt.fileInfo().baseName()); + + CAircraftModel model; + model.setModelType(CAircraftModel::TypeOwnSimulatorModel); + model.setSimulatorInfo(m_simulatorInfo); + model.setFileName(aircraftIt.filePath()); + model.setModelString(modelString); + + QFile file(aircraftIt.filePath()); + file.open(QIODevice::ReadOnly | QIODevice::Text); + + QTextStream ts(&file); + if (ts.readLine() == "I" && ts.readLine().contains("version") && ts.readLine() == "ACF") + { + while (!ts.atEnd()) + { + QString line = ts.readLine(); + QStringList tokens = line.split(' '); + if (tokens.size() != 3) { continue; } + if (tokens.at(1) == "acf/_ICAO") + { + CAircraftIcaoCode icao(tokens.at(2)); + model.setAircraftIcaoCode(icao); + break; + } + } + } + file.close(); + + addUniqueModel(model, installedModels); + + QDirIterator liveryIt(aircraftIt.fileInfo().canonicalPath() + "/liveries", QDir::Dirs | QDir::NoDotAndDotDot); + while (liveryIt.hasNext()) + { + liveryIt.next(); + QString modelStringWithLivery = modelString + liveryIt.fileName(); + model.setModelString(modelStringWithLivery); + + addUniqueModel(model, installedModels); + } + } + return installedModels; + } + + CAircraftModelList CAircraftModelLoaderXPlane::parseCslPackages(const QString &rootDirectory, const QStringList &excludeDirectories) { Q_UNUSED(excludeDirectories); QStringList packages; diff --git a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h index d1869b4b6..10eea194a 100644 --- a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h +++ b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h @@ -89,6 +89,9 @@ namespace BlackMisc }; BlackMisc::Simulation::CAircraftModelList performParsing(const QString &rootDirectory, const QStringList &excludeDirectories); + BlackMisc::Simulation::CAircraftModelList parseFlyableAirplanes(const QString &rootDirectory, const QStringList &excludeDirectories); + BlackMisc::Simulation::CAircraftModelList parseCslPackages(const QString &rootDirectory, const QStringList &excludeDirectories); + //! Does the directory exist? bool existsDir(const QString &directory = QString()) const; bool doPackageSub(QString &ioPath);