From bc80fd3bd51ce299a3f6ef5f206b9422432c72ca Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sun, 14 May 2017 15:01:59 +0100 Subject: [PATCH] [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 --- .../xplane/aircraftmodelloaderxplane.cpp | 103 +++++++++--------- .../xplane/aircraftmodelloaderxplane.h | 3 + .../simulator/xplane/simulatorxplane.cpp | 14 +-- .../simulator/xplane/simulatorxplane.h | 3 +- .../xplane/xswiftbusserviceproxy.cpp | 9 ++ .../simulator/xplane/xswiftbusserviceproxy.h | 9 +- src/xswiftbus/service.cpp | 5 +- src/xswiftbus/service.h | 7 +- 8 files changed, 91 insertions(+), 62 deletions(-) diff --git a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp index e800c50cc..980fd53b4 100644 --- a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp +++ b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.cpp @@ -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 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 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); diff --git a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h index 9105ed85f..c8a2ef8d2 100644 --- a/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h +++ b/src/blackmisc/simulation/xplane/aircraftmodelloaderxplane.h @@ -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); diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 064b21f5f..923ca48d6 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -300,18 +300,14 @@ namespace BlackSimPlugin emitSimulatorCombinedStatus(); } - void CSimulatorXPlane::ps_emitOwnAircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao) + void CSimulatorXPlane::ps_emitOwnAircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao, + const QString &modelString, const QString &name, const QString &distributor, const QString &description) { - Q_UNUSED(icao); + Q_UNUSED(distributor); - //! \todo XP, change as appropriate, add resolution of own livery - // try to set correct model and ICAO values here - // thy show up in GUI - CAircraftModel model(getOwnAircraftModel()); - CAirlineIcaoCode airlineIcaoCode(model.getAirlineIcaoCode()); - model.setModelType(CAircraftModel::TypeOwnSimulatorModel); + CAircraftModel model(modelString, CAircraftModel::TypeOwnSimulatorModel, CSimulatorInfo::XPLANE, name, description, icao); + if (!livery.isEmpty()) { model.setModelString(model.getModelString() + " " + livery); } model.setFileName(path + "/" + filename); - model.setLivery(CLivery("XPLANE." + livery, airlineIcaoCode, "XP livery", "", "", false)); this->reverseLookupAndUpdateOwnAircraftModel(model); } diff --git a/src/plugins/simulator/xplane/simulatorxplane.h b/src/plugins/simulator/xplane/simulatorxplane.h index ae6d7267d..ad86c7c0e 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.h +++ b/src/plugins/simulator/xplane/simulatorxplane.h @@ -135,7 +135,8 @@ namespace BlackSimPlugin private slots: void ps_serviceUnregistered(); void ps_setAirportsInRange(const QStringList &icaoCodes, const QStringList &names, const BlackMisc::CSequence &lats, const BlackMisc::CSequence &lons, const BlackMisc::CSequence &alts); - void ps_emitOwnAircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao); + void ps_emitOwnAircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao, + const QString &modelString, const QString &name, const QString &distributor, const QString &description); void ps_fastTimerTimeout(); void ps_slowTimerTimeout(); void ps_installedModelsUpdated(const QStringList &modelStrings, const QStringList &icaos, const QStringList &airlines, const QStringList &liveries); diff --git a/src/plugins/simulator/xplane/xswiftbusserviceproxy.cpp b/src/plugins/simulator/xplane/xswiftbusserviceproxy.cpp index 66a741f14..052b8ad4d 100644 --- a/src/plugins/simulator/xplane/xswiftbusserviceproxy.cpp +++ b/src/plugins/simulator/xplane/xswiftbusserviceproxy.cpp @@ -72,6 +72,15 @@ namespace BlackSimPlugin m_dbusInterface->callDBusAsync(QLatin1String("getAircraftIcaoCode"), setterCallback(o_icaoCode)); } + QString CXSwiftBusServiceProxy::getAircraftDescription() const + { + return m_dbusInterface->callDBusRet(QLatin1String("getAircraftDescription")); + } + void CXSwiftBusServiceProxy::getAircraftDescriptionAsync(QString *o_description) + { + m_dbusInterface->callDBusAsync(QLatin1String("getAircraftDescription"), setterCallback(o_description)); + } + int CXSwiftBusServiceProxy::getXPlaneVersionMajor() const { return m_dbusInterface->callDBusRet(QLatin1String("getXPlaneVersionMajor")); diff --git a/src/plugins/simulator/xplane/xswiftbusserviceproxy.h b/src/plugins/simulator/xplane/xswiftbusserviceproxy.h index d5ee6e44c..20c59be8f 100644 --- a/src/plugins/simulator/xplane/xswiftbusserviceproxy.h +++ b/src/plugins/simulator/xplane/xswiftbusserviceproxy.h @@ -89,7 +89,8 @@ namespace BlackSimPlugin void asyncMethodError(QDBusError error); //! \copydoc XSwiftBus::CService::aircraftModelChanged - void aircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao); + void aircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao, + const QString &modelString, const QString &name, const QString &distributor, const QString &description); //! \copydoc XSwiftBus::CService::airportsInRangeUpdated void airportsInRangeUpdated(const QStringList &icaoCodes, const QStringList &names, const QList &lats, const QList &lons, const QList &alts); @@ -125,6 +126,12 @@ namespace BlackSimPlugin void getAircraftIcaoCodeAsync(QString *o_icaoCode); //! @} + //! \copydoc XSwiftBus::CService::getAircraftDescription + //! @{ + QString getAircraftDescription() const; + void getAircraftDescriptionAsync(QString *o_description); + //! @} + //! \copydoc XSwiftBus::CService::getXPlaneVersionMajor //! @{ int getXPlaneVersionMajor() const; diff --git a/src/xswiftbus/service.cpp b/src/xswiftbus/service.cpp index 92deb96d7..e374701a2 100644 --- a/src/xswiftbus/service.cpp +++ b/src/xswiftbus/service.cpp @@ -8,6 +8,7 @@ */ #include "service.h" +#include "blackmisc/simulation/xplane/aircraftmodelloaderxplane.h" #include #include #include @@ -31,7 +32,9 @@ namespace XSwiftBus char filename[256]; char path[512]; XPLMGetNthAircraftModel(XPLM_USER_AIRCRAFT, filename, path); - emit aircraftModelChanged(path, filename, getAircraftLivery(), getAircraftIcaoCode()); + const auto model = BlackMisc::Simulation::XPlane::CAircraftModelLoaderXPlane::extractAcfProperties(path, QFileInfo(path)); + emit aircraftModelChanged(path, filename, getAircraftLivery(), getAircraftIcaoCode(), + model.getModelString(), model.getName(), model.getDistributor().getDescription(), getAircraftDescription()); } void CService::addTextMessage(const QString &text, double red, double green, double blue) diff --git a/src/xswiftbus/service.h b/src/xswiftbus/service.h index f81512ac7..51698b8eb 100644 --- a/src/xswiftbus/service.h +++ b/src/xswiftbus/service.h @@ -70,7 +70,8 @@ namespace XSwiftBus signals: //! Emitted when the model or livery changes. - void aircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao); + void aircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao, + const QString &modelString, const QString &name, const QString &distributor, const QString &description); //! Airports in range updated. void airportsInRangeUpdated(const QStringList &icaoCodes, const QStringList &names, const QDoubleList &lats, const QDoubleList &lons, const QDoubleList &alts); @@ -94,6 +95,9 @@ namespace XSwiftBus //! Get the ICAO code of the current aircraft model QString getAircraftIcaoCode() const { return m_icao.get().c_str(); } + //! Get the description of the current aircraft model + QString getAircraftDescription() const { return m_descrip.get().c_str(); } + //! Get major version number int getXPlaneVersionMajor() const; @@ -233,6 +237,7 @@ namespace XSwiftBus StringDataRef m_liveryPath; StringDataRef m_icao; + StringDataRef m_descrip; DataRef m_paused; DataRef m_useSystemTime; DataRef m_latitude;