From 66023d2d87399ed7536339342a7cbf6d23c53618 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 6 May 2014 13:33:05 +0200 Subject: [PATCH] refs #227, added support for client/aircraft model in contexts * Simulator * Network --- src/blackcore/context_network.h | 7 + src/blackcore/context_network_atc.cpp | 63 -------- src/blackcore/context_network_impl.cpp | 177 ++++++++++++++++++++++ src/blackcore/context_network_impl.h | 18 +++ src/blackcore/context_network_proxy.cpp | 10 ++ src/blackcore/context_network_proxy.h | 6 + src/blackcore/context_simulator.h | 4 + src/blackcore/context_simulator_impl.cpp | 5 + src/blackcore/context_simulator_impl.h | 8 + src/blackcore/context_simulator_proxy.cpp | 5 + src/blackcore/context_simulator_proxy.h | 3 + 11 files changed, 243 insertions(+), 63 deletions(-) diff --git a/src/blackcore/context_network.h b/src/blackcore/context_network.h index 136435250..0945f941f 100644 --- a/src/blackcore/context_network.h +++ b/src/blackcore/context_network.h @@ -12,6 +12,7 @@ #include "blackmisc/statusmessagelist.h" #include "blackmisc/nwtextmessagelist.h" #include "blackmisc/nwuserlist.h" +#include "blackmisc/nwclientlist.h" #include "blackmisc/voiceroomlist.h" #include "blackcore/network.h" @@ -100,6 +101,12 @@ namespace BlackCore //! Get own aircraft virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const = 0; + //! Information about other clients + virtual BlackMisc::Network::CClientList getOtherClients() const = 0; + + //! Clients for given callsign, e.g. to test direct model + virtual BlackMisc::Network::CClientList getOtherClientsForCallsigns(const BlackMisc::Aviation::CCallsignList &callsigns) const = 0; + /*! * \brief Connect to Network * \return messages gererated during connecting diff --git a/src/blackcore/context_network_atc.cpp b/src/blackcore/context_network_atc.cpp index 6b7277f27..341967d87 100644 --- a/src/blackcore/context_network_atc.cpp +++ b/src/blackcore/context_network_atc.cpp @@ -163,69 +163,6 @@ namespace BlackCore return rooms; } - /* - * All users - */ - CUserList CContextNetwork::getUsers() const - { - CUserList users; - foreach(CAtcStation station, this->m_atcStationsOnline) - { - CUser user = station.getController(); - users.push_back(user); - } - foreach(CAircraft aircraft, this->m_aircraftsInRange) - { - CUser user = aircraft.getPilot(); - users.push_back(user); - } - return users; - } - - /* - * Users with callsigns - */ - CUserList CContextNetwork::getUsersForCallsigns(const CCallsignList &callsigns) const - { - CUserList users; - if (callsigns.isEmpty()) return users; - CCallsignList searchList(callsigns); - - // do aircrafts first, this will handle most callsigns - foreach(CAircraft aircraft, this->m_aircraftsInRange) - { - if (searchList.isEmpty()) break; - CCallsign callsign = aircraft.getCallsign(); - if (searchList.contains(callsign)) - { - CUser user = aircraft.getPilot(); - users.push_back(user); - searchList.remove(callsign); - } - } - - foreach(CAtcStation station, this->m_atcStationsOnline) - { - if (searchList.isEmpty()) break; - CCallsign callsign = station.getCallsign(); - if (searchList.contains(callsign)) - { - CUser user = station.getController(); - users.push_back(user); - searchList.remove(callsign); - } - } - - // we might have unresolved callsigns - foreach(CCallsign callsign, searchList) - { - CUser user; - user.setCallsign(callsign); - users.push_back(user); - } - return users; - } - /* * ATC Position update */ diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index abe0672b7..e581833de 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -7,6 +7,7 @@ #include "context_runtime.h" #include "context_settings.h" #include "context_application.h" +#include "context_simulator.h" #include "network_vatlib.h" #include "vatsimbookingreader.h" #include "vatsimdatafilereader.h" @@ -72,6 +73,9 @@ namespace BlackCore this->connect(this->m_network, &INetwork::aircraftPositionUpdate, this, &CContextNetwork::psFsdAircraftUpdateReceived); this->connect(this->m_network, &INetwork::frequencyReplyReceived, this, &CContextNetwork::psFsdFrequencyReceived); this->connect(this->m_network, &INetwork::textMessagesReceived, this, &CContextNetwork::psFsdTextMessageReceived); + this->connect(this->m_network, &INetwork::capabilitiesReplyReceived, this, &CContextNetwork::psFsdCapabilitiesReplyReceived); + this->connect(this->m_network, &INetwork::customPacketReceived, this, &CContextNetwork::psFsdCustomPackageReceived); + this->connect(this->m_network, &INetwork::serverReplyReceived, this, &CContextNetwork::psFsdServerReplyReceived); if (this->getIContextApplication()) this->connect(this->m_network, &INetwork::statusMessage, this->getIContextApplication(), &IContextApplication::sendStatusMessage); } @@ -121,6 +125,10 @@ namespace BlackCore { msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityWarning, "Invalid user credentials")); } + else if (!this->m_ownAircraft.getIcaoInfo().hasAircraftAndAirlineDsignator()) + { + msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityWarning, "Invalid ICAO data for own aircraft")); + } else if (this->m_network->isConnected()) { msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityWarning, "Already connected")); @@ -164,6 +172,7 @@ namespace BlackCore this->m_aircraftsInRange.clear(); this->m_atcStationsBooked.clear(); this->m_atcStationsOnline.clear(); + this->m_otherClients.clear(); this->m_metarCache.clear(); msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityInfo, "Connection terminating")); } @@ -276,6 +285,95 @@ namespace BlackCore this->m_network->sendFlightPlan(flightPlan); } + /* + * All users + */ + CUserList CContextNetwork::getUsers() const + { + CUserList users; + foreach(CAtcStation station, this->m_atcStationsOnline) + { + CUser user = station.getController(); + users.push_back(user); + } + foreach(CAircraft aircraft, this->m_aircraftsInRange) + { + CUser user = aircraft.getPilot(); + users.push_back(user); + } + return users; + } + + /* + * Users with callsigns + */ + CUserList CContextNetwork::getUsersForCallsigns(const CCallsignList &callsigns) const + { + CUserList users; + if (callsigns.isEmpty()) return users; + CCallsignList searchList(callsigns); + + // do aircrafts first, this will handle most callsigns + foreach(CAircraft aircraft, this->m_aircraftsInRange) + { + if (searchList.isEmpty()) break; + CCallsign callsign = aircraft.getCallsign(); + if (searchList.contains(callsign)) + { + CUser user = aircraft.getPilot(); + users.push_back(user); + searchList.remove(callsign); + } + } + + foreach(CAtcStation station, this->m_atcStationsOnline) + { + if (searchList.isEmpty()) break; + CCallsign callsign = station.getCallsign(); + if (searchList.contains(callsign)) + { + CUser user = station.getController(); + users.push_back(user); + searchList.remove(callsign); + } + } + + // we might have unresolved callsigns + foreach(CCallsign callsign, searchList) + { + CUser user; + user.setCallsign(callsign); + users.push_back(user); + } + return users; + } + + /* + * Other clients + */ + CClientList CContextNetwork::getOtherClients() const + { + return this->m_otherClients; + } + + /* + * Other clients + */ + CClientList CContextNetwork::getOtherClientsForCallsigns(const CCallsignList &callsigns) const + { + CClientList clients; + if (callsigns.isEmpty()) return clients; + foreach(CCallsign callsign, callsigns) + { + CClientList clientsForCallsign = this->m_otherClients.findBy(&CClient::getCallsign, callsign); + foreach(CClient c, clientsForCallsign) + { + clients.push_back(c); + } + } + return clients; + } + /* * Connection status changed */ @@ -316,6 +414,9 @@ namespace BlackCore vm = CIndexVariantMap(CAircraft::IndexPilotRealName, realname); this->m_aircraftsInRange.applyIf(&CAircraft::getCallsign, callsign, vm); + + vm = CIndexVariantMap(CClient::IndexRealName, realname); + this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm); } /* @@ -337,4 +438,80 @@ namespace BlackCore this->textMessagesReceived(messages); // relay } + /* + * Capabilities + */ + void CContextNetwork::psFsdCapabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags) + { + if (callsign.isEmpty()) return; + CIndexVariantMap capabilities; + capabilities.addValue(CClient::FsdAtisCanBeReceived, (flags & CNetworkVatlib::AcceptsAtisResponses)); + capabilities.addValue(CClient::FsdWithInterimPositions, (flags & CNetworkVatlib::SupportsInterimPosUpdates)); + capabilities.addValue(CClient::FsdWithModelDescription, (flags & CNetworkVatlib::SupportsModelDescriptions)); + CIndexVariantMap vm(CClient::IndexCapabilities, capabilities.toQVariant()); + this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm); + } + + /* + * Custom packages + */ + void CContextNetwork::psFsdCustomPackageReceived(const CCallsign &callsign, const QString &package, const QStringList &data) + { + if (callsign.isEmpty() || data.isEmpty()) return; + if (package.startsWith("FSIPIR", Qt::CaseInsensitive)) + { + // Request of other client, I can get the other's model from that + // FsInn response is usually my model + QString model = data.last(); + if (model.isEmpty()) return; + CIndexVariantMap vm(CClient::IndexQueriedModelString, QVariant(model)); + if (!this->m_otherClients.contains(&CClient::getCallsign, callsign)) + { + // with custom packages it can happen, + //the package is received before any other package + this->m_otherClients.push_back(CClient(callsign)); + } + this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm); + this->sendFsipiCustomPackage(callsign); // response + } + } + + /* + * Host + */ + void CContextNetwork::psFsdServerReplyReceived(const CCallsign &callsign, const QString &host) + { + if (callsign.isEmpty() || host.isEmpty()) return; + CIndexVariantMap vm(CClient::IndexHost, QVariant(host)); + this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm); + } + + void CContextNetwork::sendFsipiCustomPackage(const CCallsign &recipientCallsign) const + { + QStringList data = this->createFsipiCustomPackageData(); + this->m_network->sendCustomPacket(recipientCallsign.asString(), "FSIPI", data); + } + + void CContextNetwork::sendFsipirCustomPackage(const CCallsign &recipientCallsign) const + { + QStringList data = this->createFsipiCustomPackageData(); + this->m_network->sendCustomPacket(recipientCallsign.asString(), "FSIPIR", data); + } + + QStringList CContextNetwork::createFsipiCustomPackageData() const + { + CAircraft me = this->getOwnAircraft(); + CAircraftIcao icao = me.getIcaoInfo(); + QString modelString; + if (this->getIContextSimulator()) + { + if (this->getIContextSimulator()->isConnected()) modelString = this->getIContextSimulator()->getOwnAircraftModel().getQueriedModelString(); + } + if (modelString.isEmpty()) modelString = CProject::systemNameAndVersion(); + QStringList data = CNetworkVatlib::createFsipiCustomPackageData( + "0", icao.getAirlineDesignator(), icao.getAircraftDesignator(), + "", "", "", "", + icao.getAircraftCombinedType(), modelString); + return data; + } } // namespace diff --git a/src/blackcore/context_network_impl.h b/src/blackcore/context_network_impl.h index a6a3c0186..7e4800e0f 100644 --- a/src/blackcore/context_network_impl.h +++ b/src/blackcore/context_network_impl.h @@ -13,6 +13,7 @@ #include "blackcore/network.h" #include "blackmisc/avatcstationlist.h" #include "blackmisc/setnetwork.h" +#include "blackmisc/nwclientlist.h" #include @@ -105,6 +106,12 @@ namespace BlackCore //! \copydoc IContextNetwork::getUsersForCallsigns virtual BlackMisc::Network::CUserList getUsersForCallsigns(const BlackMisc::Aviation::CCallsignList &callsigns) const override; + //! \copydoc IContextNetwork::getOtherClients + virtual BlackMisc::Network::CClientList getOtherClients() const override; + + //! \copydoc IContextNetwork::getOtherClientForCallsigns + virtual BlackMisc::Network::CClientList getOtherClientsForCallsigns(const BlackMisc::Aviation::CCallsignList &callsigns) const override; + //! \copydoc IContextNetwork::requestDataUpdates virtual void requestDataUpdates()override; @@ -127,6 +134,7 @@ namespace BlackCore BlackMisc::Aviation::CAtcStationList m_atcStationsOnline; BlackMisc::Aviation::CAtcStationList m_atcStationsBooked; BlackMisc::Aviation::CAircraftList m_aircraftsInRange; + BlackMisc::Network::CClientList m_otherClients; BlackCore::INetwork *m_network; BlackMisc::Aviation::CAircraft m_ownAircraft; QMap m_metarCache /*!< Keep METARs for a while */; @@ -225,6 +233,16 @@ namespace BlackCore //! Radio text messages received void psFsdTextMessageReceived(const BlackMisc::Network::CTextMessageList &messages); + + //! Capabilities received + void psFsdCapabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags); + + //! Custom package + void psFsdCustomPackageReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &package, const QStringList &data); + + //! Server reply received + void psFsdServerReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &host); + }; } diff --git a/src/blackcore/context_network_proxy.cpp b/src/blackcore/context_network_proxy.cpp index 64672f019..f171539a6 100644 --- a/src/blackcore/context_network_proxy.cpp +++ b/src/blackcore/context_network_proxy.cpp @@ -93,6 +93,16 @@ namespace BlackCore return this->m_dBusInterface->callDBusRet(QLatin1Literal("getUsersForCallsigns"), callsigns); } + BlackMisc::Network::CClientList CContextNetworkProxy::getOtherClients() const + { + return this->m_dBusInterface->callDBusRet(QLatin1Literal("getOtherClients")); + } + + BlackMisc::Network::CClientList CContextNetworkProxy::getOtherClientsForCallsigns(const BlackMisc::Aviation::CCallsignList &callsigns) const + { + return this->m_dBusInterface->callDBusRet(QLatin1Literal("getOtherClientsForCallsigns"), callsigns); + } + BlackMisc::Audio::CVoiceRoomList CContextNetworkProxy::getSelectedVoiceRooms() const { return this->m_dBusInterface->callDBusRet(QLatin1Literal("getSelectedVoiceRooms")); diff --git a/src/blackcore/context_network_proxy.h b/src/blackcore/context_network_proxy.h index 426c380cf..c1e6aadc7 100644 --- a/src/blackcore/context_network_proxy.h +++ b/src/blackcore/context_network_proxy.h @@ -119,6 +119,12 @@ namespace BlackCore //! \copydoc IContextNetwork::getUsersForCallsigns virtual BlackMisc::Network::CUserList getUsersForCallsigns(const BlackMisc::Aviation::CCallsignList &callsigns) const override; + //! \copydoc IContextNetwork::getOtherClients + virtual BlackMisc::Network::CClientList getOtherClients() const override; + + //! \copydoc IContextNetwork::getOtherClientForCallsigns + virtual BlackMisc::Network::CClientList getOtherClientsForCallsigns(const BlackMisc::Aviation::CCallsignList &callsigns) const override; + //! \copydoc IContextNetwork::requestDataUpdates virtual void requestDataUpdates()override; diff --git a/src/blackcore/context_simulator.h b/src/blackcore/context_simulator.h index a80f24966..55c4729cf 100644 --- a/src/blackcore/context_simulator.h +++ b/src/blackcore/context_simulator.h @@ -12,6 +12,7 @@ #include "context.h" #include "blackcore/dbus_server.h" #include "blackcore/context_runtime.h" +#include "blackmisc/nwaircraftmodel.h" #include "blackmisc/avaircraft.h" #include "blacksim/simulatorinfo.h" #include "blacksim/simulatorinfolist.h" @@ -74,6 +75,9 @@ namespace BlackCore //! Simulator info virtual BlackSim::CSimulatorInfo getSimulatorInfo() const = 0; + //! Aircraft model + virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const = 0; + //! Load specific simulator plugin virtual bool loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) = 0; diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index c45cce6d6..12cfb4902 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -91,6 +91,11 @@ namespace BlackCore return m_simulator->getSimulatorInfo(); } + Network::CAircraftModel CContextSimulator::getOwnAircraftModel() const + { + return this->m_aircraftModel; + } + bool CContextSimulator::loadSimulatorPlugin(const CSimulatorInfo &simulatorInfo) { ISimulatorFactory *factory = nullptr; diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index 8dee4274b..2b6ea7eed 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -32,6 +32,9 @@ namespace BlackCore //! \brief Destructor virtual ~CContextSimulator(); + //! Model name, e.g. as used with FSX "Cessna C172 Skyhawk" + void setModelName(const QString &modelName) { this->m_aircraftModel.setQueriedModelString(modelName); } + public slots: //! \copydoc IContextSimulator::getSimulatorPluginList() @@ -58,6 +61,9 @@ namespace BlackCore //! \copydoc IContextSimulator::getSimulatorInfo() virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; + //! \copydoc IContextSimulator::getAircraftModel() + virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const override; + //! \copydoc IContextSimulator::loadSimulatorPlugin() virtual bool loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) override; @@ -88,7 +94,9 @@ namespace BlackCore void findSimulatorPlugins(); BlackMisc::Aviation::CAircraft m_ownAircraft; + BlackMisc::Network::CAircraftModel m_aircraftModel; BlackCore::ISimulator *m_simulator; + QTimer *m_updateTimer; QDir m_pluginsDir; QSet m_simulatorFactories; diff --git a/src/blackcore/context_simulator_proxy.cpp b/src/blackcore/context_simulator_proxy.cpp index 68fbe3a9d..35f0ea34a 100644 --- a/src/blackcore/context_simulator_proxy.cpp +++ b/src/blackcore/context_simulator_proxy.cpp @@ -63,6 +63,11 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("getOwnAircraft")); } + BlackMisc::Network::CAircraftModel CContextSimulatorProxy::getOwnAircraftModel() const + { + return m_dBusInterface->callDBusRet(QLatin1Literal("getOwnAircraftModel")); + } + BlackSim::CSimulatorInfo CContextSimulatorProxy::getSimulatorInfo() const { return m_dBusInterface->callDBusRet(QLatin1Literal("getSimulatorInfo")); diff --git a/src/blackcore/context_simulator_proxy.h b/src/blackcore/context_simulator_proxy.h index 946ac6a5f..2b98214fa 100644 --- a/src/blackcore/context_simulator_proxy.h +++ b/src/blackcore/context_simulator_proxy.h @@ -57,6 +57,9 @@ namespace BlackCore //! \copydoc IContextSimulator::getOwnAircraft() virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override; + //! \copydoc IContextSimulator::getAircraftModel() + virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const override; + //! \copydoc IContextSimulator::getSimulatorInfo virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override;