mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-01 13:36:48 +08:00
[feature][XPlane] Set own aircraft model string when own aircraft changes.
Summary: Refactored parts of CAircraftModelLoaderXPlane::parseFlyableAirplanes into static method extractAcfProperties that can be called by xswiftbus. Used extractAcfProperties in xswiftbus to provide the model string to the driver. Implemented CSimulatorXPlane::ps_emitOwnAircraftModelChanged. Implements T74. Reviewers: rwinklmeier Reviewed By: rwinklmeier Subscribers: jenkins Tags: #swift_pilot_client Differential Revision: https://dev.swift-project.org/D23
This commit is contained in:
@@ -211,7 +211,7 @@ namespace BlackMisc
|
||||
aircraftIt.next();
|
||||
if (CFileUtils::isExcludedDirectory(aircraftIt.fileInfo(), excludeDirectories, Qt::CaseInsensitive)) { continue; }
|
||||
|
||||
CAircraftModel model;
|
||||
CAircraftModel model = extractAcfProperties(aircraftIt.filePath(), aircraftIt.fileInfo());
|
||||
model.setModelType(CAircraftModel::TypeOwnSimulatorModel);
|
||||
model.setSimulator(this->getSimulator());
|
||||
model.setFileName(aircraftIt.filePath());
|
||||
@@ -219,54 +219,6 @@ namespace BlackMisc
|
||||
model.setUtcTimestamp(lastModifiedTs);
|
||||
model.setFileTimestamp(lastModifiedTs);
|
||||
model.setModelMode(CAircraftModel::Exclude);
|
||||
|
||||
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())
|
||||
{
|
||||
const QString line = ts.readLine();
|
||||
QVector<QStringRef> tokens = line.splitRef(' ', QString::SkipEmptyParts);
|
||||
if (tokens.size() < 3 || tokens.at(0) != QLatin1String("P")) { continue; }
|
||||
if (tokens.at(1) == QLatin1String("acf/_ICAO"))
|
||||
{
|
||||
const CAircraftIcaoCode icao(tokens.at(2).toString());
|
||||
model.setAircraftIcaoCode(icao);
|
||||
}
|
||||
else if (tokens.at(1) == QLatin1String("acf/_descrip"))
|
||||
{
|
||||
const QString desc(line.mid(tokens.at(2).position()));
|
||||
model.setDescription("[ACF] " % desc);
|
||||
}
|
||||
else if (tokens.at(1) == QLatin1String("acf/_name"))
|
||||
{
|
||||
const QString name(line.mid(tokens.at(2).position()));
|
||||
model.setName(name);
|
||||
}
|
||||
else if (tokens.at(1) == QLatin1String("acf/_studio"))
|
||||
{
|
||||
const CDistributor dist({}, line.mid(tokens.at(2).position()), {}, {}, CSimulatorInfo::XPLANE);
|
||||
model.setDistributor(dist);
|
||||
}
|
||||
else if (tokens.at(1) == QLatin1String("acf/_author"))
|
||||
{
|
||||
if (model.getDistributor().hasDescription()) { continue; }
|
||||
const thread_local QRegularExpression end("\\W\\s", QRegularExpression::UseUnicodePropertiesOption);
|
||||
QString author = line.mid(tokens.at(2).position());
|
||||
author = author.left(author.indexOf(end)).trimmed();
|
||||
if (author.isEmpty()) { continue; }
|
||||
const CDistributor dist({}, author, {}, {}, CSimulatorInfo::XPLANE);
|
||||
model.setDistributor(dist);
|
||||
}
|
||||
}
|
||||
}
|
||||
file.close();
|
||||
|
||||
model.setModelString(stringForFlyableModel(model, aircraftIt.fileInfo()));
|
||||
if (!model.hasDescription()) { model.setDescription(descriptionForFlyableModel(model)); }
|
||||
addUniqueModel(model, installedModels);
|
||||
|
||||
const QString baseModelString = model.getModelString();
|
||||
@@ -281,6 +233,59 @@ namespace BlackMisc
|
||||
return installedModels;
|
||||
}
|
||||
|
||||
BlackMisc::Simulation::CAircraftModel CAircraftModelLoaderXPlane::extractAcfProperties(const QString &filePath, const QFileInfo &fileInfo)
|
||||
{
|
||||
BlackMisc::Simulation::CAircraftModel model;
|
||||
QFile file(filePath);
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return model; }
|
||||
|
||||
QTextStream ts(&file);
|
||||
if (ts.readLine() == "I" && ts.readLine().contains("version") && ts.readLine() == "ACF")
|
||||
{
|
||||
while (!ts.atEnd())
|
||||
{
|
||||
const QString line = ts.readLine();
|
||||
QVector<QStringRef> tokens = line.splitRef(' ', QString::SkipEmptyParts);
|
||||
if (tokens.size() < 3 || tokens.at(0) != QLatin1String("P")) { continue; }
|
||||
if (tokens.at(1) == QLatin1String("acf/_ICAO"))
|
||||
{
|
||||
const CAircraftIcaoCode icao(tokens.at(2).toString());
|
||||
model.setAircraftIcaoCode(icao);
|
||||
}
|
||||
else if (tokens.at(1) == QLatin1String("acf/_descrip"))
|
||||
{
|
||||
const QString desc(line.mid(tokens.at(2).position()));
|
||||
model.setDescription("[ACF] " % desc);
|
||||
}
|
||||
else if (tokens.at(1) == QLatin1String("acf/_name"))
|
||||
{
|
||||
const QString name(line.mid(tokens.at(2).position()));
|
||||
model.setName(name);
|
||||
}
|
||||
else if (tokens.at(1) == QLatin1String("acf/_studio"))
|
||||
{
|
||||
const CDistributor dist({}, line.mid(tokens.at(2).position()), {}, {}, CSimulatorInfo::XPLANE);
|
||||
model.setDistributor(dist);
|
||||
}
|
||||
else if (tokens.at(1) == QLatin1String("acf/_author"))
|
||||
{
|
||||
if (model.getDistributor().hasDescription()) { continue; }
|
||||
const thread_local QRegularExpression end("\\W\\s", QRegularExpression::UseUnicodePropertiesOption);
|
||||
QString author = line.mid(tokens.at(2).position());
|
||||
author = author.left(author.indexOf(end)).trimmed();
|
||||
if (author.isEmpty()) { continue; }
|
||||
const CDistributor dist({}, author, {}, {}, CSimulatorInfo::XPLANE);
|
||||
model.setDistributor(dist);
|
||||
}
|
||||
}
|
||||
}
|
||||
file.close();
|
||||
|
||||
model.setModelString(stringForFlyableModel(model, fileInfo));
|
||||
if (!model.hasDescription()) { model.setDescription(descriptionForFlyableModel(model)); }
|
||||
return model;
|
||||
}
|
||||
|
||||
CAircraftModelList CAircraftModelLoaderXPlane::parseCslPackages(const QString &rootDirectory, const QStringList &excludeDirectories)
|
||||
{
|
||||
Q_UNUSED(excludeDirectories);
|
||||
|
||||
@@ -52,6 +52,9 @@ namespace BlackMisc
|
||||
virtual bool isLoadingFinished() const override;
|
||||
//! @}
|
||||
|
||||
//! Extract from an acf file (flyable plane) the properties needed to generate model string.
|
||||
static BlackMisc::Simulation::CAircraftModel extractAcfProperties(const QString &filePath, const QFileInfo &fileInfo);
|
||||
|
||||
public slots:
|
||||
//! Parsed or injected models
|
||||
void updateInstalledModels(const BlackMisc::Simulation::CAircraftModelList &models);
|
||||
|
||||
Reference in New Issue
Block a user