diff --git a/src/blackcore/db/icaodatareader.cpp b/src/blackcore/db/icaodatareader.cpp index bfad70095..8f804a1f0 100644 --- a/src/blackcore/db/icaodatareader.cpp +++ b/src/blackcore/db/icaodatareader.cpp @@ -96,10 +96,10 @@ namespace BlackCore return this->getAirlineIcaoCodes().findByKey(key); } - CAirlineIcaoCode CIcaoDataReader::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern) const + CAirlineIcaoCode CIcaoDataReader::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign) const { CAirlineIcaoCodeList codes(this->getAirlineIcaoCodes()); // thread safe copy - return codes.smartAirlineIcaoSelector(icaoPattern); + return codes.smartAirlineIcaoSelector(icaoPattern, callsign); } int CIcaoDataReader::getAircraftIcaoCodesCount() const diff --git a/src/blackcore/db/icaodatareader.h b/src/blackcore/db/icaodatareader.h index cdf286e5a..28a8f060b 100644 --- a/src/blackcore/db/icaodatareader.h +++ b/src/blackcore/db/icaodatareader.h @@ -91,7 +91,7 @@ namespace BlackCore //! Get best match for incomplete airline ICAO code //! \threadsafe - BlackMisc::Aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const BlackMisc::Aviation::CAirlineIcaoCode &icaoPattern) const; + BlackMisc::Aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const BlackMisc::Aviation::CAirlineIcaoCode &icaoPattern, const BlackMisc::Aviation::CCallsign &callsign = BlackMisc::Aviation::CCallsign()) const; //! Get aircraft ICAO information count //! \threadsafe diff --git a/src/blackcore/webdataservices.cpp b/src/blackcore/webdataservices.cpp index 3cf01d3c7..faa2b3666 100644 --- a/src/blackcore/webdataservices.cpp +++ b/src/blackcore/webdataservices.cpp @@ -345,9 +345,9 @@ namespace BlackCore return 0; } - CAirlineIcaoCode CWebDataServices::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern) const + CAirlineIcaoCode CWebDataServices::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign) const { - if (m_icaoDataReader) { return m_icaoDataReader->smartAirlineIcaoSelector(icaoPattern); } + if (m_icaoDataReader) { return m_icaoDataReader->smartAirlineIcaoSelector(icaoPattern, callsign); } return CAirlineIcaoCode(); } @@ -415,11 +415,10 @@ namespace BlackCore void CWebDataServices::gracefulShutdown() { this->disconnect(); // all signals - if (this->m_vatsimStatusReader) { this->m_vatsimStatusReader->gracefulShutdown(); } + if (this->m_vatsimMetarReader) { this->m_vatsimMetarReader->gracefulShutdown(); } if (this->m_vatsimBookingReader) { this->m_vatsimBookingReader->gracefulShutdown(); } if (this->m_vatsimDataFileReader) { this->m_vatsimDataFileReader->gracefulShutdown(); } if (this->m_vatsimStatusReader) { this->m_vatsimStatusReader->gracefulShutdown(); } - if (this->m_vatsimMetarReader) { this->m_vatsimMetarReader->gracefulShutdown(); } if (this->m_modelDataReader) { this->m_modelDataReader->gracefulShutdown(); } if (this->m_icaoDataReader) { this->m_icaoDataReader->gracefulShutdown(); } if (this->m_infoDataReader) { this->m_infoDataReader->gracefulShutdown(); } diff --git a/src/blackcore/webdataservices.h b/src/blackcore/webdataservices.h index a5008cfc4..5fae65c6a 100644 --- a/src/blackcore/webdataservices.h +++ b/src/blackcore/webdataservices.h @@ -244,7 +244,7 @@ namespace BlackCore //! Smart airline selector //! \threadsafe - BlackMisc::Aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const BlackMisc::Aviation::CAirlineIcaoCode &code) const; + BlackMisc::Aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const BlackMisc::Aviation::CAirlineIcaoCode &code, const BlackMisc::Aviation::CCallsign &callsign = BlackMisc::Aviation::CCallsign()) const; //! ICAO code for callsign (e.g. DLH123 -> DLH) //! \threadsafe diff --git a/src/blackmisc/aviation/airlineicaocode.cpp b/src/blackmisc/aviation/airlineicaocode.cpp index 90ee41074..34c9f56a0 100644 --- a/src/blackmisc/aviation/airlineicaocode.cpp +++ b/src/blackmisc/aviation/airlineicaocode.cpp @@ -7,7 +7,8 @@ * contained in the LICENSE file. */ -#include "blackmisc/aviation/airlineicaocode.h" +#include "airlineicaocode.h" +#include "callsign.h" #include "blackmisc/comparefunctions.h" #include "blackmisc/db/datastoreutility.h" #include "blackmisc/icons.h" @@ -33,11 +34,21 @@ namespace BlackMisc { CAirlineIcaoCode::CAirlineIcaoCode(const QString &airlineDesignator) : m_designator(airlineDesignator.trimmed().toUpper()) - {} + { + if (this->m_designator.length() == 4) + { + this->setDesignator(this->m_designator); + } + } CAirlineIcaoCode::CAirlineIcaoCode(const QString &airlineDesignator, const QString &airlineName, const BlackMisc::CCountry &country, const QString &telephony, bool virtualAirline, bool operating) : m_designator(airlineDesignator.trimmed().toUpper()), m_name(airlineName), m_country(country), m_telephonyDesignator(telephony), m_isVa(virtualAirline), m_isOperating(operating) - {} + { + if (this->m_designator.length() == 4) + { + this->setDesignator(this->m_designator); + } + } const QString CAirlineIcaoCode::getVDesignator() const { @@ -281,6 +292,30 @@ namespace BlackMisc return s.append(" ").append(getDbKeyAsStringInParentheses()); } + CAirlineIcaoCode CAirlineIcaoCode::thisOrCallsignCode(const CCallsign &callsign) const + { + if (this->hasValidDbKey()) { return *this; } + if (callsign.isEmpty()) { return *this; } + const QString callsignAirline = callsign.getAirlineSuffix(); + if (callsignAirline.isEmpty()) { return *this; } + if (callsignAirline == this->m_designator) { return *this; } + + const CAirlineIcaoCode callsignIcao(callsignAirline); + if (this->m_designator.isEmpty()) { return callsignIcao; } + + // here we have 2 possible codes + if (callsignIcao.isVirtualAirline()) + { + + if (callsignIcao.getDesignator().endsWith(this->m_designator)) + { + // callsign ICAO is virtual airline of myself, this is more accurate + return callsignIcao; + } + } + return *this; + } + QString CAirlineIcaoCode::getNameWithKey() const { if (!hasValidDbKey()) { return getName(); } diff --git a/src/blackmisc/aviation/airlineicaocode.h b/src/blackmisc/aviation/airlineicaocode.h index 0f2c3898a..2f2ad186b 100644 --- a/src/blackmisc/aviation/airlineicaocode.h +++ b/src/blackmisc/aviation/airlineicaocode.h @@ -30,6 +30,8 @@ namespace BlackMisc { namespace Aviation { + class CCallsign; + //! Value object for ICAO classification class BLACKMISC_EXPORT CAirlineIcaoCode : public CValueObject, @@ -156,6 +158,9 @@ namespace BlackMisc //! Comined string with key QString getCombinedStringWithKey() const; + //! What is better, the callsign airline code or this code + CAirlineIcaoCode thisOrCallsignCode(const CCallsign &callsign) const; + //! \copydoc BlackMisc::Mixin::Icon::toIcon CIcon toIcon() const; diff --git a/src/blackmisc/aviation/airlineicaocodelist.cpp b/src/blackmisc/aviation/airlineicaocodelist.cpp index aee37f27a..ef6cf8cf4 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.cpp +++ b/src/blackmisc/aviation/airlineicaocodelist.cpp @@ -88,35 +88,36 @@ namespace BlackMisc }); } - CAirlineIcaoCode CAirlineIcaoCodeList::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern) const + CAirlineIcaoCode CAirlineIcaoCodeList::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign) const { - if (icaoPattern.hasValidDbKey()) + const CAirlineIcaoCode patternUsed = icaoPattern.thisOrCallsignCode(callsign); + if (patternUsed.hasValidDbKey()) { return this->findByKey(icaoPattern.getDbKey(), icaoPattern); } // search by parts CAirlineIcaoCodeList codes; - if (icaoPattern.hasValidDesignator()) + if (patternUsed.hasValidDesignator()) { - codes = this->findByVDesignator(icaoPattern.getVDesignator()); + codes = this->findByVDesignator(patternUsed.getVDesignator()); } else { - codes = this->findByIataCode(icaoPattern.getIataCode()); + codes = this->findByIataCode(patternUsed.getIataCode()); } if (codes.size() == 1) { return codes.front(); } // further reduce - if (icaoPattern.hasValidCountry()) + if (patternUsed.hasValidCountry()) { - CAirlineIcaoCodeList countryCodes = codes.findByCountryIsoCode(icaoPattern.getCountry().getIsoCode()); + CAirlineIcaoCodeList countryCodes = codes.findByCountryIsoCode(patternUsed.getCountry().getIsoCode()); if (!countryCodes.isEmpty()) { return countryCodes.front(); } } if (!codes.isEmpty()) { return codes.front(); } - return icaoPattern; + return patternUsed; } CAirlineIcaoCode CAirlineIcaoCodeList::findBestMatchByCallsign(const CCallsign &callsign) const diff --git a/src/blackmisc/aviation/airlineicaocodelist.h b/src/blackmisc/aviation/airlineicaocodelist.h index 4230c9534..2b523d882 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.h +++ b/src/blackmisc/aviation/airlineicaocodelist.h @@ -70,7 +70,7 @@ namespace BlackMisc CAirlineIcaoCodeList findByMilitary(bool military) const; //! Best selection by given pattern - CAirlineIcaoCode smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern) const; + CAirlineIcaoCode smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign) const; //! Use callsign to conclude airline CAirlineIcaoCode findBestMatchByCallsign(const CCallsign &callsign) const;