refs #707, allow to resolve airline by callsign directly in airline ICAO list

This commit is contained in:
Klaus Basan
2016-07-13 02:50:11 +02:00
parent e497b43e06
commit c7d89c7b2c
8 changed files with 60 additions and 20 deletions

View File

@@ -96,10 +96,10 @@ namespace BlackCore
return this->getAirlineIcaoCodes().findByKey(key); 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 CAirlineIcaoCodeList codes(this->getAirlineIcaoCodes()); // thread safe copy
return codes.smartAirlineIcaoSelector(icaoPattern); return codes.smartAirlineIcaoSelector(icaoPattern, callsign);
} }
int CIcaoDataReader::getAircraftIcaoCodesCount() const int CIcaoDataReader::getAircraftIcaoCodesCount() const

View File

@@ -91,7 +91,7 @@ namespace BlackCore
//! Get best match for incomplete airline ICAO code //! Get best match for incomplete airline ICAO code
//! \threadsafe //! \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 //! Get aircraft ICAO information count
//! \threadsafe //! \threadsafe

View File

@@ -345,9 +345,9 @@ namespace BlackCore
return 0; 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(); return CAirlineIcaoCode();
} }
@@ -415,11 +415,10 @@ namespace BlackCore
void CWebDataServices::gracefulShutdown() void CWebDataServices::gracefulShutdown()
{ {
this->disconnect(); // all signals 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_vatsimBookingReader) { this->m_vatsimBookingReader->gracefulShutdown(); }
if (this->m_vatsimDataFileReader) { this->m_vatsimDataFileReader->gracefulShutdown(); } if (this->m_vatsimDataFileReader) { this->m_vatsimDataFileReader->gracefulShutdown(); }
if (this->m_vatsimStatusReader) { this->m_vatsimStatusReader->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_modelDataReader) { this->m_modelDataReader->gracefulShutdown(); }
if (this->m_icaoDataReader) { this->m_icaoDataReader->gracefulShutdown(); } if (this->m_icaoDataReader) { this->m_icaoDataReader->gracefulShutdown(); }
if (this->m_infoDataReader) { this->m_infoDataReader->gracefulShutdown(); } if (this->m_infoDataReader) { this->m_infoDataReader->gracefulShutdown(); }

View File

@@ -244,7 +244,7 @@ namespace BlackCore
//! Smart airline selector //! Smart airline selector
//! \threadsafe //! \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) //! ICAO code for callsign (e.g. DLH123 -> DLH)
//! \threadsafe //! \threadsafe

View File

@@ -7,7 +7,8 @@
* contained in the LICENSE file. * contained in the LICENSE file.
*/ */
#include "blackmisc/aviation/airlineicaocode.h" #include "airlineicaocode.h"
#include "callsign.h"
#include "blackmisc/comparefunctions.h" #include "blackmisc/comparefunctions.h"
#include "blackmisc/db/datastoreutility.h" #include "blackmisc/db/datastoreutility.h"
#include "blackmisc/icons.h" #include "blackmisc/icons.h"
@@ -33,11 +34,21 @@ namespace BlackMisc
{ {
CAirlineIcaoCode::CAirlineIcaoCode(const QString &airlineDesignator) CAirlineIcaoCode::CAirlineIcaoCode(const QString &airlineDesignator)
: m_designator(airlineDesignator.trimmed().toUpper()) : 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) 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) : 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 const QString CAirlineIcaoCode::getVDesignator() const
{ {
@@ -281,6 +292,30 @@ namespace BlackMisc
return s.append(" ").append(getDbKeyAsStringInParentheses()); 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 QString CAirlineIcaoCode::getNameWithKey() const
{ {
if (!hasValidDbKey()) { return getName(); } if (!hasValidDbKey()) { return getName(); }

View File

@@ -30,6 +30,8 @@ namespace BlackMisc
{ {
namespace Aviation namespace Aviation
{ {
class CCallsign;
//! Value object for ICAO classification //! Value object for ICAO classification
class BLACKMISC_EXPORT CAirlineIcaoCode : class BLACKMISC_EXPORT CAirlineIcaoCode :
public CValueObject<CAirlineIcaoCode>, public CValueObject<CAirlineIcaoCode>,
@@ -156,6 +158,9 @@ namespace BlackMisc
//! Comined string with key //! Comined string with key
QString getCombinedStringWithKey() const; QString getCombinedStringWithKey() const;
//! What is better, the callsign airline code or this code
CAirlineIcaoCode thisOrCallsignCode(const CCallsign &callsign) const;
//! \copydoc BlackMisc::Mixin::Icon::toIcon //! \copydoc BlackMisc::Mixin::Icon::toIcon
CIcon toIcon() const; CIcon toIcon() const;

View File

@@ -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); return this->findByKey(icaoPattern.getDbKey(), icaoPattern);
} }
// search by parts // search by parts
CAirlineIcaoCodeList codes; CAirlineIcaoCodeList codes;
if (icaoPattern.hasValidDesignator()) if (patternUsed.hasValidDesignator())
{ {
codes = this->findByVDesignator(icaoPattern.getVDesignator()); codes = this->findByVDesignator(patternUsed.getVDesignator());
} }
else else
{ {
codes = this->findByIataCode(icaoPattern.getIataCode()); codes = this->findByIataCode(patternUsed.getIataCode());
} }
if (codes.size() == 1) { return codes.front(); } if (codes.size() == 1) { return codes.front(); }
// further reduce // 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 (!countryCodes.isEmpty()) { return countryCodes.front(); }
} }
if (!codes.isEmpty()) { return codes.front(); } if (!codes.isEmpty()) { return codes.front(); }
return icaoPattern; return patternUsed;
} }
CAirlineIcaoCode CAirlineIcaoCodeList::findBestMatchByCallsign(const CCallsign &callsign) const CAirlineIcaoCode CAirlineIcaoCodeList::findBestMatchByCallsign(const CCallsign &callsign) const

View File

@@ -70,7 +70,7 @@ namespace BlackMisc
CAirlineIcaoCodeList findByMilitary(bool military) const; CAirlineIcaoCodeList findByMilitary(bool military) const;
//! Best selection by given pattern //! 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 //! Use callsign to conclude airline
CAirlineIcaoCode findBestMatchByCallsign(const CCallsign &callsign) const; CAirlineIcaoCode findBestMatchByCallsign(const CCallsign &callsign) const;