diff --git a/src/blackcore/aircraftmatcher.cpp b/src/blackcore/aircraftmatcher.cpp index a382f8c93..2c3015325 100644 --- a/src/blackcore/aircraftmatcher.cpp +++ b/src/blackcore/aircraftmatcher.cpp @@ -51,24 +51,39 @@ namespace BlackCore const CCallsign &callsign, const QString &primaryIcao, const QString &secondaryIcao, bool airlineFromCallsign, bool useWebServices, CStatusMessageList *log) { - CMatchingUtils::addLogDetailsToList(log, callsign, QString("Find airline designator from 1st: '%1' 2nd: '%2', callsign airline: %3 web service: %4").arg(primaryIcao, secondaryIcao, boolToYesNo(airlineFromCallsign), boolToYesNo(useWebServices)), getLogCategories()); - if (CAircraftMatcher::isValidAirlineIcaoDesignator(primaryIcao, useWebServices)) { return CAirlineIcaoCode(primaryIcao); } - if (CAircraftMatcher::isValidAirlineIcaoDesignator(secondaryIcao, useWebServices)) + CMatchingUtils::addLogDetailsToList(log, callsign, + QString("Find airline designator from 1st: '%1' 2nd: '%2' callsign: '%3', use airline callsign: %4, use web service: %5"). + arg(primaryIcao, secondaryIcao, callsign.getAirlineSuffix(), boolToYesNo(airlineFromCallsign), boolToYesNo(useWebServices)), getLogCategories()); + CAirlineIcaoCode code; + do { - CMatchingUtils::addLogDetailsToList(log, callsign, QString("Using secondary airline ICAO '%1', primary '%2' not valid").arg(secondaryIcao, primaryIcao), getLogCategories()); - return CAirlineIcaoCode(secondaryIcao); - } - if (airlineFromCallsign) - { - const QString airlineSuffix = callsign.getAirlineSuffix(); - if (CAircraftMatcher::isValidAirlineIcaoDesignator(airlineSuffix, useWebServices)) + if (CAircraftMatcher::isValidAirlineIcaoDesignator(primaryIcao, useWebServices)) { - CMatchingUtils::addLogDetailsToList(log, callsign, QString("Using airline from callsign '%1', suffix: '%2'").arg(callsign.toQString(), airlineSuffix), getLogCategories()); - return CAirlineIcaoCode(airlineSuffix); + code = stringToAirlineIcaoObject(primaryIcao, useWebServices); + break; + } + if (CAircraftMatcher::isValidAirlineIcaoDesignator(secondaryIcao, useWebServices)) + { + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Using secondary airline ICAO '%1', primary '%2' not valid").arg(secondaryIcao, primaryIcao), getLogCategories()); + code = stringToAirlineIcaoObject(secondaryIcao, useWebServices); + break; + } + + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Two invalid airline ICAO codes '%1', '%2'").arg(primaryIcao, secondaryIcao), getLogCategories()); + if (airlineFromCallsign) + { + const QString airlineSuffix = callsign.getAirlineSuffix(); + if (CAircraftMatcher::isValidAirlineIcaoDesignator(airlineSuffix, useWebServices)) + { + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Using airline from callsign '%1', suffix: '%2'").arg(callsign.toQString(), airlineSuffix), getLogCategories()); + code = stringToAirlineIcaoObject(airlineSuffix, useWebServices); + break; + } } } - CMatchingUtils::addLogDetailsToList(log, callsign, QString("Two invalid airline ICAO codes '%1', '%2'").arg(primaryIcao, secondaryIcao), getLogCategories()); - return CAirlineIcaoCode(); + while (false); + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Resolved to airline designator: %1").arg(code.toQString(true))); + return code; } CAircraftModel CAircraftMatcher::getClosestMatch(const CSimulatedAircraft &remoteAircraft, CStatusMessageList *log) const @@ -318,7 +333,7 @@ namespace BlackCore else if (foundIcaos.size() == 1) { const CAircraftIcaoCode icao(foundIcaos.front()); - CMatchingUtils::addLogDetailsToList(log, logCallsign, QString("Reverse lookup of aircraft ICAO '%1'', found one manufacturer '%2'").arg(designator, icao.getDesignatorManufacturer()), CAircraftMatcher::getLogCategories()); + CMatchingUtils::addLogDetailsToList(log, logCallsign, QString("Reverse lookup of aircraft ICAO '%1'', found one manufacturer '%2' in DB").arg(designator, icao.getDesignatorManufacturer()), CAircraftMatcher::getLogCategories()); return icao; } else @@ -347,8 +362,8 @@ namespace BlackCore const CAirlineIcaoCode icao = sApp->getWebDataServices()->smartAirlineIcaoSelector(icaoPattern, callsign); if (log) { - if (icao.hasValidDbKey()) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup of airline ICAO '%1' and callsign '%2' found '%3' '%4'").arg(icaoPattern.getDesignator(), callsign.asString(), icao.getVDesignatorDbKey(), icao.getName()), CAircraftMatcher::getLogCategories()); } - else { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup of airline ICAO '%1' and callsign '%2', nothing found").arg(icaoPattern.getDesignator(), callsign.asString()), CAircraftMatcher::getLogCategories()); } + if (icao.hasValidDbKey()) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup of airline ICAO '%1' and callsign '%2' found '%3' '%4' in DB").arg(icaoPattern.getDesignator(), callsign.asString(), icao.getVDesignatorDbKey(), icao.getName()), CAircraftMatcher::getLogCategories()); } + else { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup of airline ICAO '%1' and callsign '%2', nothing found in DB").arg(icaoPattern.getDesignator(), callsign.asString()), CAircraftMatcher::getLogCategories()); } } return icao; } @@ -368,7 +383,7 @@ namespace BlackCore if (log) { if (livery.hasValidDbKey()) { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Reverse lookup of standard livery for '%1' found '%2'").arg(airline.getDesignator(), livery.getCombinedCode()), CAircraftMatcher::getLogCategories()); } - else { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Not standard livery for airline '%1'").arg(airline.getDesignator()), CAircraftMatcher::getLogCategories()); } + else { CMatchingUtils::addLogDetailsToList(log, callsign, QString("Not standard livery for airline '%1' in DB").arg(airline.getDesignator()), CAircraftMatcher::getLogCategories()); } } return livery; } @@ -381,11 +396,11 @@ namespace BlackCore const QStringList names = sApp->getWebDataServices()->getAirlineNames(); if (names.contains(candidate, Qt::CaseInsensitive)) { - CMatchingUtils::addLogDetailsToList(log, callsign, QString("Airline name '%1' found").arg(candidate)); + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Airline name '%1' found in DB").arg(candidate)); return candidate; } - CMatchingUtils::addLogDetailsToList(log, callsign, QString("Airline name '%1' not found").arg(candidate)); + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Airline name '%1' not found in DB").arg(candidate)); return ""; } @@ -1010,6 +1025,14 @@ namespace BlackCore return str; } + CAirlineIcaoCode CAircraftMatcher::stringToAirlineIcaoObject(const QString &designator, bool useSwiftDbData) + { + if (!useSwiftDbData) { return CAirlineIcaoCode(designator); } + if (!sApp || sApp->isShuttingDown() || !sApp->hasWebDataServices()) { return CAirlineIcaoCode(designator); } + CAirlineIcaoCode code = sApp->getWebDataServices()->getAirlineIcaoCodeForUniqueDesignatorOrDefault(designator, true); + return code.isLoadedFromDb() ? code : CAirlineIcaoCode(designator); + } + bool CAircraftMatcher::isValidAirlineIcaoDesignator(const QString &designator, bool checkAgainstSwiftDb) { if (!CAirlineIcaoCode::isValidAirlineDesignator(designator)) { return false; } diff --git a/src/blackcore/aircraftmatcher.h b/src/blackcore/aircraftmatcher.h index f3a746280..4a763883e 100644 --- a/src/blackcore/aircraftmatcher.h +++ b/src/blackcore/aircraftmatcher.h @@ -209,6 +209,10 @@ namespace BlackCore //! \threadsafe static QString scoresToString(const BlackMisc::Simulation::ScoredModels &scores, int lastElements = 5); + //! Designator to object + //! \threadsafe + static BlackMisc::Aviation::CAirlineIcaoCode stringToAirlineIcaoObject(const QString &designator, bool useSwiftDbData); + //! Valid designator, allows to check against swift DB //! \threadsafe static bool isValidAirlineIcaoDesignator(const QString &designator, bool checkAgainstSwiftDb); diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index c6de0d167..82b3899e9 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -926,26 +926,43 @@ namespace BlackCore CAircraftModel::ModelType type, CStatusMessageList *log) { const CFlightPlanRemarks fpRemarks = this->tryToGetFlightPlanRemarks(callsign); - CAirlineIcaoCode airlineIcao = CAircraftMatcher::failoverValidAirlineIcaoDesignator(callsign, airlineIcaoString, fpRemarks.getAirlineIcao(), true, true, log); + if (fpRemarks.isEmpty()) + { + CMatchingUtils::addLogDetailsToList(log, callsign, QStringLiteral("No flight plan remarks")); + } + else + { + CMatchingUtils::addLogDetailsToList(log, callsign, QString("FP remarks: '%1'").arg(fpRemarks.getRemarks())); + CMatchingUtils::addLogDetailsToList(log, callsign, QString("FP rem.parsed: '%1'").arg(fpRemarks.toQString(true))); + } - CAircraftIcaoCode aircraftIcao(aircraftIcaoString); - if (fpRemarks.hasParsedAirlineRemarks()) + CAirlineIcaoCode airlineIcao = CAircraftMatcher::failoverValidAirlineIcaoDesignator(callsign, airlineIcaoString, fpRemarks.getAirlineIcao().getDesignator(), true, true, log); + if (!airlineIcao.isLoadedFromDb() && fpRemarks.hasParsedAirlineRemarks()) { const QString airlineName = CAircraftMatcher::reverseLookupAirlineName(fpRemarks.getFlightOperator(), callsign, log); if (!airlineName.isEmpty()) { - airlineIcao.setName(airlineName); - CMatchingUtils::addLogDetailsToList(log, callsign, QString("Setting airline name '%1'").arg(airlineName), getLogCategories()); + const QString resolvedAirlineName = CAircraftMatcher::reverseLookupAirlineName(airlineName); + airlineIcao.setName(resolvedAirlineName); + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Setting resolved airline name '%1' from '%2'").arg(resolvedAirlineName, airlineName), getLogCategories()); } const QString telephony = CAircraftMatcher::reverseLookupTelephonyDesignator(fpRemarks.getRadioTelephony(), callsign, log); if (!telephony.isEmpty()) { - airlineIcao.setTelephonyDesignator(telephony); - CMatchingUtils::addLogDetailsToList(log, callsign, QString("Setting telephoy designator '%1'").arg(telephony), getLogCategories()); + const QString resolvedTelephony = CAircraftMatcher::reverseLookupTelephonyDesignator(telephony); + airlineIcao.setTelephonyDesignator(resolvedTelephony); + CMatchingUtils::addLogDetailsToList(log, callsign, QString("Setting resolved telephoy designator '%1' from '%2'").arg(resolvedTelephony, telephony), getLogCategories()); } } + if (!airlineIcao.isLoadedFromDb()) + { + // already try to resolve at this stage by a smart lookup with all the filled data from above + airlineIcao = CAircraftMatcher::reverseLookupAirlineIcao(airlineIcao, callsign, log); + } + + const CAircraftIcaoCode aircraftIcao(aircraftIcaoString); return CAircraftMatcher::reverseLookupModel(callsign, aircraftIcao, airlineIcao, livery, modelString, type, log); }