diff --git a/samples/blackmisc/samplesjson.cpp b/samples/blackmisc/samplesjson.cpp index 3d2c43952..9d93198fd 100644 --- a/samples/blackmisc/samplesjson.cpp +++ b/samples/blackmisc/samplesjson.cpp @@ -58,7 +58,11 @@ namespace BlackMiscTest aircraft.setCom1System(CComSystem::getCom1System(122.8, 118.75)); aircraft.setCom2System(CComSystem::getCom2System(123.8, 124.00)); aircraft.setTransponder(CTransponder::getStandardTransponder(7000, CTransponder::ModeC)); - aircraft.setIcaoInfo(CAircraftIcaoData("B737", "L2J", "DLH", "FREIGHT", "CCDDFF")); + aircraft.setIcaoInfo(CAircraftIcaoData( + CAircraftIcaoCode("B737", "L2J"), + CAirlineIcaoCode("DLH"), + "CCDDFF" + )); json = aircraft.toJson(); doc = QJsonDocument(json); diff --git a/samples/cli_client/client.cpp b/samples/cli_client/client.cpp index d523d6674..640764aea 100644 --- a/samples/cli_client/client.cpp +++ b/samples/cli_client/client.cpp @@ -160,12 +160,17 @@ void Client::presetCallsignCmd(QTextStream &args) void Client::presetIcaoCodesCmd(QTextStream &args) { QString acTypeICAO; - QString descriptionICAO; + QString descriptionICAO; //! \todo Is this the combined type ("L2J")? QString airlineICAO; QString livery; QString color; args >> acTypeICAO >> descriptionICAO >> airlineICAO >> livery >> color; - emit presetIcaoCodes(BlackMisc::Aviation::CAircraftIcaoData(acTypeICAO, descriptionICAO, airlineICAO, livery, color)); + BlackMisc::Aviation::CAircraftIcaoData icaoData( + CAircraftIcaoCode(acTypeICAO, descriptionICAO), + CAirlineIcaoCode(airlineICAO), + color); + icaoData.setLivery(livery); + emit presetIcaoCodes(icaoData); } void Client::presetLoginModeCmd(QTextStream &args) diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index cb9b1b3b4..aa4bf4e24 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -506,7 +506,10 @@ namespace BlackCore // ICAO response from custom data if (!aircraftDesignator.isEmpty()) { - CAircraftIcaoData icao(aircraftDesignator, combinedAircraftType, airlineIcao, "", ""); // from custom packet + CAircraftIcaoData icao( + CAircraftIcaoCode(aircraftDesignator, combinedAircraftType), + CAirlineIcaoCode(airlineIcao) + ); // from custom packet if (aircraftContainsCallsign) { // we have that aircraft, set straight away @@ -1074,7 +1077,7 @@ namespace BlackCore } // check sort order - Q_ASSERT_X(l.size() < 2 || l[0].getMSecsSinceEpoch() >= l[1].getMSecsSinceEpoch(), "storeAircraftParts", "wrong sort order"); + Q_ASSERT_X(l.size() < 2 || l[0].getMSecsSinceEpoch() >= l[1].getMSecsSinceEpoch(), Q_FUNC_INFO, "wrong sort order"); } } // namespace diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index 3fbe82673..9b666b8cb 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -161,7 +161,7 @@ namespace BlackCore { return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, "Invalid user credentials"); } - else if (!this->ownAircraft().getIcaoInfo().hasAircraftAndAirlineDesignator()) + else if (!this->ownAircraft().getIcaoInfo().hasAircraftDesignator()) { return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, "Invalid ICAO data for own aircraft"); } diff --git a/src/blackcore/context_ownaircraft_impl.cpp b/src/blackcore/context_ownaircraft_impl.cpp index cf0a74da2..1b581fd32 100644 --- a/src/blackcore/context_ownaircraft_impl.cpp +++ b/src/blackcore/context_ownaircraft_impl.cpp @@ -90,9 +90,13 @@ namespace BlackCore // from simulator, if available this->m_ownAircraft.setCallsign(CCallsign("SWIFT")); // would come from settings - // TODO: This would need to come from somewhere (mappings) - // Own callsign, plane ICAO status, model used - this->m_ownAircraft.setIcaoInfo(CAircraftIcaoData("C172", "L1P", "GA", "GA", "0000ff")); + //! \todo Own aircraft ICAO default data, this would need to come from somewhere (mappings) -> Own callsign, plane ICAO status, model used + this->m_ownAircraft.setIcaoInfo( + CAircraftIcaoData( + CAircraftIcaoCode("C172", "L1P"), + CAirlineIcaoCode(), + "0000ff") + ); } // voice rooms, if network is already available diff --git a/src/blackcore/vatsimdatafilereader.cpp b/src/blackcore/vatsimdatafilereader.cpp index c64d838fb..b8c3e7572 100644 --- a/src/blackcore/vatsimdatafilereader.cpp +++ b/src/blackcore/vatsimdatafilereader.cpp @@ -260,20 +260,20 @@ namespace BlackCore situation.setGroundspeed(CSpeed(groundspeed, CSpeedUnit::kts())); CAircraft currentAircraft(user.getCallsign().getStringAsSet(), user, situation); - QString icaoCode = clientPartsMap["planned_aircraft"]; - if (!icaoCode.isEmpty()) + QString aircraftIcaoCode = clientPartsMap["planned_aircraft"]; + if (!aircraftIcaoCode.isEmpty()) { // http://uk.flightaware.com/about/faq_aircraft_flight_plan_suffix.rvt // we expect something like H/B772/F B773 B773/F static const QRegularExpression reg("/."); - icaoCode = icaoCode.replace(reg, "").trimmed().toUpper(); - if (CAircraftIcaoData::isValidDesignator(icaoCode)) + aircraftIcaoCode = aircraftIcaoCode.replace(reg, "").trimmed().toUpper(); + if (CAircraftIcaoCode::isValidDesignator(aircraftIcaoCode)) { - currentAircraft.setIcaoInfo(CAircraftIcaoData(icaoCode)); + currentAircraft.setAircraftIcaoDesignator(aircraftIcaoCode); } else { - illegalIcaoCodes.append(icaoCode); + illegalIcaoCodes.append(aircraftIcaoCode); } } diff --git a/src/blackgui/components/flightplancomponent.cpp b/src/blackgui/components/flightplancomponent.cpp index 2a79d175b..c7e7440e5 100644 --- a/src/blackgui/components/flightplancomponent.cpp +++ b/src/blackgui/components/flightplancomponent.cpp @@ -76,7 +76,7 @@ namespace BlackGui { this->ui->le_Callsign->setText(ownAircraft.getCallsign().asString()); } - if (CAircraftIcaoData::isValidDesignator(ownAircraft.getIcaoInfo().getAircraftDesignator())) + if (CAircraftIcaoCode::isValidDesignator(ownAircraft.getIcaoInfo().getAircraftDesignator())) { this->ui->le_AircraftType->setText(ownAircraft.getIcaoInfo().getAircraftDesignator()); } diff --git a/src/blackgui/components/logincomponent.cpp b/src/blackgui/components/logincomponent.cpp index 847f42bce..622540757 100644 --- a/src/blackgui/components/logincomponent.cpp +++ b/src/blackgui/components/logincomponent.cpp @@ -283,7 +283,9 @@ namespace BlackGui void CLoginComponent::mergeGuiIcaoValues(CAircraftIcaoData &icao) const { CGuiAircraftValues values = getAircraftValuesFromGui(); - CAircraftIcaoData guiIcao(values.ownAircraftIcaoTypeDesignator, values.ownAircraftCombinedType, values.ownAircraftIcaoAirline, "", ""); + CAircraftIcaoData guiIcao( + CAircraftIcaoCode(values.ownAircraftIcaoTypeDesignator, values.ownAircraftCombinedType), + CAirlineIcaoCode(values.ownAircraftIcaoAirline)); icao.updateMissingParts(guiIcao); } @@ -346,7 +348,11 @@ namespace BlackGui Q_ASSERT(this->getIContextOwnAircraft()); Q_ASSERT(this->getIContextSimulator()); - static const CAircraftIcaoData defaultIcao("C172", "L1P", "", "", ""); // default values + static const CAircraftIcaoData defaultIcao( + CAircraftIcaoCode("C172", "L1P"), + CAirlineIcaoCode() + ); // default values + CAircraftIcaoData icao; bool simConnected = this->getIContextSimulator() && this->getIContextSimulator()->isSimulating(); @@ -399,13 +405,13 @@ namespace BlackGui { CGuiAircraftValues values = getAircraftValuesFromGui(); - bool validCombinedType = CAircraftIcaoData::isValidCombinedType(values.ownAircraftCombinedType); + bool validCombinedType = CAircraftIcaoCode::isValidCombinedType(values.ownAircraftCombinedType); this->ui->lblp_AircraftCombinedType->setTicked(validCombinedType); - bool validAirlineDesignator = values.ownAircraftIcaoAirline.isEmpty() || CAircraftIcaoData::isValidAirlineDesignator(values.ownAircraftIcaoAirline); + bool validAirlineDesignator = values.ownAircraftIcaoAirline.isEmpty() || CAircraftIcaoCode::isValidDesignator(values.ownAircraftIcaoAirline); this->ui->lblp_AircraftIcaoAirline->setTicked(validAirlineDesignator); - bool validIcaoDesignator = CAircraftIcaoData::isValidDesignator(values.ownAircraftIcaoTypeDesignator); + bool validIcaoDesignator = CAircraftIcaoCode::isValidDesignator(values.ownAircraftIcaoTypeDesignator); this->ui->lblp_AircraftIcaoDesignator->setTicked(validIcaoDesignator); bool validCallsign = CCallsign::isValidCallsign(values.ownCallsign); diff --git a/src/blackgui/models/aircraftmodellistmodel.cpp b/src/blackgui/models/aircraftmodellistmodel.cpp index 818858b4e..f4a256d15 100644 --- a/src/blackgui/models/aircraftmodellistmodel.cpp +++ b/src/blackgui/models/aircraftmodellistmodel.cpp @@ -55,8 +55,8 @@ namespace BlackGui case MappedModel: this->m_columns.addColumn(CColumn::standardValueObject("call", "callsign", CAircraftModel::IndexCallsign)); this->m_columns.addColumn(CColumn::standardString("model", CAircraftModel::IndexModelString)); - this->m_columns.addColumn(CColumn::standardString("ac", "aircraft ICAO", { CAircraftModel::IndexIcao, CAircraftIcaoData::IndexAircraftDesignator})); - this->m_columns.addColumn(CColumn::standardString("al", "airline ICAO", { CAircraftModel::IndexIcao, CAircraftIcaoData::IndexAirlineDesignator})); + this->m_columns.addColumn(CColumn::standardString("ac", "aircraft ICAO", { CAircraftModel::IndexIcao, CAircraftIcaoData::IndexAircraftIcao, CAircraftIcaoCode::IndexAircraftDesignator})); + this->m_columns.addColumn(CColumn::standardString("al", "airline ICAO", { CAircraftModel::IndexIcao, CAircraftIcaoData::IndexAirlineIcao, CAirlineIcaoCode::IndexAirlineDesignator})); // this->m_columns.addColumn(CColumn::standardString("ct", "combined type", { CAircraftModel::IndexIcao, CAircraftIcaoData::IndexCombinedAircraftType})); this->m_columns.addColumn(CColumn("q.?", "queried", CAircraftModel::IndexHasQueriedModelString, new CBoolIconFormatter(CIcons::StandardIconTick16, CIcons::StandardIconCross16, "queried", "not queried"))); diff --git a/src/blackmisc/aviation/aircraft.h b/src/blackmisc/aviation/aircraft.h index e3a9cfc4c..644b4f17b 100644 --- a/src/blackmisc/aviation/aircraft.h +++ b/src/blackmisc/aviation/aircraft.h @@ -93,6 +93,9 @@ namespace BlackMisc //! Set ICAO info virtual void setIcaoInfo(const CAircraftIcaoData &icao) { m_icao = icao; } + //! Set aircraft ICAO designator + virtual void setAircraftIcaoDesignator(const QString &designator) { m_icao.setAircraftDesignator(designator); } + //! Has valid realname? bool hasValidRealName() const { return this->m_pilot.hasValidRealName(); } diff --git a/src/blackmisc/aviation/aircrafticaocode.cpp b/src/blackmisc/aviation/aircrafticaocode.cpp index d54226c66..c32c762be 100644 --- a/src/blackmisc/aviation/aircrafticaocode.cpp +++ b/src/blackmisc/aviation/aircrafticaocode.cpp @@ -19,55 +19,59 @@ namespace BlackMisc { namespace Aviation { + CAircraftIcaoCode::CAircraftIcaoCode(const QString &designator, const QString &combinedType) : + m_designator(designator), m_combinedType(combinedType) + {} + CAircraftIcaoCode::CAircraftIcaoCode(const QString &icao, const QString &combinedType, const QString &manufacturer, const QString &model, const QString &wtc, bool military, bool realworld, bool legacy) - : m_aircraftDesignator(icao.trimmed().toUpper()), m_aircraftCombinedType(combinedType.trimmed().toUpper()), m_manufacturer(manufacturer.trimmed()), + : m_designator(icao.trimmed().toUpper()), m_combinedType(combinedType.trimmed().toUpper()), m_manufacturer(manufacturer.trimmed()), m_modelDescription(model.trimmed()), m_wtc(wtc.trimmed().toUpper()), m_military(military), m_realworld(realworld), m_legacy(legacy) {} QString CAircraftIcaoCode::convertToQString(bool i18n) const { Q_UNUSED(i18n); - QString s(this->m_aircraftDesignator); - if (this->hasAircraftCombinedType()) s.append(" ").append(this->m_aircraftCombinedType); - if (this->hasValidWtc()) s.append(" ").append(this->m_wtc); + QString s(this->m_designator); + if (this->hasCombinedType()) { s.append(" ").append(this->m_combinedType); } + if (this->hasValidWtc()) { s.append(" ").append(this->m_wtc); } return s; } - bool CAircraftIcaoCode::hasAircraftDesignator() const + bool CAircraftIcaoCode::hasDesignator() const { - return !this->m_aircraftDesignator.isEmpty(); + return !this->m_designator.isEmpty(); } - bool CAircraftIcaoCode::hasKnownAircraftDesignator() const + bool CAircraftIcaoCode::hasKnownDesignator() const { - return (this->hasAircraftDesignator() && this->getAircraftDesignator() != "ZZZZ"); + return (this->hasDesignator() && this->getDesignator() != "ZZZZ"); } QString CAircraftIcaoCode::getEngineType() const { - if (this->m_aircraftCombinedType.length() != 3) return ""; - return this->m_aircraftCombinedType.right(1); + if (this->m_combinedType.length() != 3) return ""; + return this->m_combinedType.right(1); } bool CAircraftIcaoCode::isVtol() const { // special designators - if (this->m_aircraftDesignator.length() == 4) + if (this->m_designator.length() == 4) { if ( - this->m_aircraftDesignator == "BALL" || - this->m_aircraftDesignator == "SHIP" || - this->m_aircraftDesignator == "GYRO" || - this->m_aircraftDesignator == "UHEL" + this->m_designator == "BALL" || + this->m_designator == "SHIP" || + this->m_designator == "GYRO" || + this->m_designator == "UHEL" ) { return true; } } - if (!m_aircraftCombinedType.isEmpty()) + if (!m_combinedType.isEmpty()) { if ( - this->m_aircraftCombinedType.startsWith('G') || // gyrocopter - this->m_aircraftCombinedType.startsWith('H') || // helicopter - this->m_aircraftCombinedType.startsWith('T') // tilt wing + this->m_combinedType.startsWith('G') || // gyrocopter + this->m_combinedType.startsWith('H') || // helicopter + this->m_combinedType.startsWith('T') // tilt wing ) { return true; } } return false; @@ -80,9 +84,9 @@ namespace BlackMisc switch (i) { case IndexAircraftDesignator: - return CVariant::fromValue(this->m_aircraftDesignator); + return CVariant::fromValue(this->m_designator); case IndexCombinedAircraftType: - return CVariant::fromValue(this->m_aircraftCombinedType); + return CVariant::fromValue(this->m_combinedType); case IndexModelDescription: return CVariant::fromValue(this->m_modelDescription); case IndexManufacturer: @@ -114,10 +118,10 @@ namespace BlackMisc switch (i) { case IndexAircraftDesignator: - this->setAircraftDesignator(variant.value()); + this->setDesignator(variant.value()); break; case IndexCombinedAircraftType: - this->setAircraftCombinedType(variant.value()); + this->setCombinedType(variant.value()); break; case IndexModelDescription: this->setModelDescription(variant.value()); diff --git a/src/blackmisc/aviation/aircrafticaocode.h b/src/blackmisc/aviation/aircrafticaocode.h index f359f5dc0..4fc910341 100644 --- a/src/blackmisc/aviation/aircrafticaocode.h +++ b/src/blackmisc/aviation/aircrafticaocode.h @@ -42,33 +42,36 @@ namespace BlackMisc //! Default constructor. CAircraftIcaoCode() = default; + //! Constructor. + CAircraftIcaoCode(const QString &designator, const QString &combinedType = ""); + //! Constructor CAircraftIcaoCode(const QString &icao, const QString &combinedType, const QString &manufacturer, const QString &model, const QString &wtc, bool military, bool realworld, bool legacy); //! Get ICAO designator, e.g. "B737" - const QString &getAircraftDesignator() const { return m_aircraftDesignator; } + const QString &getDesignator() const { return m_designator; } //! Set ICAO designator, e.g. "B737" - void setAircraftDesignator(const QString &icaoDesignator) { this->m_aircraftDesignator = icaoDesignator.trimmed().toUpper(); } + void setDesignator(const QString &icaoDesignator) { this->m_designator = icaoDesignator.trimmed().toUpper(); } //! Aircraft designator? - bool hasAircraftDesignator() const; + bool hasDesignator() const; //! Has designator and designator is not "ZZZZ" - bool hasKnownAircraftDesignator() const; + bool hasKnownDesignator() const; //! Get type, e.g. "L2J" - const QString &getAircraftCombinedType() const { return this->m_aircraftCombinedType; } + const QString &getCombinedType() const { return this->m_combinedType; } //! Combined type available? - bool hasAircraftCombinedType() const { return this->getAircraftCombinedType().length() == 3; } + bool hasCombinedType() const { return this->getCombinedType().length() == 3; } //! Get engine type, e.g. "J" QString getEngineType() const; //! Set type - void setAircraftCombinedType(const QString &type) { this->m_aircraftCombinedType = type.trimmed().toUpper(); } + void setCombinedType(const QString &type) { this->m_combinedType = type.trimmed().toUpper(); } //! Get model description, e.g. "A-330-200" const QString &getModelDescription() const { return m_modelDescription; } @@ -114,14 +117,14 @@ namespace BlackMisc private: BLACK_ENABLE_TUPLE_CONVERSION(CAircraftIcaoCode) - QString m_aircraftDesignator; //!< "B737" - QString m_aircraftCombinedType; //!< "L2J" - QString m_manufacturer; //!< "Airbus" - QString m_modelDescription; //!< "A-330-200" - QString m_wtc; //!< wake turbulence "M","H" "L/M", "L" + QString m_designator; //!< "B737" + QString m_combinedType; //!< "L2J" + QString m_manufacturer; //!< "Airbus" + QString m_modelDescription; //!< "A-330-200" + QString m_wtc; //!< wake turbulence "M","H" "L/M", "L" bool m_military = false; - bool m_realworld = true; //!< real world aircraft - bool m_legacy = true; //!< legacy code + bool m_realworld = true; //!< real world aircraft + bool m_legacy = false; //!< legacy code }; } // namespace @@ -129,8 +132,8 @@ namespace BlackMisc Q_DECLARE_METATYPE(BlackMisc::Aviation::CAircraftIcaoCode) BLACK_DECLARE_TUPLE_CONVERSION(BlackMisc::Aviation::CAircraftIcaoCode, ( - o.m_aircraftDesignator, - o.m_aircraftCombinedType, + o.m_designator, + o.m_combinedType, o.m_manufacturer, o.m_modelDescription, o.m_wtc, diff --git a/src/blackmisc/aviation/aircrafticaodata.cpp b/src/blackmisc/aviation/aircrafticaodata.cpp index 8a1210148..fc116a89a 100644 --- a/src/blackmisc/aviation/aircrafticaodata.cpp +++ b/src/blackmisc/aviation/aircrafticaodata.cpp @@ -21,43 +21,30 @@ namespace BlackMisc { CAircraftIcaoData::CAircraftIcaoData(const QString &icao, const QString &airline) - : m_aircraftDesignator(icao.trimmed().toUpper()), m_airlineDesignator(airline.trimmed().toUpper()) + : m_aircraftIcao(icao), m_airlineIcao(airline) + {} + + CAircraftIcaoData::CAircraftIcaoData(const CAircraftIcaoCode &icaoAircraft, const CAirlineIcaoCode &icaoAirline, const QString &color) + : m_aircraftIcao(icaoAircraft), m_airlineIcao(icaoAirline), m_aircraftColor(color) {} QString CAircraftIcaoData::convertToQString(bool i18n) const { Q_UNUSED(i18n); - QString s(this->m_aircraftDesignator); - if (this->hasAircraftCombinedType()) s.append(" ").append(this->m_aircraftCombinedType); - if (this->hasAirlineDesignator()) s.append(" ").append(this->m_airlineDesignator); - if (this->hasLivery()) s.append(" ").append(this->m_livery); - if (this->hasAircraftColor()) s.append(" ").append(this->m_aircraftColor); + QString s(this->m_aircraftIcao.toQString(i18n)); + s.append(" ").append(this->m_airlineIcao.toQString(i18n)); + if (this->hasLivery()) { s.append(" ").append(this->m_livery); } + if (this->hasAircraftColor()) { s.append(" ").append(this->m_aircraftColor); } return s; } - bool CAircraftIcaoData::hasAircraftDesignator() const - { - return !this->m_aircraftDesignator.isEmpty(); - } - - bool CAircraftIcaoData::hasKnownAircraftDesignator() const - { - return (this->hasAircraftDesignator() && this->getAircraftDesignator() != "ZZZZ"); - } - - QString CAircraftIcaoData::getEngineType() const - { - if (this->m_aircraftCombinedType.length() != 3) return ""; - return this->m_aircraftCombinedType.right(1); - } - QString CAircraftIcaoData::asString() const { - if (this->m_aircraftDesignator.isEmpty()) { return ""; } - QString s(this->m_aircraftDesignator); - if (!this->m_airlineDesignator.isEmpty()) + if (!this->hasAircraftDesignator()) { return ""; } + QString s(this->getAircraftDesignator()); + if (this->hasAirlineDesignator()) { - s.append(" (").append(this->m_airlineDesignator).append(")"); + s.append(" (").append(this->getAirlineDesignator()).append(")"); return s; } if (!this->m_aircraftColor.isEmpty()) @@ -70,9 +57,9 @@ namespace BlackMisc void CAircraftIcaoData::updateMissingParts(const CAircraftIcaoData &icao) { - if (this->m_aircraftDesignator.isEmpty()) { this->setAircraftDesignator(icao.getAircraftDesignator()); } - if (this->m_airlineDesignator.isEmpty()) { this->setAirlineDesignator(icao.getAirlineDesignator()); } - if (this->m_aircraftCombinedType.isEmpty()) { this->setAircraftCombinedType(icao.getAircraftCombinedType()); } + if (!this->hasAircraftDesignator()) { this->setAircraftDesignator(icao.getAircraftDesignator()); } + if (!this->hasAirlineDesignator()) { this->setAirlineDesignator(icao.getAirlineDesignator()); } + if (!this->hasAircraftCombinedType()) { this->setAircraftCombinedType(icao.getAircraftCombinedType()); } if (this->m_aircraftColor.isEmpty()) { this->setAircraftColor(icao.getAircraftColor()); } if (this->m_livery.isEmpty()) { this->setLivery(icao.getLivery()); } } @@ -88,45 +75,20 @@ namespace BlackMisc return true; } - bool CAircraftIcaoData::isVtol() const - { - // special designators - if ( - this->m_aircraftDesignator == "BALL" || - this->m_aircraftDesignator == "SHIP" || - this->m_aircraftDesignator == "GYRO" || - this->m_aircraftDesignator == "UHEL" - ) { return true; } - - if (!m_aircraftCombinedType.isEmpty()) - { - if ( - this->m_aircraftCombinedType.startsWith('G') || // gyrocopter - this->m_aircraftCombinedType.startsWith('H') || // helicopter - this->m_aircraftCombinedType.startsWith('T') // tilt wing - ) { return true; } - } - return false; - } - CVariant CAircraftIcaoData::propertyByIndex(const BlackMisc::CPropertyIndex &index) const { if (index.isMyself()) { return this->toCVariant(); } ColumnIndex i = index.frontCasted(); switch (i) { - case IndexAircraftDesignator: - return CVariant::fromValue(this->m_aircraftDesignator); - case IndexAirlineDesignator: - return CVariant::fromValue(this->m_airlineDesignator); - case IndexCombinedAircraftType: - return CVariant::fromValue(this->m_aircraftCombinedType); + case IndexAircraftIcao: + return CVariant::fromValue(this->m_aircraftIcao); + case IndexAirlineIcao: + return CVariant::fromValue(this->m_airlineIcao); case IndexAircraftColor: return CVariant::fromValue(this->m_aircraftColor); case IndexAsString: return CVariant::fromValue(this->asString()); - case IndexIsVtol: - return CVariant::fromValue(this->isVtol()); default: return CValueObject::propertyByIndex(index); } @@ -143,14 +105,11 @@ namespace BlackMisc ColumnIndex i = index.frontCasted(); switch (i) { - case IndexAircraftDesignator: - this->setAircraftDesignator(variant.value()); + case IndexAircraftIcao: + this->m_aircraftIcao.setPropertyByIndex(variant, index.copyFrontRemoved()); break; - case IndexAirlineDesignator: - this->setAirlineDesignator(variant.value()); - break; - case IndexCombinedAircraftType: - this->setAircraftCombinedType(variant.value()); + case IndexAirlineIcao: + this->m_airlineIcao.setPropertyByIndex(variant, index.copyFrontRemoved()); break; case IndexAircraftColor: this->setAircraftColor(variant.value()); @@ -161,26 +120,5 @@ namespace BlackMisc } } - bool CAircraftIcaoData::isValidDesignator(const QString &designator) - { - static QRegularExpression regexp("^[A-Z]+[A-Z0-9]*$"); - if (designator.length() < 2 || designator.length() > 5) { return false; } - return (regexp.match(designator).hasMatch()); - } - - bool CAircraftIcaoData::isValidCombinedType(const QString &combinedType) - { - static QRegularExpression regexp("^[A-Z][0-9][A-Z]$"); - if (combinedType.length() != 3) return false; - return (regexp.match(combinedType).hasMatch()); - } - - bool CAircraftIcaoData::isValidAirlineDesignator(const QString &airline) - { - static QRegularExpression regexp("^[A-Z]+[A-Z0-9]*$"); - if (airline.length() < 2 || airline.length() > 5) return false; - return (regexp.match(airline).hasMatch()); - } - } // namespace } // namespace diff --git a/src/blackmisc/aviation/aircrafticaodata.h b/src/blackmisc/aviation/aircrafticaodata.h index 00d21dc7d..d06a7ce93 100644 --- a/src/blackmisc/aviation/aircrafticaodata.h +++ b/src/blackmisc/aviation/aircrafticaodata.h @@ -12,6 +12,8 @@ #ifndef BLACKMISC_AVIATION_AIRCRAFTICAODATA_H #define BLACKMISC_AVIATION_AIRCRAFTICAODATA_H +#include "blackmisc/aviation/aircrafticaocode.h" +#include "blackmisc/aviation/airlineicaocode.h" #include "blackmisc/blackmiscexport.h" #include "blackmisc/valueobject.h" #include "blackmisc/propertyindex.h" @@ -21,64 +23,56 @@ namespace BlackMisc { namespace Aviation { - //! Value object for ICAO classification + //! Value object for ICAO classification (airline ICAO, aircraft ICAO, livery ..) class BLACKMISC_EXPORT CAircraftIcaoData : public CValueObject { public: //! Properties by index enum ColumnIndex { - IndexAircraftDesignator = BlackMisc::CPropertyIndex::GlobalIndexCAircraftIcaoData, - IndexCombinedAircraftType, - IndexAirlineDesignator, + IndexAircraftIcao = BlackMisc::CPropertyIndex::GlobalIndexCAircraftIcaoData, + IndexAirlineIcao, IndexAircraftColor, IndexAsString, - IndexIsVtol }; //! Default constructor. CAircraftIcaoData() = default; - //! Constructor. - explicit CAircraftIcaoData(const QString &icao) : m_aircraftDesignator(icao.trimmed().toUpper()) {} - //! Constructor. //! \param icao "B737" //! \param airline "DLH" - CAircraftIcaoData(const QString &icao, const QString &airline); + CAircraftIcaoData(const QString &icao, const QString &airline = ""); - /*! - * Constructor. - * \param icao "B737" - * \param combinedType "L2J" - * \param airline "DLH" - * \param livery "FREIGHT" - * \param color "CCFFDD" (RGB) - */ - CAircraftIcaoData(const QString &icao, const QString &combinedType, const QString &airline, const QString &livery, const QString &color) - : m_aircraftDesignator(icao.trimmed().toUpper()), m_aircraftCombinedType(combinedType.trimmed().toUpper()), m_airlineDesignator(airline.trimmed().toUpper()), - m_livery(livery.trimmed().toUpper()), m_aircraftColor(color.trimmed().toUpper()) {} + //! Constructor. + CAircraftIcaoData(const BlackMisc::Aviation::CAircraftIcaoCode &icaoAircraft, const BlackMisc::Aviation::CAirlineIcaoCode &icaoAirline, const QString &color = ""); //! Get ICAO designator, e.g. "B737" - const QString &getAircraftDesignator() const { return m_aircraftDesignator; } + const QString &getAircraftDesignator() const { return m_aircraftIcao.getDesignator(); } + + //! Get aircraft ICAO object + const BlackMisc::Aviation::CAircraftIcaoCode &getAircraftIcaoCode() const { return this->m_aircraftIcao; } //! Set ICAO designator, e.g. "B737" - void setAircraftDesignator(const QString &icaoDesignator) { this->m_aircraftDesignator = icaoDesignator.trimmed().toUpper(); } + void setAircraftDesignator(const QString &icaoDesignator) { this->m_aircraftIcao.setDesignator(icaoDesignator); } //! Aircraft designator? - bool hasAircraftDesignator() const; + bool hasAircraftDesignator() const { return this->m_aircraftIcao.hasDesignator(); } //! Has designator and designator is not "ZZZZ" - bool hasKnownAircraftDesignator() const; + bool hasKnownAircraftDesignator() const { return (this->m_aircraftIcao.hasKnownDesignator()); } //! Get airline, e.g. "DLH" - const QString &getAirlineDesignator() const { return this->m_airlineDesignator; } + const QString &getAirlineDesignator() const { return this->m_airlineIcao.getDesignator(); } + + //! Get airline ICAO object + const BlackMisc::Aviation::CAirlineIcaoCode &getAirlineIcaoCode() const { return this->m_airlineIcao; } //! Set airline, e.g. "DLH" - void setAirlineDesignator(const QString &icaoDesignator) { this->m_airlineDesignator = icaoDesignator.trimmed().toUpper(); } + void setAirlineDesignator(const QString &icaoDesignator) { this->m_airlineIcao.setDesignator(icaoDesignator); } //! Airline available? - bool hasAirlineDesignator() const { return !this->m_airlineDesignator.isEmpty(); } + bool hasAirlineDesignator() const { return this->m_airlineIcao.hasDesignator(); } //! Airline and Aircraft designator? bool hasAircraftAndAirlineDesignator() const { return this->hasAirlineDesignator() && this->hasAircraftDesignator(); } @@ -105,20 +99,20 @@ namespace BlackMisc bool hasAircraftColor() const { return !this->m_aircraftColor.isEmpty(); } //! Get type, e.g. "L2J" - const QString &getAircraftCombinedType() const { return this->m_aircraftCombinedType; } + const QString &getAircraftCombinedType() const { return this->m_aircraftIcao.getCombinedType(); } //! Combined type available? - bool hasAircraftCombinedType() const { return this->getAircraftCombinedType().length() == 3; } + bool hasAircraftCombinedType() const { return this->m_aircraftIcao.hasCombinedType(); } //! Get engine type, e.g. "J" - QString getEngineType() const; + QString getEngineType() const { return this->m_aircraftIcao.getEngineType(); } //! As string for GUI representation by index //! \remarks Different from toQString() QString asString() const; //! Set type - void setAircraftCombinedType(const QString &type) { this->m_aircraftCombinedType = type.trimmed().toUpper(); } + void setAircraftCombinedType(const QString &type) { this->m_aircraftIcao.setCombinedType(type); } //! Missing parts from another ICAO object void updateMissingParts(const CAircraftIcaoData &icao); @@ -127,7 +121,7 @@ namespace BlackMisc bool matchesWildcardIcao(const CAircraftIcaoData &otherIcao) const; //! Is VTOL aircraft - bool isVtol() const; + bool isVtol() const { return m_aircraftIcao.isVtol(); } //! \copydoc CValueObject::propertyByIndex CVariant propertyByIndex(const BlackMisc::CPropertyIndex &index) const; @@ -135,37 +129,25 @@ namespace BlackMisc //! \copydoc CValueObject::setPropertyByIndex void setPropertyByIndex(const CVariant &variant, const BlackMisc::CPropertyIndex &index); - //! Valid designator? - static bool isValidDesignator(const QString &designator); - - //! Valid combined type - static bool isValidCombinedType(const QString &combinedType); - - //! Valid designator? - static bool isValidAirlineDesignator(const QString &airline); - //! \copydoc CValueObject::convertToQString QString convertToQString(bool i18n = false) const; private: BLACK_ENABLE_TUPLE_CONVERSION(CAircraftIcaoData) - QString m_aircraftDesignator; //!< "B737" - QString m_aircraftCombinedType; //!< "L2J" - QString m_airlineDesignator; //!< "DLH" + BlackMisc::Aviation::CAircraftIcaoCode m_aircraftIcao; //!< "B737", ... + BlackMisc::Aviation::CAirlineIcaoCode m_airlineIcao; //!< "DLH", ... QString m_livery; - QString m_aircraftColor; //!< RGB Hex "330044" + QString m_aircraftColor; //!< RGB Hex "330044" }; } // namespace } // namespace Q_DECLARE_METATYPE(BlackMisc::Aviation::CAircraftIcaoData) BLACK_DECLARE_TUPLE_CONVERSION(BlackMisc::Aviation::CAircraftIcaoData, ( - o.m_aircraftDesignator, - o.m_aircraftCombinedType, - o.m_airlineDesignator, + o.m_aircraftIcao, + o.m_airlineIcao, o.m_livery, o.m_aircraftColor )) - #endif // guard diff --git a/src/blackmisc/blackmiscfreefunctions.cpp b/src/blackmisc/blackmiscfreefunctions.cpp index 4280e0604..bea853314 100644 --- a/src/blackmisc/blackmiscfreefunctions.cpp +++ b/src/blackmisc/blackmiscfreefunctions.cpp @@ -203,7 +203,7 @@ QVariant BlackMisc::fixQVariantFromDbusArgument(const QVariant &variant, int loc meta->unmarshall(arg, valueVariant.data()); return valueVariant; } - Q_ASSERT_X(false, "fixQVariantFromDbusArgument", "no meta"); + Q_ASSERT_X(false, Q_FUNC_INFO, "no meta"); return valueVariant; } } diff --git a/src/blackmisc/network/client.h b/src/blackmisc/network/client.h index f2eb5e864..38d2ab240 100644 --- a/src/blackmisc/network/client.h +++ b/src/blackmisc/network/client.h @@ -23,9 +23,7 @@ namespace BlackMisc { namespace Network { - /*! - * Another client software. - */ + //! Another client software. class BLACKMISC_EXPORT CClient : public CValueObject { public: @@ -133,11 +131,11 @@ namespace BlackMisc private: BLACK_ENABLE_TUPLE_CONVERSION(CClient) - CUser m_user; - BlackMisc::Simulation::CAircraftModel m_model; - CPropertyIndexVariantMap m_capabilities; - QString m_server; - CVoiceCapabilities m_voiceCapabilities; + BlackMisc::Network::CUser m_user; + BlackMisc::Simulation::CAircraftModel m_model; + BlackMisc::CPropertyIndexVariantMap m_capabilities; + QString m_server; + BlackMisc::Network::CVoiceCapabilities m_voiceCapabilities; }; } // namespace } // namespace @@ -145,7 +143,7 @@ namespace BlackMisc BLACK_DECLARE_TUPLE_CONVERSION(BlackMisc::Network::CClient, ( o.m_user, o.m_model, - attr(o.m_capabilities, flags()), + attr(o.m_capabilities, flags < DisabledForComparison | DisabledForJson > ()), o.m_server, o.m_voiceCapabilities )) diff --git a/src/blackmisc/simulation/fscommon/aircraftmapper.cpp b/src/blackmisc/simulation/fscommon/aircraftmapper.cpp index 61adb96bb..9f7afdb21 100644 --- a/src/blackmisc/simulation/fscommon/aircraftmapper.cpp +++ b/src/blackmisc/simulation/fscommon/aircraftmapper.cpp @@ -111,7 +111,9 @@ namespace BlackMisc "Boeing 737-800 Paint1", CAircraftModel::TypeModelMatchingDefaultModel, "B737-800 default model", - CAircraftIcaoData("B738", "L2J", "", "", "FFFFFF") + CAircraftIcaoData( + CAircraftIcaoCode("B738", "L2J"), CAirlineIcaoCode(), "FFFFFF" + ) ); return aircraftModel; } diff --git a/tests/blackcore/testnetwork.cpp b/tests/blackcore/testnetwork.cpp index 2fa566f93..ea51adf77 100644 --- a/tests/blackcore/testnetwork.cpp +++ b/tests/blackcore/testnetwork.cpp @@ -23,7 +23,9 @@ void BlackCoreTest::CTestNetwork::networkTest(BlackCore::INetwork *net) EXPECT_UNIT(e) .send(&INetwork::presetServer, CServer("", "", "vatsim-germany.org", 6809, CUser("1234567", "", "", "123456"))) .send(&INetwork::presetCallsign, "SWIFT") - .send(&INetwork::presetIcaoCodes, CAircraftIcaoData("C172", "P1L", "YYY", "YYY", "white")) + .send(&INetwork::presetIcaoCodes, CAircraftIcaoData( + CAircraftIcaoCode("C172", "P1L"), + CAirlineIcaoCode("YYY"), "white")) .send(&INetwork::initiateConnection) .expect(&INetwork::connectionStatusChanged, [](INetwork::ConnectionStatus, INetwork::ConnectionStatus newStatus) { diff --git a/tests/blackmisc/testaviation.cpp b/tests/blackmisc/testaviation.cpp index 5e4546797..dbf3cddd1 100644 --- a/tests/blackmisc/testaviation.cpp +++ b/tests/blackmisc/testaviation.cpp @@ -159,12 +159,16 @@ namespace BlackMiscTest CAircraftSituation situation2(situation1); QVERIFY2(situation1 == situation2, "situations shall be equal"); - CAircraftIcaoData icao1("C172", "L1P", "GA", "GA", "0000ff"); + CAircraftIcaoData icao1( + CAircraftIcaoCode("C172", "L1P"), + CAirlineIcaoCode("GA"), + "0000ff" + ); CAircraftIcaoData icao2(icao1); QVERIFY2(icao1 == icao2, "ICAOs shall be equal"); - CCallsign call1("EDDS_N_APP"); - CCallsign call2("edds_n_app"); + CCallsign call1("EDDS_N_APP", CCallsign::Atc); + CCallsign call2("edds_n_app", CCallsign::Atc); QVERIFY2(call1 == call2, "Callsigns shall be equal"); CAtcStation atc1(c1, user1, f1, situation1.getPosition(), CLength(), false, QDateTime(), QDateTime(), CInformationMessage(CInformationMessage::ATIS, "foo"));