mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-30 11:55:35 +08:00
* IATA code for airlines * selection for airline designator returns list not single object * misc finder functions for airline list * formatting, use MS override Doxygen style
This commit is contained in:
@@ -32,7 +32,6 @@ using namespace BlackMisc::Weather;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
|
||||
CAirspaceMonitor::CAirspaceMonitor(BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, INetwork *network, CWebDataServices *webDataReader, QObject *parent)
|
||||
: QObject(parent),
|
||||
COwnAircraftAware(ownAircraftProvider),
|
||||
@@ -855,7 +854,7 @@ namespace BlackCore
|
||||
if (!model.hasValidDbKey() && !model.getLivery().hasValidDbKey())
|
||||
{
|
||||
// create a pseudo livery, try to find airline first
|
||||
CAirlineIcaoCode airlineIcao(this->getAirlineIcaoCodeForDesignator(airlineIcaoDesignator));
|
||||
CAirlineIcaoCode airlineIcao(this->smartAirlineIcaoSelector(CAirlineIcaoCode(airlineIcaoDesignator)));
|
||||
if (!airlineIcao.hasValidDbKey())
|
||||
{
|
||||
// no DB data, we update as much as possible
|
||||
|
||||
@@ -90,7 +90,7 @@ namespace BlackCore
|
||||
return m_countries.findBestMatchByCountryName(name);
|
||||
}
|
||||
|
||||
CAirlineIcaoCode CIcaoDataReader::getAirlineIcaoCodeForDesignator(const QString &designator) const
|
||||
CAirlineIcaoCodeList CIcaoDataReader::getAirlineIcaoCodesForDesignator(const QString &designator) const
|
||||
{
|
||||
return getAirlineIcaoCodes().findByVDesignator(designator);
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace BlackCore
|
||||
|
||||
//! Get airline ICAO information for designator
|
||||
//! \threadsafe
|
||||
BlackMisc::Aviation::CAirlineIcaoCode getAirlineIcaoCodeForDesignator(const QString &designator) const;
|
||||
BlackMisc::Aviation::CAirlineIcaoCodeList getAirlineIcaoCodesForDesignator(const QString &designator) const;
|
||||
|
||||
//! Get airline ICAO information for key
|
||||
//! \threadsafe
|
||||
|
||||
@@ -362,6 +362,12 @@ namespace BlackCore
|
||||
return 0;
|
||||
}
|
||||
|
||||
CAirlineIcaoCode CWebDataServices::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern) const
|
||||
{
|
||||
if (m_icaoDataReader) { return m_icaoDataReader->smartAirlineIcaoSelector(icaoPattern); }
|
||||
return CAirlineIcaoCode();
|
||||
}
|
||||
|
||||
CAirlineIcaoCode CWebDataServices::getAirlineIcaoCodeForDbKey(int key) const
|
||||
{
|
||||
if (m_icaoDataReader) { return m_icaoDataReader->getAirlineIcaoCodeForDbKey(key); }
|
||||
@@ -410,10 +416,10 @@ namespace BlackCore
|
||||
return 0;
|
||||
}
|
||||
|
||||
CAirlineIcaoCode CWebDataServices::getAirlineIcaoCodeForDesignator(const QString &designator) const
|
||||
CAirlineIcaoCodeList CWebDataServices::getAirlineIcaoCodeForDesignator(const QString &designator) const
|
||||
{
|
||||
if (m_icaoDataReader) { return m_icaoDataReader->getAirlineIcaoCodeForDesignator(designator); }
|
||||
return CAirlineIcaoCode();
|
||||
if (m_icaoDataReader) { return m_icaoDataReader->getAirlineIcaoCodesForDesignator(designator); }
|
||||
return CAirlineIcaoCodeList();
|
||||
}
|
||||
|
||||
void CWebDataServices::gracefulShutdown()
|
||||
|
||||
@@ -77,185 +77,60 @@ namespace BlackCore
|
||||
|
||||
// ------------------------ provider functionality start ------------------------------
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::connectDataReadSignal
|
||||
//! \ingroup webdatareaderprovider
|
||||
//! \name Provider interface functions
|
||||
//! @{
|
||||
virtual QList<QMetaObject::Connection> connectDataReadSignal(
|
||||
QObject *receiver,
|
||||
std::function<void (BlackMisc::Network::CEntityFlags::Entity, BlackMisc::Network::CEntityFlags::ReadState, int)> dataRead) override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::connectDataPublishSignal
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual QList<QMetaObject::Connection> connectDataPublishSignal(
|
||||
QObject *receiver,
|
||||
std::function<void (const BlackMisc::Simulation::CAircraftModelList &, const BlackMisc::Simulation::CAircraftModelList &, const BlackMisc::CStatusMessageList &)> dataPublished) override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::triggerRead
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead, const QDateTime &newerThan = QDateTime()) override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getVatsimFsdServers
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Network::CServerList getVatsimFsdServers() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getVatsimVoiceServers
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Network::CServerList getVatsimVoiceServers() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getDistributors
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Simulation::CDistributorList getDistributors() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getDistributorsCount
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual int getDistributorsCount() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::smartDistributorSelector
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Simulation::CDistributor smartDistributorSelector(const BlackMisc::Simulation::CDistributor &distributor) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getLiveries
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CLiveryList getLiveries() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getLiveriesCount
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual int getLiveriesCount() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getLiveryForCombinedCode
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CLivery getLiveryForCombinedCode(const QString &combinedCode) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getStdLiveryForAirlineCode
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CLivery getStdLiveryForAirlineCode(const BlackMisc::Aviation::CAirlineIcaoCode &icao) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getLiveryForDbKey
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CLivery getLiveryForDbKey(int id) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::smartLiverySelector
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CLivery smartLiverySelector(const BlackMisc::Aviation::CLivery &livery) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getModels
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Simulation::CAircraftModelList getModels() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getModelsCount
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual int getModelsCount() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getModelDbKeys
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual QList<int> getModelDbKeys() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getModelStrings
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual QStringList getModelStrings() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getModelsForAircraftDesignatorAndLiveryCombinedCode
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Simulation::CAircraftModelList getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getModelForModelString
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Simulation::CAircraftModel getModelForModelString(const QString &modelString) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getAircraftIcaoCodes
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CAircraftIcaoCodeList getAircraftIcaoCodes() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getAircraftIcaoCodesCount
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual int getAircraftIcaoCodesCount() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getAircraftIcaoCodeForDesignator
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CAircraftIcaoCode getAircraftIcaoCodeForDesignator(const QString &designator) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getAircraftIcaoCodeForDbKey
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CAircraftIcaoCode getAircraftIcaoCodeForDbKey(int key) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getAircraftIcaoCodeForDbKey
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CAircraftIcaoCode smartAircraftIcaoSelector(const BlackMisc::Aviation::CAircraftIcaoCode &icao) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getAirlineIcaoCodes
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CAirlineIcaoCodeList getAirlineIcaoCodes() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getAirlineIcaoCodesCount
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual int getAirlineIcaoCodesCount() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getAirlineIcaoCodeForDbKey
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const BlackMisc::Aviation::CAirlineIcaoCode &icaoPattern) const override;
|
||||
virtual BlackMisc::Aviation::CAirlineIcaoCode getAirlineIcaoCodeForDbKey(int key) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getAirlineIcaoCodeForDesignator
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CAirlineIcaoCode getAirlineIcaoCodeForDesignator(const QString &designator) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getCountries
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CAirlineIcaoCodeList getAirlineIcaoCodeForDesignator(const QString &designator) const override;
|
||||
virtual BlackMisc::CCountryList getCountries() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getCountries
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual int getCountriesCount() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getCountryForName
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::CCountry getCountryForName(const QString &name) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getCountryForIsoCode
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::CCountry getCountryForIsoCode(const QString &iso) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getMetars
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Weather::CMetarSet getMetars() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getMetarForAirport
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Weather::CMetar getMetarForAirport(const BlackMisc::Aviation::CAirportIcaoCode &icao) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getMetarForAirport
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual int getMetarsCount() const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getUsersForCallsign
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Network::CUserList getUsersForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getAtcStationsForCallsign
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Aviation::CAtcStationList getAtcStationsForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::getVoiceCapabilityForCallsign
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Network::CVoiceCapabilities getVoiceCapabilityForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::updateWithWebData
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual void updateWithVatsimDataFileData(BlackMisc::Simulation::CSimulatedAircraft &aircraftToBeUdpated) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::asyncPublishModels
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::CStatusMessageList asyncPublishModels(const BlackMisc::Simulation::CAircraftModelList &models) const override;
|
||||
|
||||
//! \copydoc BlackMisc::Network::IWebDataServicesProvider::canConnectSwiftDb
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual bool canConnectSwiftDb() const override;
|
||||
|
||||
//! Save all DB data to a JSON files
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual bool writeDbDataToDisk(const QString &dir) const override;
|
||||
|
||||
//! Load DB data from JSON files
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual bool readDbDataFromDisk(const QString &dir, bool inBackground) override;
|
||||
//! }@
|
||||
|
||||
// ------------------------ provider functionality end ----------------------------
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace BlackMisc
|
||||
namespace Aviation
|
||||
{
|
||||
CAircraftIcaoCode::CAircraftIcaoCode(const QString &designator, const QString &combinedType) :
|
||||
m_designator(designator), m_combinedType(combinedType)
|
||||
m_designator(designator.trimmed().toUpper()), m_combinedType(combinedType.trimmed().toUpper())
|
||||
{}
|
||||
|
||||
CAircraftIcaoCode::CAircraftIcaoCode(const QString &icao, const QString &combinedType, const QString &manufacturer, const QString &model, const QString &wtc, bool realworld, bool legacy, bool military, int rank)
|
||||
@@ -58,13 +58,14 @@ namespace BlackMisc
|
||||
|
||||
void CAircraftIcaoCode::updateMissingParts(const CAircraftIcaoCode &otherIcaoCode)
|
||||
{
|
||||
if (!this->hasDesignator()) { this->setDesignator(otherIcaoCode.getDesignator()); }
|
||||
if (!this->hasValidWtc()) { this->setWtc(otherIcaoCode.getDesignator()); }
|
||||
if (!this->hasValidCombinedType()) { this->setCombinedType(otherIcaoCode.getCombinedType()); }
|
||||
if (!this->hasValidDesignator() && otherIcaoCode.hasValidDesignator()) { this->setDesignator(otherIcaoCode.getDesignator()); }
|
||||
if (!this->hasValidWtc() && otherIcaoCode.hasValidWtc()) { this->setWtc(otherIcaoCode.getDesignator()); }
|
||||
if (!this->hasValidCombinedType() && otherIcaoCode.hasValidCombinedType()) { this->setCombinedType(otherIcaoCode.getCombinedType()); }
|
||||
if (this->m_manufacturer.isEmpty()) { this->setManufacturer(otherIcaoCode.getManufacturer());}
|
||||
if (this->m_modelDescription.isEmpty()) { this->setModelDescription(otherIcaoCode.getModelDescription()); }
|
||||
if (!this->hasValidDbKey())
|
||||
{
|
||||
// need to observe if it makes sense to copy the key but not copying the whole object
|
||||
this->setDbKey(otherIcaoCode.getDbKey());
|
||||
this->setUtcTimestamp(otherIcaoCode.getUtcTimestamp());
|
||||
}
|
||||
@@ -87,9 +88,14 @@ namespace BlackMisc
|
||||
return !this->m_designator.isEmpty();
|
||||
}
|
||||
|
||||
bool CAircraftIcaoCode::hasValidDesignator() const
|
||||
{
|
||||
return isValidDesignator(this->m_designator);
|
||||
}
|
||||
|
||||
bool CAircraftIcaoCode::hasKnownDesignator() const
|
||||
{
|
||||
return (this->hasDesignator() && this->getDesignator() != "ZZZZ");
|
||||
return (this->hasValidDesignator() && this->getDesignator() != getUnassignedDesignator());
|
||||
}
|
||||
|
||||
bool CAircraftIcaoCode::isIataSameAsDesignator() const
|
||||
@@ -431,6 +437,29 @@ namespace BlackMisc
|
||||
return false;
|
||||
}
|
||||
|
||||
const QString &CAircraftIcaoCode::getUnassignedDesignator()
|
||||
{
|
||||
static const QString i("ZZZZ");
|
||||
return i;
|
||||
}
|
||||
|
||||
const QStringList &CAircraftIcaoCode::getSpecialDesignators()
|
||||
{
|
||||
static const QStringList s({ "ZZZZ", "SHIP", "BALL", "GLID", "ULAC", "GYRO", "UHEL", "GLID", "ULAC", "GYRO", "UHEL"});
|
||||
return s;
|
||||
}
|
||||
|
||||
const QString CAircraftIcaoCode::normalizeDesignator(const QString candidate)
|
||||
{
|
||||
QString n(candidate.trimmed().toUpper());
|
||||
if (n.isEmpty()) { return n; }
|
||||
|
||||
static QThreadStorage<QRegularExpression> tsRegex;
|
||||
if (! tsRegex.hasLocalData()) { tsRegex.setLocalData(QRegularExpression("[^a-zA-Z\\d\\s]")); }
|
||||
const QRegularExpression ®exp = tsRegex.localData();
|
||||
return n.remove(regexp);
|
||||
}
|
||||
|
||||
CAircraftIcaoCode CAircraftIcaoCode::fromDatabaseJson(const QJsonObject &json, const QString &prefix)
|
||||
{
|
||||
if (!existsKey(json, prefix))
|
||||
|
||||
@@ -72,6 +72,9 @@ namespace BlackMisc
|
||||
//! Aircraft designator?
|
||||
bool hasDesignator() const;
|
||||
|
||||
//! Valid aircraft designator?
|
||||
bool hasValidDesignator() const;
|
||||
|
||||
//! Has designator and designator is not "ZZZZ"
|
||||
bool hasKnownDesignator() const;
|
||||
|
||||
@@ -237,6 +240,15 @@ namespace BlackMisc
|
||||
//! Valid WTC code?
|
||||
static bool isValidWtc(const QString &candidate);
|
||||
|
||||
//! The unassigned designator ("ZZZZ")
|
||||
static const QString &getUnassignedDesignator();
|
||||
|
||||
//! List of the special designators ("ZZZZ", "UHEL", ...)
|
||||
static const QStringList &getSpecialDesignators();
|
||||
|
||||
//! Normalize designator, remove illegal characters
|
||||
static const QString normalizeDesignator(const QString candidate);
|
||||
|
||||
//! From our database JSON format
|
||||
static CAircraftIcaoCode fromDatabaseJson(const QJsonObject &json, const QString &prefix = QString());
|
||||
|
||||
|
||||
@@ -135,6 +135,7 @@ namespace BlackMisc
|
||||
if (c.hasCompleteData()) { return c; }
|
||||
}
|
||||
|
||||
// get an initial set of data we can choose from
|
||||
CAircraftIcaoCodeList codes;
|
||||
if (icaoPattern.hasKnownDesignator())
|
||||
{
|
||||
@@ -172,7 +173,7 @@ namespace BlackMisc
|
||||
}
|
||||
|
||||
// further reduce by manufacturer
|
||||
if (icaoPattern.hasManufacturer())
|
||||
if (icaoPattern.hasManufacturer() && codes.contains(&CAircraftIcaoCode::getManufacturer, icaoPattern.getManufacturer()))
|
||||
{
|
||||
const QString m(icaoPattern.getManufacturer());
|
||||
codes = codes.findByManufacturer(m);
|
||||
@@ -181,17 +182,25 @@ namespace BlackMisc
|
||||
// intentionally continue here
|
||||
}
|
||||
|
||||
// further reduce by IATA
|
||||
if (icaoPattern.hasIataCode() && codes.contains(&CAircraftIcaoCode::getIataCode, icaoPattern.getIataCode()))
|
||||
{
|
||||
const QString i(icaoPattern.getIataCode());
|
||||
codes = codes.findByIataCode(i);
|
||||
if (codes.size() == 1) { return codes.front(); }
|
||||
|
||||
// intentionally continue here
|
||||
}
|
||||
|
||||
// lucky punch on description?
|
||||
if (icaoPattern.hasModelDescription())
|
||||
if (icaoPattern.hasModelDescription() && codes.contains(&CAircraftIcaoCode::getModelDescription, icaoPattern.getModelDescription()))
|
||||
{
|
||||
// do not affect codes here, it might return no results
|
||||
const QString d(icaoPattern.getModelDescription());
|
||||
CAircraftIcaoCodeList cm(codes.findByDescription(d));
|
||||
if (cm.size() == 1) { return cm.front(); }
|
||||
if (cm.size() > 1 && cm.size() < codes.size()) { return codes.front(); }
|
||||
}
|
||||
return codes.frontOrDefault(); // sorted by rank
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
@@ -38,6 +38,17 @@ namespace BlackMisc
|
||||
return QString("V").append(this->m_designator);
|
||||
}
|
||||
|
||||
void CAirlineIcaoCode::setDesignator(const QString &icaoDesignator)
|
||||
{
|
||||
this->m_designator = icaoDesignator.trimmed().toUpper();
|
||||
if (this->m_designator.length() == 4 && this->m_designator.startsWith("V"))
|
||||
{
|
||||
// a virtual designator was provided
|
||||
this->setVirtualAirline(true);
|
||||
this->m_designator = this->m_designator.right(3);
|
||||
}
|
||||
}
|
||||
|
||||
QString CAirlineIcaoCode::getDesignatorNameCountry() const
|
||||
{
|
||||
QString s(this->getDesignator());
|
||||
@@ -56,6 +67,11 @@ namespace BlackMisc
|
||||
return isValidAirlineDesignator(m_designator);
|
||||
}
|
||||
|
||||
bool CAirlineIcaoCode::hasIataCode() const
|
||||
{
|
||||
return !this->m_iataCode.isEmpty();
|
||||
}
|
||||
|
||||
bool CAirlineIcaoCode::matchesDesignator(const QString &designator) const
|
||||
{
|
||||
if (designator.isEmpty()) { return false; }
|
||||
@@ -68,6 +84,24 @@ namespace BlackMisc
|
||||
return designator.trimmed().toUpper() == this->getVDesignator();
|
||||
}
|
||||
|
||||
bool CAirlineIcaoCode::matchesIataCode(const QString &iata) const
|
||||
{
|
||||
if (iata.isEmpty()) { return false; }
|
||||
return iata.trimmed().toUpper() == this->m_iataCode;
|
||||
}
|
||||
|
||||
bool CAirlineIcaoCode::matchesDesignatorOrIataCode(const QString &candidate) const
|
||||
{
|
||||
if (candidate.isEmpty()) { return false; }
|
||||
return this->matchesDesignator(candidate) || this->matchesIataCode(candidate);
|
||||
}
|
||||
|
||||
bool CAirlineIcaoCode::matchesVDesignatorOrIataCode(const QString &candidate) const
|
||||
{
|
||||
if (candidate.isEmpty()) { return false; }
|
||||
return this->matchesVDesignator(candidate) || this->matchesIataCode(candidate);
|
||||
}
|
||||
|
||||
bool CAirlineIcaoCode::hasCompleteData() const
|
||||
{
|
||||
return this->hasValidDesignator() && this->hasValidCountry() && this->hasName();
|
||||
@@ -105,6 +139,8 @@ namespace BlackMisc
|
||||
{
|
||||
case IndexAirlineDesignator:
|
||||
return CVariant::fromValue(this->m_designator);
|
||||
case IndexIataCode:
|
||||
return CVariant::fromValue(this->m_iataCode);
|
||||
case IndexAirlineCountryIso:
|
||||
return CVariant::fromValue(this->getCountryIso());
|
||||
case IndexAirlineCountry:
|
||||
@@ -134,6 +170,9 @@ namespace BlackMisc
|
||||
case IndexAirlineDesignator:
|
||||
this->setDesignator(variant.value<QString>());
|
||||
break;
|
||||
case IndexIataCode:
|
||||
this->setIataCode(variant.value<QString>());
|
||||
break;
|
||||
case IndexAirlineCountry:
|
||||
this->setCountry(variant.value<CCountry>());
|
||||
break;
|
||||
@@ -164,6 +203,8 @@ namespace BlackMisc
|
||||
{
|
||||
case IndexAirlineDesignator:
|
||||
return this->m_designator.compare(compareValue.getDesignator());
|
||||
case IndexIataCode:
|
||||
return this->m_iataCode.compare(compareValue.getIataCode());
|
||||
case IndexAirlineCountry:
|
||||
return this->m_country.comparePropertyByIndex(compareValue.getCountry(), index.copyFrontRemoved());
|
||||
case IndexDesignatorNameCountry:
|
||||
@@ -198,7 +239,7 @@ namespace BlackMisc
|
||||
if (airline.length() < 2 || airline.length() > 5) return false;
|
||||
|
||||
static QThreadStorage<QRegularExpression> tsRegex;
|
||||
if (! tsRegex.hasLocalData()) { tsRegex.setLocalData(QRegularExpression("^[A-Z]+[A-Z0-9]*$")); }
|
||||
if (! tsRegex.hasLocalData()) { tsRegex.setLocalData(QRegularExpression("^[A-Z0-9]+$")); }
|
||||
const QRegularExpression ®exp = tsRegex.localData();
|
||||
return (regexp.match(airline).hasMatch());
|
||||
}
|
||||
@@ -255,6 +296,7 @@ namespace BlackMisc
|
||||
}
|
||||
|
||||
QString designator(json.value(prefix + "designator").toString());
|
||||
QString iata(json.value(prefix + "iata").toString());
|
||||
QString telephony(json.value(prefix + "callsign").toString());
|
||||
QString name(json.value(prefix + "name").toString());
|
||||
QString countryIso(json.value(prefix + "country").toString());
|
||||
@@ -266,6 +308,7 @@ namespace BlackMisc
|
||||
CCountry(countryIso, countryName),
|
||||
telephony, va, operating
|
||||
);
|
||||
code.setIataCode(iata);
|
||||
code.setKeyAndTimestampFromDatabaseJson(json, prefix);
|
||||
return code;
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ namespace BlackMisc
|
||||
enum ColumnIndex
|
||||
{
|
||||
IndexAirlineDesignator = BlackMisc::CPropertyIndex::GlobalIndexCAirlineIcaoCode,
|
||||
IndexIataCode,
|
||||
IndexAirlineName,
|
||||
IndexAirlineCountryIso,
|
||||
IndexAirlineCountry,
|
||||
@@ -59,7 +60,13 @@ namespace BlackMisc
|
||||
const QString getVDesignator() const;
|
||||
|
||||
//! Set airline, e.g. "DLH"
|
||||
void setDesignator(const QString &icaoDesignator) { this->m_designator = icaoDesignator.trimmed().toUpper(); }
|
||||
void setDesignator(const QString &icaoDesignator);
|
||||
|
||||
//! IATA code
|
||||
const QString &getIataCode() const { return m_iataCode; }
|
||||
|
||||
//! Set IATA code
|
||||
void setIataCode(const QString &iataCode) { this->m_iataCode = iataCode.trimmed().toUpper(); }
|
||||
|
||||
//! Get country, e.g. "FR"
|
||||
const QString &getCountryIso() const { return this->m_country.getIsoCode(); }
|
||||
@@ -106,12 +113,24 @@ namespace BlackMisc
|
||||
//! Airline designator available?
|
||||
bool hasValidDesignator() const;
|
||||
|
||||
//! IATA code?
|
||||
bool hasIataCode() const;
|
||||
|
||||
//! Matches designator string?
|
||||
bool matchesDesignator(const QString &designator) const;
|
||||
|
||||
//! Matches v-designator string?
|
||||
bool matchesVDesignator(const QString &designator) const;
|
||||
|
||||
//! Matches IATA code?
|
||||
bool matchesIataCode(const QString &iata) const;
|
||||
|
||||
//! Matches IATA code or designator?
|
||||
bool matchesDesignatorOrIataCode(const QString &candidate) const;
|
||||
|
||||
//! Matches IATA code or v-designator?
|
||||
bool matchesVDesignatorOrIataCode(const QString &candidate) const;
|
||||
|
||||
//! Telephony designator?
|
||||
bool hasTelephonyDesignator() const { return !this->m_telephonyDesignator.isEmpty(); }
|
||||
|
||||
@@ -154,6 +173,7 @@ namespace BlackMisc
|
||||
private:
|
||||
BLACK_ENABLE_TUPLE_CONVERSION(CAirlineIcaoCode)
|
||||
QString m_designator; //!< "DLH"
|
||||
QString m_iataCode; //!< "LH"
|
||||
QString m_name; //!< "Lufthansa"
|
||||
BlackMisc::CCountry m_country; //!< Country
|
||||
QString m_telephonyDesignator; //!< "Speedbird"
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace BlackMisc
|
||||
CSequence<CAirlineIcaoCode>(other)
|
||||
{ }
|
||||
|
||||
CAirlineIcaoCodeList CAirlineIcaoCodeList::findByDesignator(const QString &designator)
|
||||
CAirlineIcaoCodeList CAirlineIcaoCodeList::findByDesignator(const QString &designator) const
|
||||
{
|
||||
if (CAirlineIcaoCode::isValidAirlineDesignator(designator)) { return CAirlineIcaoCodeList(); }
|
||||
return this->findBy([&](const CAirlineIcaoCode & code)
|
||||
@@ -26,6 +26,52 @@ namespace BlackMisc
|
||||
});
|
||||
}
|
||||
|
||||
CAirlineIcaoCodeList CAirlineIcaoCodeList::findByIataCode(const QString &iata) const
|
||||
{
|
||||
if (iata.isEmpty()) { return CAirlineIcaoCodeList(); }
|
||||
return this->findBy([&](const CAirlineIcaoCode & code)
|
||||
{
|
||||
return code.matchesIataCode(iata);
|
||||
});
|
||||
}
|
||||
|
||||
CAirlineIcaoCodeList CAirlineIcaoCodeList::findByDesignatorOrIataCode(const QString &designatorOrIata) const
|
||||
{
|
||||
if (designatorOrIata.isEmpty()) { return CAirlineIcaoCodeList(); }
|
||||
return this->findBy([&](const CAirlineIcaoCode & code)
|
||||
{
|
||||
return code.matchesDesignatorOrIataCode(designatorOrIata);
|
||||
});
|
||||
}
|
||||
|
||||
CAirlineIcaoCodeList CAirlineIcaoCodeList::findByVDesignator(const QString &designator) const
|
||||
{
|
||||
if (!CAirlineIcaoCode::isValidAirlineDesignator(designator)) { return CAirlineIcaoCodeList(); }
|
||||
return this->findBy([&](const CAirlineIcaoCode & code)
|
||||
{
|
||||
return code.matchesVDesignator(designator);
|
||||
});
|
||||
}
|
||||
|
||||
CAirlineIcaoCodeList CAirlineIcaoCodeList::findByVDesignatorOrIataCode(const QString &designatorOrIata) const
|
||||
{
|
||||
if (designatorOrIata.isEmpty()) { return CAirlineIcaoCodeList(); }
|
||||
return this->findBy([&](const CAirlineIcaoCode & code)
|
||||
{
|
||||
return code.matchesVDesignatorOrIataCode(designatorOrIata);
|
||||
});
|
||||
}
|
||||
|
||||
CAirlineIcaoCodeList CAirlineIcaoCodeList::findByCountryIsoCode(const QString &isoCode) const
|
||||
{
|
||||
if (isoCode.length() != 2) { return CAirlineIcaoCodeList(); }
|
||||
const QString iso(isoCode.toUpper());
|
||||
return this->findBy([&](const CAirlineIcaoCode & code)
|
||||
{
|
||||
return code.getCountry().getIsoCode() == iso;
|
||||
});
|
||||
}
|
||||
|
||||
CAirlineIcaoCode CAirlineIcaoCodeList::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern) const
|
||||
{
|
||||
if (icaoPattern.hasValidDbKey())
|
||||
@@ -33,19 +79,28 @@ namespace BlackMisc
|
||||
return this->findByKey(icaoPattern.getDbKey(), icaoPattern);
|
||||
}
|
||||
|
||||
if (!icaoPattern.hasValidDesignator()) { return CAirlineIcaoCode(); }
|
||||
|
||||
//! \todo smart airline selector, further criteria
|
||||
return icaoPattern;
|
||||
// search by parts
|
||||
CAirlineIcaoCodeList codes;
|
||||
if (icaoPattern.hasValidDesignator())
|
||||
{
|
||||
codes = this->findByVDesignator(icaoPattern.getVDesignator());
|
||||
}
|
||||
else
|
||||
{
|
||||
codes == this->findByIataCode(icaoPattern.getIataCode());
|
||||
}
|
||||
|
||||
CAirlineIcaoCode CAirlineIcaoCodeList::findByVDesignator(const QString &designator)
|
||||
if (codes.size() == 1) { return codes.front(); }
|
||||
|
||||
// further reduce
|
||||
if (icaoPattern.hasValidCountry())
|
||||
{
|
||||
if (!CAirlineIcaoCode::isValidAirlineDesignator(designator)) { return CAirlineIcaoCode(); }
|
||||
return this->findFirstByOrDefault([&](const CAirlineIcaoCode & code)
|
||||
{
|
||||
return code.matchesVDesignator(designator);
|
||||
});
|
||||
CAirlineIcaoCodeList countryCodes = codes.findByCountryIsoCode(icaoPattern.getCountry().getIsoCode());
|
||||
if (!countryCodes.isEmpty()) { return countryCodes.front(); }
|
||||
}
|
||||
|
||||
if (!codes.isEmpty()) { return codes.front(); }
|
||||
return icaoPattern;
|
||||
}
|
||||
|
||||
CAirlineIcaoCodeList CAirlineIcaoCodeList::fromDatabaseJson(const QJsonArray &array, bool ignoreIncomplete)
|
||||
|
||||
@@ -41,14 +41,27 @@ namespace BlackMisc
|
||||
|
||||
//! Find by designator
|
||||
//! Not unique because of virtual airlines
|
||||
CAirlineIcaoCodeList findByDesignator(const QString &designator);
|
||||
CAirlineIcaoCodeList findByDesignator(const QString &designator) const;
|
||||
|
||||
//! Find by v-designator, this should be unique
|
||||
CAirlineIcaoCodeList findByVDesignator(const QString &designator) const;
|
||||
|
||||
//! Find by IATA code
|
||||
//! Not unique because of virtual airlines
|
||||
CAirlineIcaoCodeList findByIataCode(const QString &iata) const;
|
||||
|
||||
//! Find by designator or IATA code
|
||||
CAirlineIcaoCodeList findByDesignatorOrIataCode(const QString &designatorOrIata) const;
|
||||
|
||||
//! Find by v-designator or IATA code
|
||||
CAirlineIcaoCodeList findByVDesignatorOrIataCode(const QString &designatorOrIata) const;
|
||||
|
||||
//! Find by country code
|
||||
CAirlineIcaoCodeList findByCountryIsoCode(const QString &isoCode) const;
|
||||
|
||||
//! Best selection by given pattern
|
||||
CAirlineIcaoCode smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern) const;
|
||||
|
||||
//! Find by v-designator, this should be unique
|
||||
CAirlineIcaoCode findByVDesignator(const QString &designator);
|
||||
|
||||
//! String list for completion by ICAO designator
|
||||
QStringList toIcaoDesignatorCompleterStrings() const;
|
||||
|
||||
|
||||
@@ -205,11 +205,18 @@ namespace BlackMisc
|
||||
return this->m_webDataReaderProvider->getAirlineIcaoCodesCount();
|
||||
}
|
||||
|
||||
CAirlineIcaoCode CWebDataServicesAware::getAirlineIcaoCodeForDesignator(const QString &designator) const
|
||||
CAirlineIcaoCodeList CWebDataServicesAware::getAirlineIcaoCodesForDesignator(const QString &designator) const
|
||||
{
|
||||
Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider");
|
||||
if (!hasProvider()) { return CAirlineIcaoCodeList(); }
|
||||
return this->m_webDataReaderProvider->getAirlineIcaoCodeForDesignator(designator);
|
||||
}
|
||||
|
||||
CAirlineIcaoCode CWebDataServicesAware::smartAirlineIcaoSelector(const CAirlineIcaoCode &code) const
|
||||
{
|
||||
Q_ASSERT_X(this->m_webDataReaderProvider, Q_FUNC_INFO, "Missing provider");
|
||||
if (!hasProvider()) { return CAirlineIcaoCode(); }
|
||||
return this->m_webDataReaderProvider->getAirlineIcaoCodeForDesignator(designator);
|
||||
return this->m_webDataReaderProvider->smartAirlineIcaoSelector(code);
|
||||
}
|
||||
|
||||
CAirlineIcaoCode CWebDataServicesAware::getAirlineIcaoCodeForDbKey(int id) const
|
||||
|
||||
@@ -158,12 +158,16 @@ namespace BlackMisc
|
||||
|
||||
//! ICAO code for designator
|
||||
//! \threadsafe
|
||||
virtual BlackMisc::Aviation::CAirlineIcaoCode getAirlineIcaoCodeForDesignator(const QString &designator) const = 0;
|
||||
virtual BlackMisc::Aviation::CAirlineIcaoCodeList getAirlineIcaoCodeForDesignator(const QString &designator) const = 0;
|
||||
|
||||
//! ICAO code for id
|
||||
//! \threadsafe
|
||||
virtual BlackMisc::Aviation::CAirlineIcaoCode getAirlineIcaoCodeForDbKey(int id) const = 0;
|
||||
|
||||
//! Smart airline selector
|
||||
//! \threadsafe
|
||||
virtual Aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const BlackMisc::Aviation::CAirlineIcaoCode &code) const = 0;
|
||||
|
||||
//! Countries
|
||||
//! \threadsafe
|
||||
virtual BlackMisc::CCountryList getCountries() const = 0;
|
||||
@@ -315,7 +319,10 @@ namespace BlackMisc
|
||||
int getAirlineIcaoCodesCount() const;
|
||||
|
||||
//! \copydoc IWebDataServicesProvider::getAirlineIcaoCodeForDesignator
|
||||
BlackMisc::Aviation::CAirlineIcaoCode getAirlineIcaoCodeForDesignator(const QString &designator) const;
|
||||
Aviation::CAirlineIcaoCodeList getAirlineIcaoCodesForDesignator(const QString &designator) const;
|
||||
|
||||
//! \copydoc IWebDataServicesProvider::smartAirlineIcaoSelector
|
||||
Aviation::CAirlineIcaoCode smartAirlineIcaoSelector(const BlackMisc::Aviation::CAirlineIcaoCode &code) const;
|
||||
|
||||
//! \copydoc IWebDataServicesProvider::getAirlineIcaoCodeForDbKey
|
||||
BlackMisc::Aviation::CAirlineIcaoCode getAirlineIcaoCodeForDbKey(int id) const;
|
||||
|
||||
@@ -90,6 +90,14 @@ namespace BlackMisc
|
||||
});
|
||||
}
|
||||
|
||||
CAircraftModelList CAircraftModelList::findWithFileName() const
|
||||
{
|
||||
return this->findBy([ = ](const CAircraftModel & model)
|
||||
{
|
||||
return model.hasFileName();
|
||||
});
|
||||
}
|
||||
|
||||
void CAircraftModelList::setSimulatorInfo(const CSimulatorInfo &info)
|
||||
{
|
||||
for (CAircraftModel &model : (*this))
|
||||
|
||||
@@ -64,6 +64,9 @@ namespace BlackMisc
|
||||
//! Find by model string
|
||||
CAircraftModelList findByAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator, const QString &combinedCode) const;
|
||||
|
||||
//! With file name
|
||||
CAircraftModelList findWithFileName() const;
|
||||
|
||||
//! Set simulator for all elements
|
||||
void setSimulatorInfo(const BlackMisc::Simulation::CSimulatorInfo &info);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user