Files
pilotclient/src/blackmisc/aviation/airlineicaocode.h

232 lines
8.5 KiB
C++

/* Copyright (C) 2013
* swift project Community / Contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
* including this file, may be copied, modified, propagated, or distributed except according to the terms
* contained in the LICENSE file.
*/
//! \file
#ifndef BLACKMISC_AVIATION_AIRLINEICAOCODE_H
#define BLACKMISC_AVIATION_AIRLINEICAOCODE_H
#include "blackmisc/blackmiscexport.h"
#include "blackmisc/country.h"
#include "blackmisc/db/datastore.h"
#include "blackmisc/icon.h"
#include "blackmisc/metaclass.h"
#include "blackmisc/propertyindex.h"
#include "blackmisc/statusmessagelist.h"
#include "blackmisc/valueobject.h"
#include "blackmisc/variant.h"
#include <QJsonObject>
#include <QMetaType>
#include <QString>
namespace BlackMisc
{
namespace Aviation
{
class CCallsign;
//! Value object for ICAO classification
class BLACKMISC_EXPORT CAirlineIcaoCode :
public CValueObject<CAirlineIcaoCode>,
public BlackMisc::Db::IDatastoreObjectWithIntegerKey
{
public:
//! Properties by index
enum ColumnIndex
{
IndexAirlineDesignator = BlackMisc::CPropertyIndex::GlobalIndexCAirlineIcaoCode,
IndexIataCode,
IndexAirlineName,
IndexAirlineCountryIso,
IndexAirlineCountry,
IndexTelephonyDesignator,
IndexIsVirtualAirline,
IndexIsOperating,
IndexIsMilitary,
IndexDesignatorNameCountry,
};
//! Default constructor.
CAirlineIcaoCode() = default;
//! Constructor.
CAirlineIcaoCode(const QString &airlineDesignator);
//! Constructor.
CAirlineIcaoCode(const QString &airlineDesignator, const QString &airlineName, const BlackMisc::CCountry &country, const QString &telephony, bool virtualAirline, bool operating);
//! Get airline, e.g. "DLH"
const QString &getDesignator() const { return this->m_designator; }
//! Get airline, e.g. "DLH", but "VMVA" for virtual airlines
const QString getVDesignator() const;
//! Set airline, e.g. "DLH"
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(); }
//! Get country, e.g. "FRANCE"
const BlackMisc::CCountry &getCountry() const { return this->m_country; }
//! Combined string designator, name, country
QString getDesignatorNameCountry() const;
//! Set country
void setCountry(const BlackMisc::CCountry &country) { this->m_country = country; }
//! Get name, e.g. "Lufthansa"
const QString &getName() const { return this->m_name; }
//! \copydoc BlackMisc::simplifyNameForSearch
QString getSimplifiedName() const;
//! Name plus key, e.g. "Lufthansa (3421)"
QString getNameWithKey() const;
//! Set name
void setName(const QString &name) { this->m_name = name.trimmed(); }
//! Telephony designator such as "Speedbird"
const QString &getTelephonyDesignator() const { return this->m_telephonyDesignator; }
//! Telephony designator such as "Speedbird"
void setTelephonyDesignator(const QString &telephony) { this->m_telephonyDesignator = telephony.trimmed().toUpper(); }
//! Virtual airline
bool isVirtualAirline() const { return m_isVa; }
//! Virtual airline
void setVirtualAirline(bool va) { m_isVa = va; }
//! Operating?
bool isOperating() const { return m_isOperating; }
//! Operating airline?
void setOperating(bool operating) { m_isOperating = operating; }
//! Military, air force or such?
bool isMilitary() const { return m_isMilitary; }
//! Military, air force or such?
void setMilitary(bool military) { m_isMilitary = military; }
//! Country?
bool hasValidCountry() const;
//! 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;
//! Relaxed check by name or telephony designator (aka callsign, not to be confused with CCallsign)
bool matchesNamesOrTelephonyDesignator(const QString &candidate) const;
//! Does simplified name contain the candidate
bool isContainedInSimplifiedName(const QString &candidate) const;
//! Telephony designator?
bool hasTelephonyDesignator() const { return !this->m_telephonyDesignator.isEmpty(); }
//! Has (airline) name?
bool hasName() const { return !m_name.isEmpty(); }
//! Complete data
bool hasCompleteData() const;
//! Comined string with key
QString getCombinedStringWithKey() const;
//! What is better, the callsign airline code or this code. Return the better one.
CAirlineIcaoCode thisOrCallsignCode(const CCallsign &callsign) const;
//! \copydoc BlackMisc::Mixin::Icon::toIcon
CIcon toIcon() const;
//! \copydoc BlackMisc::Mixin::String::toQString
QString convertToQString(bool i18n = false) const;
//! \copydoc BlackMisc::Mixin::Index::propertyByIndex
CVariant propertyByIndex(const BlackMisc::CPropertyIndex &index) const;
//! \copydoc BlackMisc::Mixin::Index::setPropertyByIndex
void setPropertyByIndex(const BlackMisc::CPropertyIndex &index, const CVariant &variant);
//! Compare for index
int comparePropertyByIndex(const CPropertyIndex &index, const CAirlineIcaoCode &compareValue) const;
//! Validate data
BlackMisc::CStatusMessageList validate() const;
//! Update missing parts
void updateMissingParts(const CAirlineIcaoCode &otherIcaoCode);
//! Valid designator?
static bool isValidAirlineDesignator(const QString &airline);
//! Normalize string as airline designator
static QString normalizeDesignator(const QString candidate);
//! From our DB JSON
static CAirlineIcaoCode fromDatabaseJson(const QJsonObject &json, const QString &prefix = QString());
private:
QString m_designator; //!< "DLH"
QString m_iataCode; //!< "LH"
QString m_name; //!< "Lufthansa"
BlackMisc::CCountry m_country; //!< Country
QString m_telephonyDesignator; //!< "Speedbird"
bool m_isVa = false; //!< virtual airline
bool m_isOperating = true; //!< still operating?
bool m_isMilitary = false; //!< air force or such
BLACK_METACLASS(
CAirlineIcaoCode,
BLACK_METAMEMBER(dbKey),
BLACK_METAMEMBER(timestampMSecsSinceEpoch),
BLACK_METAMEMBER(designator),
BLACK_METAMEMBER(name),
BLACK_METAMEMBER(country),
BLACK_METAMEMBER(telephonyDesignator),
BLACK_METAMEMBER(isVa),
BLACK_METAMEMBER(isOperating),
BLACK_METAMEMBER(isMilitary)
);
};
} // namespace
} // namespace
Q_DECLARE_METATYPE(BlackMisc::Aviation::CAirlineIcaoCode)
#endif // guard