diff --git a/src/blackmisc/simulation/aircraftmodel.cpp b/src/blackmisc/simulation/aircraftmodel.cpp index 21ae52b95..4638be062 100644 --- a/src/blackmisc/simulation/aircraftmodel.cpp +++ b/src/blackmisc/simulation/aircraftmodel.cpp @@ -515,13 +515,55 @@ namespace BlackMisc return pm; } + const QString &CAircraftModel::liveryStringPrefix() + { + static const QString p("swift_"); + return p; + } + + bool CAircraftModel::isSwiftLiyeryString(const QString &liveryString) + { + return (liveryString.length() > liveryStringPrefix().length() && liveryString.startsWith(liveryStringPrefix(), Qt::CaseInsensitive)); + } + QString CAircraftModel::getSwiftLiveryString() const { - const QString cc(this->getLivery().getCombinedCode()); - if (cc.isEmpty() && !this->hasModelString()) { return ""; } - if (cc.isEmpty()) { return this->getModelString(); } - if (!this->hasModelString()) { return cc; } - return cc + " [" + this->getModelString() + "]"; + const QString l = + (this->getLivery().hasValidDbKey() ? QStringLiteral("l") % this->getLivery().getDbKeyAsString() : QStringLiteral("")) % + (this->getAircraftIcaoCode().hasValidDbKey() ? QStringLiteral("a") % this->getAircraftIcaoCode().getDbKeyAsString() : QStringLiteral("")) % + (this->hasValidDbKey() ? QStringLiteral("m") % this->getDbKeyAsString() : QStringLiteral("")); + + return l.isEmpty() ? QStringLiteral("") : liveryStringPrefix() % l; + } + + DBTripleIds CAircraftModel::parseNetworkLiveryString(const QString &liveryString) + { + // "swift_m22l33a11" + if (!CAircraftModel::isSwiftLiyeryString(liveryString)) {return DBTripleIds(); } + + DBTripleIds ids; + const QString ls = liveryString.mid(liveryStringPrefix().length()).toLower(); + for (int c = 0; c < ls.length(); c++) + { + const QChar m = ls[c]; + if ((m == 'm' || m == 'a' || m == 'l') && (c + 1) < ls.length()) + { + const int cs = c + 1; + int cc = cs; + while (cc < ls.length() && ls[cc].isDigit()) { cc++; } // find end of id + if (cc > cs) + { + const QString idString = ls.mid(cs, cc - cs); + const int id = idString.toInt(); + c = cc - 1; // +1 again in for + + if (m == 'm') { ids.model = id; } + else if (m == 'a') { ids.aircraft = id; } + else if (m == 'l') { ids.livery = id; } + } + } + } + return ids; } void CAircraftModel::updateMissingParts(const CAircraftModel &otherModel, bool dbModelPriority) @@ -922,37 +964,6 @@ namespace BlackMisc return model; } - QStringList CAircraftModel::splitNetworkLiveryString(const QString &liveryString) - { - QStringList liveryModelStrings({ "", "" }); - if (liveryString.isEmpty()) { return liveryModelStrings; } - const QString l(liveryString.toUpper().trimmed()); - if (liveryString.contains('[') && liveryString.contains(']')) - { - // seems to be a valid swift string - const QStringList split = l.split("["); - if (split.size() > 0) - { - liveryModelStrings[0] = split[0].trimmed(); - } - if (split.size() > 1) - { - QString m = split[1]; - m.replace('[', ' '); - m.replace(']', ' '); - liveryModelStrings[1] = m.trimmed(); - } - } - else - { - if (CLivery::isValidCombinedCode(l)) - { - liveryModelStrings[0] = l; - } - } - return liveryModelStrings; - } - const QString &CAircraftModel::autoGenerated() { static const QString ag("swift auto generated"); diff --git a/src/blackmisc/simulation/aircraftmodel.h b/src/blackmisc/simulation/aircraftmodel.h index 59983a421..b4131aec7 100644 --- a/src/blackmisc/simulation/aircraftmodel.h +++ b/src/blackmisc/simulation/aircraftmodel.h @@ -47,6 +47,20 @@ namespace BlackMisc class CIcon; namespace Simulation { + //! DB ids + struct DBTripleIds + { + int model = -1; //!< model id + int livery = -1; //!< livery id, by that I have airline id + int aircraft = -1; //!< aircraft ICAO id + + //! Any valid id? + bool hasAnyId() const + { + return model >= 0 || livery >= 0 || aircraft >= 0; + } + }; + //! Aircraft model (used by another pilot, my models on disk) //! \remarks Simulator independent class, supposed to be common denominator class BLACKMISC_EXPORT CAircraftModel : @@ -316,8 +330,8 @@ namespace BlackMisc //! Matches given simulator? bool matchesSimulatorFlag(CSimulatorInfo::Simulator simulator) const; - //! swift livery string (to be sent via network), "liveryCode [modelString]"; - //! \sa splitNetworkLiveryString + //! swift livery string (to be sent via network) + //! \sa parseNetworkLiveryString QString getSwiftLiveryString() const; //! Update missing parts from another model @@ -445,10 +459,15 @@ namespace BlackMisc //! From swift DB JSON, caching during this process (faster) static CAircraftModel fromDatabaseJsonCaching(const QJsonObject &json, Aviation::AircraftIcaoIdMap &aircraftIcaos, Aviation::LiveryIdMap &liveries, DistributorIdMap &distributors, const QString &prefix = QString("mod_")); - //! Split swift network string "DLH._STD [modelname]" - //! \return QStringList [0] livery code , [1] model string + //! Livery string prefix + static const QString &liveryStringPrefix(); + + //! swift livery string + static bool isSwiftLiyeryString(const QString &liveryString); + + //! Split swift network string //! \sa getSwiftLiveryString - static QStringList splitNetworkLiveryString(const QString &liveryString); + static DBTripleIds parseNetworkLiveryString(const QString &liveryString); //! Hint, that model was automatically generated (e.g. by auto stashing) static const QString &autoGenerated();