diff --git a/libraries.pri b/libraries.pri index 4a7496c93..c38306ff9 100644 --- a/libraries.pri +++ b/libraries.pri @@ -7,7 +7,7 @@ blackgui { } blackcore { - LIBS += -lblackcore -lvatlib + LIBS += -lblackcore -lvatlib2 win32 { contains(BLACK_CONFIG, FSX) { diff --git a/samples/cli_client/client.cpp b/samples/cli_client/client.cpp index ef81256bc..87f44f2f0 100644 --- a/samples/cli_client/client.cpp +++ b/samples/cli_client/client.cpp @@ -61,8 +61,6 @@ Client::Client(QObject *parent) m_commands["help"] = std::bind(&Client::help, this, _1); m_commands["echo"] = std::bind(&Client::echo, this, _1); m_commands["exit"] = std::bind(&Client::exit, this, _1); - m_commands["getstatusurls"] = std::bind(&Client::getStatusUrlsCmd, this, _1); - m_commands["getservers"] = std::bind(&Client::getKnownServersCmd, this, _1); m_commands["setserver"] = std::bind(&Client::presetServerCmd, this, _1); m_commands["setcallsign"] = std::bind(&Client::presetCallsignCmd, this, _1); m_commands["icaocodes"] = std::bind(&Client::presetIcaoCodesCmd, this, _1); @@ -133,24 +131,6 @@ void Client::exit(QTextStream &) emit quit(); } -void Client::getStatusUrlsCmd(QTextStream &) -{ - auto urls = m_net->getStatusUrls(); - for (auto i = urls.begin(); i != urls.end(); ++i) - { - std::cout << i->toString().toStdString() << std::endl; - } -} - -void Client::getKnownServersCmd(QTextStream &) -{ - auto servers = m_net->getKnownServers(); - for (auto i = servers.begin(); i != servers.end(); ++i) - { - std::cout << i->toFormattedQString().toStdString() << std::endl; - } -} - void Client::presetServerCmd(QTextStream &args) { QString hostname; @@ -441,8 +421,7 @@ void Client::atcDisconnected(const BlackMisc::Aviation::CCallsign &callsign) std::cout << "ATC_DISCONNECTED " << callsign << std::endl; } -void Client::connectionStatusChanged(BlackCore::INetwork::ConnectionStatus oldStatus, BlackCore::INetwork::ConnectionStatus newStatus, - const QString &errorMessage) +void Client::connectionStatusChanged(BlackCore::INetwork::ConnectionStatus oldStatus, BlackCore::INetwork::ConnectionStatus newStatus) { switch (newStatus) { @@ -464,10 +443,6 @@ void Client::connectionStatusChanged(BlackCore::INetwork::ConnectionStatus oldSt case BlackCore::INetwork::Connecting: std::cout << " (was CONN_STATUS_CONNECTING)\n"; break; case BlackCore::INetwork::Connected: std::cout << " (was CONN_STATUS_CONNECTED)\n"; break; } - if (!errorMessage.isEmpty()) - { - std::cout << "REASON " << errorMessage.toStdString() << std::endl; - } } void Client::ipReplyReceived(const QString &ip) diff --git a/samples/cli_client/client.h b/samples/cli_client/client.h index 2d8dc5cf1..849935d5c 100644 --- a/samples/cli_client/client.h +++ b/samples/cli_client/client.h @@ -29,8 +29,6 @@ private: //commands void help(QTextStream &args); void echo(QTextStream &args); void exit(QTextStream &args); - void getStatusUrlsCmd(QTextStream &args); - void getKnownServersCmd(QTextStream &args); void presetServerCmd(QTextStream &args); void presetCallsignCmd(QTextStream &args); void presetIcaoCodesCmd(QTextStream &args); @@ -92,8 +90,7 @@ public slots: //to receive from INetwork void atcPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq, const BlackMisc::Geo::CCoordinateGeodetic &pos, const BlackMisc::PhysicalQuantities::CLength &range); void atcDisconnected(const BlackMisc::Aviation::CCallsign &callsign); - void connectionStatusChanged(BlackCore::INetwork::ConnectionStatus oldStatus, BlackCore::INetwork::ConnectionStatus newStatus, - const QString &errorMessage); + void connectionStatusChanged(BlackCore::INetwork::ConnectionStatus oldStatus, BlackCore::INetwork::ConnectionStatus newStatus); void ipReplyReceived(const QString &ip); void freqReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq); void serverReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &server); diff --git a/src/blackcore/context_network.h b/src/blackcore/context_network.h index 80f800068..b49f41d31 100644 --- a/src/blackcore/context_network.h +++ b/src/blackcore/context_network.h @@ -105,11 +105,10 @@ namespace BlackCore * Connection status changed * \param from old status * \param to new status - * \param message further details * \remarks If I use the enum, adaptor / interface are not created correctly * \see INetwork::ConnectionStatus */ - void connectionStatusChanged(uint from, uint to, const QString &message); + void connectionStatusChanged(uint from, uint to); //! Text messages received (also private chat messages, rfaio channel messages) void textMessagesReceived(const BlackMisc::Network::CTextMessageList &textMessages); diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index 2bf03a2d4..d6985b320 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -288,7 +288,7 @@ namespace BlackCore /* * Connection status changed */ - void CContextNetwork::ps_fsdConnectionStatusChanged(INetwork::ConnectionStatus from, INetwork::ConnectionStatus to, const QString &message) + void CContextNetwork::ps_fsdConnectionStatusChanged(INetwork::ConnectionStatus from, INetwork::ConnectionStatus to) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << from << to; auto fromOld = this->m_currentStatus; @@ -310,15 +310,15 @@ namespace BlackCore // send as message if (to == INetwork::DisconnectedError) { - CLogMessage(this).error("Connection status changed from %1 to %2 %3") << INetwork::connectionStatusToString(from) << INetwork::connectionStatusToString(to) << message; + CLogMessage(this).error("Connection status changed from %1 to %2") << INetwork::connectionStatusToString(from) << INetwork::connectionStatusToString(to); } else { - CLogMessage(this).info("Connection status changed from %1 to %2 %3") << INetwork::connectionStatusToString(from) << INetwork::connectionStatusToString(to) << message; + CLogMessage(this).info("Connection status changed from %1 to %2") << INetwork::connectionStatusToString(from) << INetwork::connectionStatusToString(to); } // send as own signal - emit this->connectionStatusChanged(from, to, message); + emit this->connectionStatusChanged(from, to); } /* diff --git a/src/blackcore/context_network_impl.h b/src/blackcore/context_network_impl.h index ae0a2abb9..1c07db864 100644 --- a/src/blackcore/context_network_impl.h +++ b/src/blackcore/context_network_impl.h @@ -196,7 +196,7 @@ namespace BlackCore * \param from old status * \param to new status */ - void ps_fsdConnectionStatusChanged(INetwork::ConnectionStatus from, INetwork::ConnectionStatus to, const QString &message); + void ps_fsdConnectionStatusChanged(INetwork::ConnectionStatus from, INetwork::ConnectionStatus to); //! Radio text messages received void ps_fsdTextMessageReceived(const BlackMisc::Network::CTextMessageList &messages); diff --git a/src/blackcore/context_network_proxy.cpp b/src/blackcore/context_network_proxy.cpp index 0e809a2ff..2acb7b85d 100644 --- a/src/blackcore/context_network_proxy.cpp +++ b/src/blackcore/context_network_proxy.cpp @@ -29,7 +29,7 @@ namespace BlackCore void CContextNetworkProxy::relaySignals(const QString &serviceName, QDBusConnection &connection) { bool s = connection.connect(serviceName, IContextNetwork::ObjectPath(), IContextNetwork::InterfaceName(), - "connectionStatusChanged", this, SIGNAL(connectionStatusChanged(uint, uint, const QString &))); + "connectionStatusChanged", this, SIGNAL(connectionStatusChanged(uint, uint))); Q_ASSERT(s); s = connection.connect(serviceName, IContextNetwork::ObjectPath(), IContextNetwork::InterfaceName(), "changedAtcStationsBooked", this, SIGNAL(changedAtcStationsBooked())); diff --git a/src/blackcore/network.h b/src/blackcore/network.h index 7084ea00d..6872d29de 100644 --- a/src/blackcore/network.h +++ b/src/blackcore/network.h @@ -144,18 +144,6 @@ namespace BlackCore */ virtual bool isPendingConnection() const = 0; - /*! - * Returns a list of URLs where network status data can be found. - * To obtain the status, one of these URLs should be picked at random. - */ - virtual QList getStatusUrls() const = 0; - - /*! - * Returns a list of known servers which may be connected to. - * Not all servers may be accepting connections; consult the CServer::isAcceptingConnections method. - */ - virtual BlackMisc::Network::CServerList getKnownServers() const = 0; - public slots: //////////////////////////////////////////////////////////////// //! \name Network slots @@ -478,7 +466,7 @@ namespace BlackCore /*! * The status of our connection has changed. */ - void connectionStatusChanged(ConnectionStatus oldStatus, ConnectionStatus newStatus, QString errorMessage = ""); + void connectionStatusChanged(ConnectionStatus oldStatus, ConnectionStatus newStatus); /*! * We received a reply to one of our pings. @@ -490,7 +478,7 @@ namespace BlackCore * We received a reply to one of our queries. * \sa sendCapabilitiesQuery */ - void capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 capabilitiesFlags); + void capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, int capabilitiesFlags); /*! * We received a reply to one of our queries. diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index b61120451..ac14d9ed0 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -7,7 +7,6 @@ #include "blackmisc/project.h" #include "blackmisc/logmessage.h" #include -#include #include static_assert(! std::is_abstract::value, "Must implement all pure virtuals"); @@ -30,7 +29,7 @@ namespace BlackCore CNetworkVatlib::CNetworkVatlib(QObject *parent) : INetwork(parent), m_loginMode(LoginNormal), - m_status(Cvatlib_Network::connStatus_Idle), + m_status(vatStatusIdle), m_fsdTextCodec(QTextCodec::codecForName("latin1")) { connect(this, &CNetworkVatlib::terminate, this, &INetwork::terminateConnection, Qt::QueuedConnection); @@ -39,6 +38,8 @@ namespace BlackCore Q_ASSERT_X(m_fsdTextCodec, "CNetworkVatlib", "Missing default wire text encoding"); //TODO reinit m_fsdTextCodec from WireTextEncoding config setting if present + Vat_SetNetworkErrorHandler(CNetworkVatlib::networkErrorHandler); + connect(&m_processingTimer, SIGNAL(timeout()), this, SLOT(process())); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(update())); m_processingTimer.start(c_processingIntervalMsec); @@ -48,156 +49,117 @@ namespace BlackCore { Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "attempted to reinitialize session while still connected"); - try + int clientCapabilities = vatCapsModelDesc | vatCapsInterminPos | vatCapsAtcInfo; + if (m_loginMode == LoginStealth) { - m_net.reset(Cvatlib_Network::Create()); - - QString capabilities; - capabilities += m_net->capability_AtcInfo; - capabilities += "=1:"; - capabilities += m_net->capability_InterimPos; - capabilities += "=1:"; - capabilities += m_net->capability_ModelDesc; - capabilities += "=1"; - if (m_loginMode == LoginStealth) - { - capabilities += ":"; - capabilities += m_net->capability_Stealth; - capabilities += "=1"; - } - - m_net->CreateNetworkSession(CProject::systemNameAndVersionChar(), CProject::versionMajor(), CProject::versionMinor(), - CProject::simulatorsChar(), CLIENT_PUBLIC_ID, CLIENT_PRIVATE_KEY, toFSD(capabilities)); - - m_net->InstallOnConnectionStatusChangedEvent(onConnectionStatusChanged, this); - m_net->InstallOnTextMessageReceivedEvent(onTextMessageReceived, this); - m_net->InstallOnRadioMessageReceivedEvent(onRadioMessageReceived, this); - m_net->InstallOnPilotDisconnectedEvent(onPilotDisconnected, this); - m_net->InstallOnControllerDisconnectedEvent(onControllerDisconnected, this); - m_net->InstallOnPilotPositionUpdateEvent(onPilotPositionUpdate, this); - m_net->InstallOnInterimPilotPositionUpdateEvent(onInterimPilotPositionUpdate, this); - m_net->InstallOnAtcPositionUpdateEvent(onAtcPositionUpdate, this); - m_net->InstallOnKickedEvent(onKicked, this); - m_net->InstallOnPongEvent(onPong, this); - m_net->InstallOnMetarReceivedEvent(onMetarReceived, this); - m_net->InstallOnInfoQueryRequestReceivedEvent(onInfoQueryRequestReceived, this); - m_net->InstallOnInfoQueryReplyReceivedEvent(onInfoQueryReplyReceived, this); - m_net->InstallOnCapabilitiesReplyReceivedEvent(onCapabilitiesReplyReceived, this); - m_net->InstallOnAtisReplyReceivedEvent(onAtisReplyReceived, this); - m_net->InstallOnFlightPlanReceivedEvent(onFlightPlanReceived, this); - m_net->InstallOnTemperatureDataReceivedEvent(onTemperatureDataReceived, this); - m_net->InstallOnErrorReceivedEvent(onErrorReceived, this); - m_net->InstallOnWindDataReceivedEvent(onWindDataReceived, this); - m_net->InstallOnCloudDataReceivedEvent(onCloudDataReceived, this); - m_net->InstallOnPilotInfoRequestReceivedEvent(onPilotInfoRequestReceived, this); - m_net->InstallOnPilotInfoReceivedEvent(onPilotInfoReceived, this); - m_net->InstallOnCustomPilotPacketReceivedEvent(onCustomPacketReceived, this); + clientCapabilities |= vatCapsStealth; } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + + m_net.reset(Vat_CreateNetworkSession(vatServerLegacyFsd, CProject::systemNameAndVersionChar(), + CProject::versionMajor(), CProject::versionMinor(), + CProject::simulatorsChar(), CLIENT_PUBLIC_ID, CLIENT_PRIVATE_KEY, + clientCapabilities)); + + Vat_SetStateChangeHandler(m_net.data(), onConnectionStatusChanged, this); + Vat_SetMessageHandler(m_net.data(), onTextMessageReceived, this); + Vat_SetRadioHandler(m_net.data(), onRadioMessageReceived, this); + Vat_SetDeletePilotHandler(m_net.data(), onPilotDisconnected, this); + Vat_SetDeleteAtcHandler(m_net.data(), onControllerDisconnected, this); + Vat_SetPilotPositionHandler(m_net.data(), onPilotPositionUpdate, this); + Vat_SetInterimPilotPositionHandler(m_net.data(), onInterimPilotPositionUpdate, this); + Vat_SetAtcPositionHandler(m_net.data(), onAtcPositionUpdate, this); + Vat_SetKillHandler(m_net.data(), onKicked, this); + Vat_SetPongHandler(m_net.data(), onPong, this); + Vat_SetACARSDataHandler(m_net.data(), onMetarReceived, this); + Vat_SetInfoRequestHandler(m_net.data(), onInfoQueryRequestReceived, this); + Vat_SetInfoReplyHandler(m_net.data(), onInfoQueryReplyReceived, this); + Vat_SetInfoCAPSReplyHandler(m_net.data(), onCapabilitiesReplyReceived, this); + Vat_SetControllerAtisHandler(m_net.data(), onAtisReplyReceived, this); + Vat_SetFlightPlanHandler(m_net.data(), onFlightPlanReceived, this); + Vat_SetServerErrorHandler(m_net.data(), onErrorReceived, this); + Vat_SetTemperatureDataHandler(m_net.data(), onTemperatureDataReceived, this); + Vat_SetWindDataHandler(m_net.data(), onWindDataReceived, this); + Vat_SetCloudDataHandler(m_net.data(), onCloudDataReceived, this); + Vat_SetAircraftInfoRequestHandler(m_net.data(), onPilotInfoRequestReceived, this); + Vat_SetAircraftInfoHandler(m_net.data(), onPilotInfoReceived, this); + Vat_SetCustomPilotPacketHandler(m_net.data(), onCustomPacketReceived, this); } CNetworkVatlib::~CNetworkVatlib() { - if (!m_net) { return; } - - try - { - if (m_net->IsValid() && m_net->IsNetworkConnected()) - { - m_net->LogoffAndDisconnect(0); // emits a connectionStatusChanged signal - } - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } - try - { - m_net->DestroyNetworkSession(); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "CNetworkVatlib destoyed while still connected."); } void CNetworkVatlib::process() { if (!m_net) { return; } - - try - { - if (m_net->IsValid() && m_net->IsSessionExists()) - { - m_net->DoProcessing(); - } - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_ExecuteNetworkTasks(m_net.data()); } void CNetworkVatlib::update() { if (!m_net) { return; } - try + if (isConnected()) { - if (m_net->IsValid() && m_net->IsSessionExists() && isConnected()) + if (this->m_loginMode == LoginAsObserver) { - if (this->m_loginMode == LoginAsObserver) + // Observer + VatAtcPosition pos; + pos.facility = vatFacilityTypeUnknown; + pos.visibleRange = 10; // NM + pos.latitude = m_ownAircraft.latitude().value(CAngleUnit::deg()); + pos.longitude = m_ownAircraft.longitude().value(CAngleUnit::deg()); + pos.elevation = 0; + Vat_SendATCUpdate(m_net.data(), &pos); + } + else + { + // Normal / Stealth mode + VatPilotPosition pos; + pos.altitudeAdjust = 0; // TODO: this needs to be calculated + pos.altitudeTrue = m_ownAircraft.getAltitude().value(CLengthUnit::ft()); + pos.heading = m_ownAircraft.getHeading().value(CAngleUnit::deg()); + pos.pitch = m_ownAircraft.getPitch().value(CAngleUnit::deg()); + pos.bank = m_ownAircraft.getBank().value(CAngleUnit::deg()); + pos.latitude = m_ownAircraft.latitude().value(CAngleUnit::deg()); + pos.longitude = m_ownAircraft.longitude().value(CAngleUnit::deg()); + pos.groundSpeed = m_ownAircraft.getGroundSpeed().value(CSpeedUnit::kts()); + pos.rating = vatPilotRatingUnknown; + pos.transponderCode = static_cast(m_ownAircraft.getTransponderCode()); + pos.transponderMode = vatTransponderModeStandby; + switch (m_ownAircraft.getTransponderMode()) { - // Observer - Cvatlib_Network::ATCPosUpdate pos; - pos.facility = Cvatlib_Network::facilityType_Unknown; - pos.visibleRange = 10; // NM - pos.lat = m_ownAircraft.latitude().value(CAngleUnit::deg()); - pos.lon = m_ownAircraft.longitude().value(CAngleUnit::deg()); - pos.elevation = 0; - m_net->SendATCUpdate(pos); - } - else - { - // Normal / Stealth mode - Cvatlib_Network::PilotPosUpdate pos; - pos.altAdj = 0; // TODO: this needs to be calculated - pos.altTrue = m_ownAircraft.getAltitude().value(CLengthUnit::ft()); - pos.heading = m_ownAircraft.getHeading().value(CAngleUnit::deg()); - pos.pitch = m_ownAircraft.getPitch().value(CAngleUnit::deg()); - pos.bank = m_ownAircraft.getBank().value(CAngleUnit::deg()); - pos.lat = m_ownAircraft.latitude().value(CAngleUnit::deg()); - pos.lon = m_ownAircraft.longitude().value(CAngleUnit::deg()); - pos.groundSpeed = m_ownAircraft.getGroundSpeed().value(CSpeedUnit::kts()); - pos.rating = Cvatlib_Network::pilotRating_Unknown; - pos.xpdrCode = static_cast(m_ownAircraft.getTransponderCode()); - pos.xpdrMode = Cvatlib_Network::xpndrMode_Standby; - switch (m_ownAircraft.getTransponderMode()) - { - case CTransponder::ModeC: pos.xpdrMode = Cvatlib_Network::xpndrMode_Normal; break; - case CTransponder::StateIdent: pos.xpdrMode = Cvatlib_Network::xpndrMode_Ident; break; - default: pos.xpdrMode = Cvatlib_Network::xpndrMode_Standby; break; - } - m_net->SendPilotUpdate(pos); + case CTransponder::ModeC: pos.transponderMode = vatTransponderModeCharlie; break; + case CTransponder::StateIdent: pos.transponderMode = vatTransponderModeIdent; break; + default: pos.transponderMode = vatTransponderModeStandby; break; } + Vat_SendPilotUpdate(m_net.data(), &pos); } } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - INetwork::ConnectionStatus convertConnectionStatus(Cvatlib_Network::connStatus status) + INetwork::ConnectionStatus convertConnectionStatus(VatConnectionStatus status) { switch (status) { - case Cvatlib_Network::connStatus_Idle: return INetwork::Disconnected; - case Cvatlib_Network::connStatus_Connecting: return INetwork::Connecting; - case Cvatlib_Network::connStatus_Connected: return INetwork::Connected; - case Cvatlib_Network::connStatus_Disconnected: return INetwork::Disconnected; - case Cvatlib_Network::connStatus_Error: return INetwork::DisconnectedError; - case Cvatlib_Network::connStatus_ConnectionFailed: return INetwork::DisconnectedFailed; - case Cvatlib_Network::connStatus_ConnectionLost: return INetwork::DisconnectedLost; + case vatStatusIdle: return INetwork::Disconnected; + case vatStatusConnecting: return INetwork::Connecting; + case vatStatusConnected: return INetwork::Connected; + case vatStatusDisconnected: return INetwork::Disconnected; + case vatStatusDisconnecting: return INetwork::Disconnecting; + case vatStatusError: return INetwork::DisconnectedError; } qFatal("unrecognised connection status"); return INetwork::DisconnectedError; } - void CNetworkVatlib::changeConnectionStatus(Cvatlib_Network::connStatus status, QString errorMessage) + void CNetworkVatlib::changeConnectionStatus(VatConnectionStatus status) { if (m_status != status) { qSwap(m_status, status); - emit connectionStatusChanged(convertConnectionStatus(status), convertConnectionStatus(m_status), errorMessage); + emit connectionStatusChanged(convertConnectionStatus(status), convertConnectionStatus(m_status)); if (isDisconnected()) { @@ -206,42 +168,6 @@ namespace BlackCore } } - QString CNetworkVatlib::getSocketError() const - { - static QMap errorCodes; - if (errorCodes.isEmpty()) - { - errorCodes["ECONNABORTED"] = "Connection aborted"; - errorCodes["ECONNREFUSED"] = "Connection refused"; - errorCodes["ECONNRESET"] = "Connection reset"; - errorCodes["EHOSTDOWN"] = "Host is down"; - errorCodes["EHOSTUNREACH"] = "Host is unreachable"; - errorCodes["ENETDOWN"] = "Network is down"; - errorCodes["ENETRESET"] = "Connection aborted by network"; - errorCodes["ENETUNREACH"] = "Network unreachable"; - errorCodes["ENOTCONN"] = "The socket is not connected"; - errorCodes["ETIMEDOUT"] = "Connection timed out"; - } - - QString err(m_net->GetNetworkErrorCode()); - if (errorCodes.contains(err)) - { - return errorCodes[err]; - } - else if (err.startsWith("EUNKWN")) - { - return "Unknown error code " + err.section(' ', 1); - } - else if (err == "EOK" || err.isEmpty()) - { - return ""; - } - else - { - return "Unrecognized error code " + err; - } - } - QByteArray CNetworkVatlib::toFSD(QString qstr) const { return m_fsdTextCodec->fromUnicode(qstr); @@ -293,86 +219,6 @@ namespace BlackCore return qstrList; } - void exceptionDispatcher(const char *caller) - { - try - { - throw; - } - catch (const NetworkNotConnectedException &e) - { - // this could be caused by a race condition during normal operation, so not an error - qDebug() << "NetworkNotConnectedException caught in " << caller << "\n" << e.what(); - } - catch (const VatlibException &e) - { - qFatal("VatlibException caught in %s\n%s", caller, e.what()); - } - catch (const std::exception &e) - { - qFatal("std::exception caught in %s\n%s", caller, e.what()); - } - catch (...) - { - qFatal("Unknown exception caught in %s", caller); - } - } - - QList CNetworkVatlib::getStatusUrls() const - { - QList result; - try - { - Cvatlib_Network *net = m_net.data(); - decltype(m_net) netPtr; - if (!net) - { - netPtr.reset(Cvatlib_Network::Create()); - net = netPtr.data(); - } - - auto urlsPtr = QSharedPointer(net->GetVatsimStatusUrls(), [ = ](const char *const * p) { net->GetVatsimStatusUrls_Free(p); }); - auto urls = urlsPtr.data(); - while (*urls) - { - result.push_back(QUrl(*urls++)); - } - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } - return result; - } - - BlackMisc::Network::CServerList CNetworkVatlib::getKnownServers() const - { - BlackMisc::Network::CServerList result; - try - { - Cvatlib_Network *net = m_net.data(); - decltype(m_net) netPtr; - if (!net) - { - netPtr.reset(Cvatlib_Network::Create()); - net = netPtr.data(); - } - - auto namesPtr = QSharedPointer(net->GetVatsimFSDServerNames(), [ = ](const char *const * p) { net->GetVatsimFSDServerNames_Free(p); }); - auto ipsPtr = QSharedPointer(net->GetVatsimFSDServerIps(), [ = ](const char *const * p) { net->GetVatsimFSDServerIps_Free(p); }); - auto locationsPtr = QSharedPointer(net->GetVatsimFSDServerLocations(), [ = ](const char *const * p) { net->GetVatsimFSDServerLocations_Free(p); }); - auto acceptsPtr = QSharedPointer(net->GetVatsimFSDServerAcceptingConnections(), [ = ](const bool * p) { net->GetVatsimFSDServerAcceptingConnections_Free(p); }); - auto names = namesPtr.data(); - auto ips = ipsPtr.data(); - auto locations = locationsPtr.data(); - auto accepts = acceptsPtr.data(); - int port = 6809; // TODO hard-coded number? - while (*names) - { - result.push_back(BlackMisc::Network::CServer(*names++, *locations++, *ips++, port, BlackMisc::Network::CUser(), *accepts++)); - } - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } - return result; - } - /********************************** * * * * * * * * * * * * * * * * * * * ************************************/ /********************************** INetwork slots ************************************/ /********************************** * * * * * * * * * * * * * * * * * * * ************************************/ @@ -407,79 +253,58 @@ namespace BlackCore { Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't connect while still connected"); - try + if (!m_net) { - if (!m_net) - { - initializeSession(); - } - - changeConnectionStatus(Cvatlib_Network::connStatus_Connecting); // paranoia - - QByteArray callsign = toFSD(m_loginMode == LoginAsObserver ? - m_callsign.getAsObserverCallsignString() : - m_callsign.asString()); - QByteArray name = toFSD(m_server.getUser().getRealName()); - - if (this->m_loginMode == LoginAsObserver) - { - // Observer mode - Cvatlib_Network::ATCConnectionInfo info; - info.name = name.data(); - info.rating = Cvatlib_Network::atcRating_Obs; - info.callsign = callsign.data(); - m_net->SetATCLoginInfo(toFSD(m_server.getAddress()), m_server.getPort(), - toFSD(m_server.getUser().getId()), - toFSD(m_server.getUser().getPassword()), - info); - } - else - { - // normal scenario, also used in STEALTH - Cvatlib_Network::PilotConnectionInfo info; - info.callsign = callsign.data(); - info.name = name.data(); - info.rating = Cvatlib_Network::pilotRating_Student; //TODO - info.sim = Cvatlib_Network::simType_MSFS98; //TODO - m_net->SetPilotLoginInfo(toFSD(m_server.getAddress()), m_server.getPort(), - toFSD(m_server.getUser().getId()), - toFSD(m_server.getUser().getPassword()), - info); - } - - if (m_net->ConnectAndLogon()) - { - if (! m_updateTimer.isActive()) - { - m_updateTimer.start(c_updateIntervalMsec); - } - } - else - { - changeConnectionStatus(Cvatlib_Network::connStatus_Error/*, getSocketError()*/); - } + initializeSession(); } - catch (...) + + QByteArray callsign = toFSD(m_loginMode == LoginAsObserver ? + m_callsign.getAsObserverCallsignString() : + m_callsign.asString()); + QByteArray name = toFSD(m_server.getUser().getRealName()); + + if (this->m_loginMode == LoginAsObserver) { - changeConnectionStatus(Cvatlib_Network::connStatus_Error/*, getSocketError()*/); - exceptionDispatcher(Q_FUNC_INFO); + // Observer mode + VatAtcConnection info; + info.name = name.data(); + info.rating = vatAtcRatingObserver; + info.callsign = callsign.data(); + Vat_SpecifyATCLogon(m_net.data(), toFSD(m_server.getAddress()), m_server.getPort(), + toFSD(m_server.getUser().getId()), + toFSD(m_server.getUser().getPassword()), + &info); + } + else + { + // normal scenario, also used in STEALTH + VatPilotConnection info; + info.callsign = callsign.data(); + info.name = name.data(); + info.rating = vatPilotRatingStudent; //TODO + info.simType = vatSimTypeMSFS98; //TODO + Vat_SpecifyPilotLogon(m_net.data(), toFSD(m_server.getAddress()), m_server.getPort(), + toFSD(m_server.getUser().getId()), + toFSD(m_server.getUser().getPassword()), + &info); + } + + Vat_Logon(m_net.data()); + + if (! m_updateTimer.isActive()) + { + m_updateTimer.start(c_updateIntervalMsec); } } void CNetworkVatlib::terminateConnection() { - try - { - m_updateTimer.stop(); + m_updateTimer.stop(); - if (m_net && m_net->IsValid() && m_net->IsNetworkConnected()) - { - // emit signal directly because there is no Cvatlib_Network enum for Disconnecting - emit this->connectionStatusChanged(convertConnectionStatus(m_status), Disconnecting); - m_net->LogoffAndDisconnect(c_logoffTimeoutSec); - } + if (m_net && isConnected()) + { + Vat_Logoff(m_net.data()); } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } void CNetworkVatlib::setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft) @@ -511,274 +336,170 @@ namespace BlackCore Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); if (messages.isEmpty()) return; - try + CTextMessageList privateMessages = messages.getPrivateMessages(); + for(const auto &message : privateMessages) { - CTextMessageList privateMessages = messages.getPrivateMessages(); - foreach(BlackMisc::Network::CTextMessage message, privateMessages) - { - if (message.getRecipientCallsign().isEmpty()) continue; - m_net->SendPrivateTextMessage(toFSD(message.getRecipientCallsign()), toFSD(message.getMessage())); - } - CTextMessageList radioMessages = messages.getRadioMessages(); - if (radioMessages.isEmpty()) return; - foreach(BlackMisc::Network::CTextMessage message, radioMessages) - { - // I could send the same message to n frequencies in one step - // if this is really required, I need to group by message - // currently I send individual messages - QVector freqsVec; - freqsVec.push_back(message.getFrequency().valueRounded(CFrequencyUnit::kHz(), 0)); - m_net->SendRadioTextMessage(freqsVec.size(), freqsVec.data(), toFSD(message.getMessage())); - } + if (message.getRecipientCallsign().isEmpty()) continue; + Vat_SendTextMessage(m_net.data(), toFSD(message.getRecipientCallsign()), toFSD(message.getMessage())); + } + CTextMessageList radioMessages = messages.getRadioMessages(); + if (radioMessages.isEmpty()) return; + for(const auto &message : radioMessages) + { + // I could send the same message to n frequencies in one step + // if this is really required, I need to group by message + // currently I send individual messages + QVector freqsVec; + freqsVec.push_back(message.getFrequency().valueRounded(CFrequencyUnit::kHz(), 0)); + Vat_SendRadioMessage(m_net.data(), freqsVec.data(), freqsVec.size(), toFSD(message.getMessage())); } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } void CNetworkVatlib::sendCustomPacket(const BlackMisc::Aviation::CCallsign &callsign, const QString &packetId, const QStringList &data) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->SendCustomPilotPacket(toFSD(callsign), toFSD(packetId), toFSD(data)(), data.size()); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_SendCustomPilotPacket(m_net.data(), toFSD(callsign), toFSD(packetId), toFSD(data)(), data.size()); } void CNetworkVatlib::sendIpQuery() { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->SendInfoQuery(Cvatlib_Network::infoQuery_IP, "SERVER"); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestInformation(m_net.data(), vatInfoQueryTypeIP, nullptr); } void CNetworkVatlib::sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->SendInfoQuery(Cvatlib_Network::infoQuery_Freq, toFSD(callsign)); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestInformation(m_net.data(), vatInfoQueryTypeFreq, toFSD(callsign)); } void CNetworkVatlib::sendUserInfoQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->SendInfoQuery(Cvatlib_Network::infoQuery_UserInfo, toFSD(callsign)); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestInformation(m_net.data(), vatInfoQueryTypeInfo, toFSD(callsign)); } void CNetworkVatlib::sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->SendInfoQuery(Cvatlib_Network::infoQuery_Server, toFSD(callsign)); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestInformation(m_net.data(), vatInfoQueryTypeServer, toFSD(callsign)); } void CNetworkVatlib::sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->SendInfoQuery(Cvatlib_Network::infoQuery_ATC, toFSD(callsign)); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestInformation(m_net.data(), vatInfoQueryTypeAtc, toFSD(callsign)); } void CNetworkVatlib::sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->SendInfoQuery(Cvatlib_Network::infoQuery_ATIS, toFSD(callsign)); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestInformation(m_net.data(), vatInfoQueryTypeAtis, toFSD(callsign)); } void CNetworkVatlib::sendFlightPlan(const CFlightPlan &flightPlan) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - try + VatFlightPlan vatlibFP; + QString route = QString(flightPlan.getRoute()).replace(" ", "."); + QString remarks = QString(flightPlan.getRemarks()).replace(":", ";").trimmed(); + QString alt = flightPlan.getCruiseAltitude().isFlightLevel() ? + flightPlan.getCruiseAltitude().toQString() : + flightPlan.getCruiseAltitude().valueRoundedWithUnit(0); + alt = alt.remove('.').remove(','); // remove any separators + + QByteArray acTypeTemp, altAptTemp, cruiseAltTemp, depAptTemp, destAptTemp, routeTemp, remarksTemp; + vatlibFP.aircraftType = acTypeTemp = toFSD(flightPlan.getEquipmentIcao()); + vatlibFP.alternateAirport = altAptTemp = toFSD(flightPlan.getAlternateAirportIcao().asString()); + vatlibFP.cruiseAltitude = cruiseAltTemp = toFSD(alt); + vatlibFP.departAirport = depAptTemp = toFSD(flightPlan.getOriginAirportIcao().asString()); + vatlibFP.departTimeActual = flightPlan.getTakeoffTimeActual().toUTC().toString("hhmm").toInt(); + vatlibFP.departTime = flightPlan.getTakeoffTimePlanned().toUTC().toString("hhmm").toInt(); + vatlibFP.destAirport = destAptTemp = toFSD(flightPlan.getDestinationAirportIcao().asString()); + + QList timeParts = flightPlan.getEnrouteTime().getHrsMinSecParts(); + vatlibFP.enrouteHrs = timeParts[CTime::Hours]; + vatlibFP.enrouteMins = timeParts[CTime::Minutes]; + + timeParts = flightPlan.getFuelTime().getHrsMinSecParts(); + vatlibFP.fuelHrs = timeParts[CTime::Hours]; + vatlibFP.fuelMins = timeParts[CTime::Minutes]; + vatlibFP.remarks = remarksTemp = toFSD(remarks); + vatlibFP.route = routeTemp = toFSD(route); + vatlibFP.trueCruisingSpeed = flightPlan.getCruiseTrueAirspeed().valueRounded(CSpeedUnit::kts()); + switch (flightPlan.getFlightRules()) { - Cvatlib_Network::FlightPlan vatlibFP; - QString route = QString(flightPlan.getRoute()).replace(" ", "."); - QString remarks = QString(flightPlan.getRemarks()).replace(":", ";").trimmed(); - QString alt = flightPlan.getCruiseAltitude().isFlightLevel() ? - flightPlan.getCruiseAltitude().toQString() : - flightPlan.getCruiseAltitude().valueRoundedWithUnit(0); - alt = alt.remove('.').remove(','); // remove any separators - - QByteArray acTypeTemp, altAptTemp, cruiseAltTemp, depAptTemp, destAptTemp, routeTemp, remarksTemp; - vatlibFP.acType = acTypeTemp = toFSD(flightPlan.getEquipmentIcao()); - vatlibFP.altApt = altAptTemp = toFSD(flightPlan.getAlternateAirportIcao().asString()); - vatlibFP.cruiseAlt = cruiseAltTemp = toFSD(alt); - vatlibFP.depApt = depAptTemp = toFSD(flightPlan.getOriginAirportIcao().asString()); - vatlibFP.depTimeActual = flightPlan.getTakeoffTimeActual().toUTC().toString("hhmm").toInt(); - vatlibFP.depTimePlanned = flightPlan.getTakeoffTimePlanned().toUTC().toString("hhmm").toInt(); - vatlibFP.destApt = destAptTemp = toFSD(flightPlan.getDestinationAirportIcao().asString()); - - QList timeParts = flightPlan.getEnrouteTime().getHrsMinSecParts(); - vatlibFP.enrouteHrs = timeParts[CTime::Hours]; - vatlibFP.enrouteMins = timeParts[CTime::Minutes]; - - timeParts = flightPlan.getFuelTime().getHrsMinSecParts(); - vatlibFP.fuelHrs = timeParts[CTime::Hours]; - vatlibFP.fuelMins = timeParts[CTime::Minutes]; - vatlibFP.remarks = remarksTemp = toFSD(remarks); - vatlibFP.route = routeTemp = toFSD(route); - vatlibFP.trueCruiseSpeed = flightPlan.getCruiseTrueAirspeed().valueRounded(CSpeedUnit::kts()); - switch (flightPlan.getFlightRules()) - { - default: - case CFlightPlan::IFR: vatlibFP.fpRules = Cvatlib_Network::fpRuleType_IFR; break; - case CFlightPlan::VFR: vatlibFP.fpRules = Cvatlib_Network::fpRuleType_VFR; break; - case CFlightPlan::SVFR: vatlibFP.fpRules = Cvatlib_Network::fpRuleType_SVFR; break; - } - m_net->SendFlightPlan(vatlibFP); + default: + case CFlightPlan::IFR: vatlibFP.flightType = vatFlightTypeIFR; break; + case CFlightPlan::VFR: vatlibFP.flightType = vatFlightTypeVFR; break; + case CFlightPlan::SVFR: vatlibFP.flightType = vatFlightTypeSVFR; break; + case CFlightPlan::DVFR: vatlibFP.flightType = vatFlightTypeDVFR; break; } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_SendFlightPlan(m_net.data(), &vatlibFP); } void CNetworkVatlib::sendFlightPlanQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->SendInfoQuery(Cvatlib_Network::infoQuery_FP, toFSD(callsign)); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestInformation(m_net.data(), vatInfoQueryTypeFP, toFSD(callsign)); } void CNetworkVatlib::sendRealNameQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->SendInfoQuery(Cvatlib_Network::infoQuery_Name, toFSD(callsign)); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestInformation(m_net.data(), vatInfoQueryTypeName, toFSD(callsign)); } void CNetworkVatlib::sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->SendInfoQuery(Cvatlib_Network::infoQuery_Capabilities, toFSD(callsign)); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestInformation(m_net.data(), vatInfoQueryTypeCaps, toFSD(callsign)); } void CNetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) // private { - try - { - m_net->ReplyToInfoQuery(Cvatlib_Network::infoQuery_Freq, toFSD(callsign), - toFSD(QString::number(m_ownAircraft.getCom1System().getFrequencyActive().value(CFrequencyUnit::MHz()), 'f', 3))); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_SendInformation(m_net.data(), vatInfoQueryTypeFreq, toFSD(callsign), + toFSD(QString::number(m_ownAircraft.getCom1System().getFrequencyActive().value(CFrequencyUnit::MHz()), 'f', 3))); } void CNetworkVatlib::replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign) // private { - try - { - m_net->ReplyToInfoQuery(Cvatlib_Network::infoQuery_Name, toFSD(callsign), toFSD(m_server.getUser().getRealName())); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_SendInformation(m_net.data(), vatInfoQueryTypeName, toFSD(callsign),toFSD(m_server.getUser().getRealName())); } void CNetworkVatlib::sendIcaoCodesQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->RequestPlaneInfo(toFSD(callsign)); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestAircraftInfo(m_net.data(), toFSD(callsign)); } void CNetworkVatlib::sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) // private { - try - { - const QByteArray acTypeICAObytes = toFSD(m_icaoCode.getAircraftDesignator()); - const QByteArray airlineICAObytes = toFSD(m_icaoCode.getAirlineDesignator()); - const QByteArray liverybytes = toFSD(m_icaoCode.getLivery()); - std::vector keysValues; - if (!m_icaoCode.getAircraftDesignator().isEmpty()) - { - keysValues.push_back(m_net->acinfo_Equipment); - keysValues.push_back(acTypeICAObytes); - } - if (m_icaoCode.hasAirlineDesignator()) - { - keysValues.push_back(m_net->acinfo_Airline); - keysValues.push_back(airlineICAObytes); - } - if (m_icaoCode.hasLivery()) - { - keysValues.push_back(m_net->acinfo_Livery); - keysValues.push_back(liverybytes); - } - keysValues.push_back(nullptr); - m_net->SendPlaneInfo(toFSD(callsign), keysValues.data()); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + const QByteArray acTypeICAObytes = toFSD(m_icaoCode.getAircraftDesignator()); + const QByteArray airlineICAObytes = toFSD(m_icaoCode.getAirlineDesignator()); + const QByteArray liverybytes = toFSD(m_icaoCode.getLivery()); + + VatAircraftInfo aircraftInfo {acTypeICAObytes, airlineICAObytes, liverybytes}; + Vat_SendModernPlaneInfo(m_net.data(), toFSD(callsign), &aircraftInfo); } void CNetworkVatlib::sendPing(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->PingUser(toFSD(callsign)); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_SendPing(m_net.data(), toFSD(callsign)); } void CNetworkVatlib::sendMetarQuery(const BlackMisc::Aviation::CAirportIcao &airportIcao) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->RequestMetar(toFSD(airportIcao.asString())); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestACARS(m_net.data(), toFSD(airportIcao.asString())); } void CNetworkVatlib::sendWeatherDataQuery(const BlackMisc::Aviation::CAirportIcao &airportIcao) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - - try - { - m_net->RequestWeatherData(toFSD(airportIcao.asString())); - } - catch (...) { exceptionDispatcher(Q_FUNC_INFO); } + Vat_RequestWeather(m_net.data(), toFSD(airportIcao.asString())); } void CNetworkVatlib::sendFsipiCustomPacket(const BlackMisc::Aviation::CCallsign &callsign, @@ -804,13 +525,11 @@ namespace BlackCore return static_cast(cbvar); } - void CNetworkVatlib::onConnectionStatusChanged(Cvatlib_Network *, Cvatlib_Network::connStatus, Cvatlib_Network::connStatus newStatus, void *cbvar) + void CNetworkVatlib::onConnectionStatusChanged(VatSessionID, VatConnectionStatus, VatConnectionStatus newStatus, void *cbvar) { - if (newStatus == Cvatlib_Network::connStatus_Error || - newStatus == Cvatlib_Network::connStatus_ConnectionFailed || - newStatus == Cvatlib_Network::connStatus_ConnectionLost) + if (newStatus == vatStatusError) { - cbvar_cast(cbvar)->changeConnectionStatus(newStatus, cbvar_cast(cbvar)->getSocketError()); + cbvar_cast(cbvar)->changeConnectionStatus(newStatus); } else { @@ -818,14 +537,15 @@ namespace BlackCore } } - void CNetworkVatlib::onTextMessageReceived(Cvatlib_Network *, const char *from, const char *to, const char *msg, void *cbvar) + void CNetworkVatlib::onTextMessageReceived(VatSessionID, const char *from, const char *to, const char *msg, void *cbvar) { BlackMisc::Network::CTextMessageList messages(cbvar_cast(cbvar)->fromFSD(msg), CCallsign(cbvar_cast(cbvar)->fromFSD(from)), CCallsign(cbvar_cast(cbvar)->fromFSD(to))); emit cbvar_cast(cbvar)->textMessagesReceived(messages); } - void CNetworkVatlib::onRadioMessageReceived(Cvatlib_Network *, const char *from, INT numFreq, INT *freqList, const char *msg, void *cbvar) + void CNetworkVatlib::onRadioMessageReceived(VatSessionID, const char *from, int numFreq, int *freqList, const char *msg, void *cbvar) { + // FIXME: This method forwards radio message for EVERY frequency. We should only forward those to which our COM's are listening to. QList frequencies; for (int i = 0; i < numFreq; ++i) { @@ -835,86 +555,86 @@ namespace BlackCore emit cbvar_cast(cbvar)->textMessagesReceived(messages); } - void CNetworkVatlib::onPilotDisconnected(Cvatlib_Network *, const char *callsign, void *cbvar) + void CNetworkVatlib::onPilotDisconnected(VatSessionID, const char *callsign, void *cbvar) { emit cbvar_cast(cbvar)->pilotDisconnected(cbvar_cast(cbvar)->fromFSD(callsign)); } - void CNetworkVatlib::onControllerDisconnected(Cvatlib_Network *, const char *callsign, void *cbvar) + void CNetworkVatlib::onControllerDisconnected(VatSessionID, const char *callsign, void *cbvar) { emit cbvar_cast(cbvar)->atcDisconnected(cbvar_cast(cbvar)->fromFSD(callsign)); } - void CNetworkVatlib::onPilotPositionUpdate(Cvatlib_Network *, const char *callsignChar , Cvatlib_Network::PilotPosUpdate pos, void *cbvar) + void CNetworkVatlib::onPilotPositionUpdate(VatSessionID, const char *callsignChar , const VatPilotPosition *position, void *cbvar) { const CCallsign callsign(callsignChar); const CAircraftSituation situation( - CCoordinateGeodetic(pos.lat, pos.lon, 0.0), - CAltitude(pos.altTrue, CAltitude::AboveGround, CLengthUnit::ft()), - CHeading(pos.heading, CHeading::True, CAngleUnit::deg()), - CAngle(pos.pitch, CAngleUnit::deg()), - CAngle(pos.bank, CAngleUnit::deg()), - CSpeed(pos.groundSpeed, CSpeedUnit::kts()) + CCoordinateGeodetic(position->latitude, position->longitude, 0.0), + CAltitude(position->altitudeTrue, CAltitude::AboveGround, CLengthUnit::ft()), + CHeading(position->heading, CHeading::True, CAngleUnit::deg()), + CAngle(position->pitch, CAngleUnit::deg()), + CAngle(position->bank, CAngleUnit::deg()), + CSpeed(position->groundSpeed, CSpeedUnit::kts()) ); QString tn("transponder "); tn.append(callsign.asString()); CTransponder::TransponderMode mode = CTransponder::StateStandby; - switch (pos.xpdrMode) + switch (position->transponderMode) { - case Cvatlib_Network::xpndrMode_Normal: + case vatTransponderModeCharlie: mode = CTransponder::ModeC; break; - case Cvatlib_Network::xpndrMode_Standby: + case vatTransponderModeStandby: mode = CTransponder::StateStandby; break; - case Cvatlib_Network::xpndrMode_Ident: + case vatTransponderModeIdent: mode = CTransponder::StateIdent; break; default: - mode = CTransponder::ModeC; + mode = CTransponder::StateStandby; break; } // I did have a situation where I got wrong transponger codes (KB) // So I now check for a valid code in order to detect such codes CTransponder transponder(tn, 0, mode); - if (CTransponder::isValidTransponderCode(pos.xpdrCode)) + if (CTransponder::isValidTransponderCode(position->transponderCode)) { - transponder = CTransponder(tn, pos.xpdrCode, mode); + transponder = CTransponder(tn, position->transponderCode, mode); } else { // TODO: how do with log this - qDebug() << "Wrong transponder code" << pos.xpdrMode << callsign; + qDebug() << "Wrong transponder code" << position->transponderMode << callsign; } emit cbvar_cast(cbvar)->aircraftPositionUpdate(callsign, situation, transponder); } - void CNetworkVatlib::onInterimPilotPositionUpdate(Cvatlib_Network *, const char * /** callsign **/, Cvatlib_Network::PilotPosUpdate /** pos **/, void * /** cbvar **/) + void CNetworkVatlib::onInterimPilotPositionUpdate(VatSessionID, const char * /** callsign **/, const VatPilotPosition * /** position **/, void * /** cbvar **/) { //TODO } - void CNetworkVatlib::onAtcPositionUpdate(Cvatlib_Network *, const char *callsign, Cvatlib_Network::ATCPosUpdate pos, void *cbvar) + void CNetworkVatlib::onAtcPositionUpdate(VatSessionID, const char *callsign, const VatAtcPosition *pos, void *cbvar) { - CFrequency freq(pos.frequency, CFrequencyUnit::kHz()); + CFrequency freq(pos->frequency, CFrequencyUnit::kHz()); freq.switchUnit(CFrequencyUnit::MHz()); // we would not need to bother, but this makes it easier to identify emit cbvar_cast(cbvar)->atcPositionUpdate(cbvar_cast(cbvar)->fromFSD(callsign), freq, - CCoordinateGeodetic(pos.lat, pos.lon, 0), CLength(pos.visibleRange, CLengthUnit::NM())); + CCoordinateGeodetic(pos->latitude, pos->longitude, 0), CLength(pos->visibleRange, CLengthUnit::NM())); } - void CNetworkVatlib::onKicked(Cvatlib_Network *, const char *reason, void *cbvar) + void CNetworkVatlib::onKicked(VatSessionID, const char *reason, void *cbvar) { emit cbvar_cast(cbvar)->kicked(cbvar_cast(cbvar)->fromFSD(reason)); } - void CNetworkVatlib::onPong(Cvatlib_Network *, const char *callsign, INT elapsedTime, void *cbvar) + void CNetworkVatlib::onPong(VatSessionID, const char *sender, double elapsedTime, void *cbvar) { - emit cbvar_cast(cbvar)->pongReceived(cbvar_cast(cbvar)->fromFSD(callsign), CTime(elapsedTime, CTimeUnit::s())); + emit cbvar_cast(cbvar)->pongReceived(cbvar_cast(cbvar)->fromFSD(sender), CTime(elapsedTime, CTimeUnit::ms())); } - void CNetworkVatlib::onCustomPacketReceived(Cvatlib_Network *, const char *callsign, const char *packetId, const char **data, INT dataSize, void *cbvar) + void CNetworkVatlib::onCustomPacketReceived(VatSessionID, const char *callsign, const char *packetId, const char **data, int dataSize, void *cbvar) { emit cbvar_cast(cbvar)->customPacketReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(packetId), cbvar_cast(cbvar)->fromFSD(data, dataSize)); } @@ -925,7 +645,7 @@ namespace BlackCore { if (data.size() < 9) { - qDebug() << "Malformed FSIPI packet"; + CLogMessage(this).warning("Malformed FSIPI packet"); } else { @@ -936,7 +656,7 @@ namespace BlackCore { if (data.size() < 9) { - qDebug() << "Malformed FSIPIR packet"; + CLogMessage(this).warning("Malformed FSIPIR packet"); } else { @@ -945,12 +665,12 @@ namespace BlackCore } } - void CNetworkVatlib::onMetarReceived(Cvatlib_Network *, const char *data, void *cbvar) + void CNetworkVatlib::onMetarReceived(VatSessionID, const char *data, void *cbvar) { emit cbvar_cast(cbvar)->metarReplyReceived(cbvar_cast(cbvar)->fromFSD(data)); } - void CNetworkVatlib::onInfoQueryRequestReceived(Cvatlib_Network *, const char *callsignString, Cvatlib_Network::infoQuery type, const char *, void *cbvar) + void CNetworkVatlib::onInfoQueryRequestReceived(VatSessionID, const char *callsignString, VatInfoQueryType type, const char *, void *cbvar) { auto timer = new QTimer(cbvar_cast(cbvar)); timer->setSingleShot(true); @@ -959,67 +679,49 @@ namespace BlackCore BlackMisc::Aviation::CCallsign callsign(callsignString); switch (type) { - case Cvatlib_Network::infoQuery_Freq: + case vatInfoQueryTypeFreq: connect(timer, &QTimer::timeout, [ = ]() { cbvar_cast(cbvar)->replyToFrequencyQuery(callsign); }); break; - case Cvatlib_Network::infoQuery_Name: + case vatInfoQueryTypeName: connect(timer, &QTimer::timeout, [ = ]() { cbvar_cast(cbvar)->replyToNameQuery(callsign); }); break; + default: + break; } } - void CNetworkVatlib::onInfoQueryReplyReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::infoQuery type, const char *data, const char *data2, void *cbvar) + void CNetworkVatlib::onInfoQueryReplyReceived(VatSessionID, const char *callsign, VatInfoQueryType type, const char *data, const char *data2, void *cbvar) { switch (type) { - case Cvatlib_Network::infoQuery_Freq: emit cbvar_cast(cbvar)->frequencyReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), CFrequency(cbvar_cast(cbvar)->fromFSD(data).toFloat(), CFrequencyUnit::MHz())); break; - case Cvatlib_Network::infoQuery_Server: emit cbvar_cast(cbvar)->serverReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); break; - case Cvatlib_Network::infoQuery_ATC: emit cbvar_cast(cbvar)->atcReplyReceived(cbvar_cast(cbvar)->fromFSD(data2), *data == 'Y'); break; - case Cvatlib_Network::infoQuery_Name: emit cbvar_cast(cbvar)->realNameReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); break; - case Cvatlib_Network::infoQuery_IP: emit cbvar_cast(cbvar)->ipReplyReceived(cbvar_cast(cbvar)->fromFSD(data)); break; + case vatInfoQueryTypeFreq: emit cbvar_cast(cbvar)->frequencyReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), CFrequency(cbvar_cast(cbvar)->fromFSD(data).toFloat(), CFrequencyUnit::MHz())); break; + case vatInfoQueryTypeServer: emit cbvar_cast(cbvar)->serverReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); break; + case vatInfoQueryTypeAtc: emit cbvar_cast(cbvar)->atcReplyReceived(cbvar_cast(cbvar)->fromFSD(data2), *data == 'Y'); break; + case vatInfoQueryTypeName: emit cbvar_cast(cbvar)->realNameReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); break; + case vatInfoQueryTypeIP: emit cbvar_cast(cbvar)->ipReplyReceived(cbvar_cast(cbvar)->fromFSD(data)); break; + default: break; } } - void CNetworkVatlib::onCapabilitiesReplyReceived(Cvatlib_Network *net, const char *callsign, const char **keysValues, void *cbvar) + void CNetworkVatlib::onCapabilitiesReplyReceived(VatSessionID, const char *callsign, int capabilityFlags, void *cbvar) { - quint32 flags = 0; - while (*keysValues) - { - const QString key(keysValues[0]); - const char *value = keysValues[1]; - if (*value == '1') - { - if (key == net->capability_AtcInfo) { flags |= AcceptsAtisResponses; } - else if (key == net->capability_InterimPos) { flags |= SupportsInterimPosUpdates; } - else if (key == net->capability_ModelDesc) { flags |= SupportsModelDescriptions; } - } - keysValues += 2; - } + int flags = 0; + if (capabilityFlags & vatCapsAtcInfo) { flags |= AcceptsAtisResponses; } + else if (capabilityFlags & vatCapsInterminPos) { flags |= SupportsInterimPosUpdates; } + else if (capabilityFlags & vatCapsModelDesc) { flags |= SupportsModelDescriptions; } emit cbvar_cast(cbvar)->capabilitiesReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), flags); } - void CNetworkVatlib::onAtisReplyReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::atisLineType lineType, const char *data, void *cbvar) + void CNetworkVatlib::onAtisReplyReceived(VatSessionID, const char *callsign, const VatControllerAtis *atis, void *cbvar) { - auto &atis = cbvar_cast(cbvar)->m_atisParts[cbvar_cast(cbvar)->fromFSD(callsign)]; // also inserts in map if not already in + emit cbvar_cast(cbvar)->atisVoiceRoomReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(atis->voiceRoom)); + emit cbvar_cast(cbvar)->atisLogoffTimeReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(atis->zuluLogoff)); - if (lineType == Cvatlib_Network::atisLineType_VoiceRoom) + CInformationMessage atisMessage; + atisMessage.setType(CInformationMessage::ATIS); + for (int i = 0; i < atis->textLineCount; ++i) { - emit cbvar_cast(cbvar)->atisVoiceRoomReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); - } - if (lineType == Cvatlib_Network::atisLineType_ZuluLogoff) - { - emit cbvar_cast(cbvar)->atisLogoffTimeReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); - } - - if (lineType == Cvatlib_Network::atisLineType_LineCount) - { - atis.setType(CInformationMessage::ATIS); - emit cbvar_cast(cbvar)->atisReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), atis); - cbvar_cast(cbvar)->m_atisParts.remove(cbvar_cast(cbvar)->fromFSD(callsign)); - } - else - { - const QString fixed = cbvar_cast(cbvar)->fromFSD(data).trimmed(); + const QString fixed = cbvar_cast(cbvar)->fromFSD(atis->textLines[i]).trimmed(); if (! fixed.isEmpty()) { // detect the stupid z1, z2, z3 placeholders @@ -1030,24 +732,27 @@ namespace BlackCore if (test.length() == 1) return; // sometimes just z // append - if (!atis.isEmpty()) atis.appendMessage("\n"); - atis.appendMessage(fixed); + if (!atisMessage.isEmpty()) atisMessage.appendMessage("\n"); + atisMessage.appendMessage(fixed); } } + + emit cbvar_cast(cbvar)->atisReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), atisMessage); + } - void CNetworkVatlib::onFlightPlanReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::FlightPlan fp, void *cbvar) + void CNetworkVatlib::onFlightPlanReceived(VatSessionID, const char *callsign, const VatFlightPlan *fp, void *cbvar) { BlackMisc::Aviation::CFlightPlan::FlightRules rules = BlackMisc::Aviation::CFlightPlan::VFR; - switch (fp.fpRules) + switch (fp->flightType) { default: - case Cvatlib_Network::fpRuleType_VFR: rules = BlackMisc::Aviation::CFlightPlan::VFR; break; - case Cvatlib_Network::fpRuleType_IFR: rules = BlackMisc::Aviation::CFlightPlan::IFR; break; - case Cvatlib_Network::fpRuleType_SVFR: rules = BlackMisc::Aviation::CFlightPlan::SVFR; break; + case vatFlightTypeVFR: rules = BlackMisc::Aviation::CFlightPlan::VFR; break; + case vatFlightTypeIFR: rules = BlackMisc::Aviation::CFlightPlan::IFR; break; +// case Cvatlib_Network::fpRuleType_SVFR: rules = BlackMisc::Aviation::CFlightPlan::SVFR; break; } - auto cruiseAltString = cbvar_cast(cbvar)->fromFSD(fp.cruiseAlt); + auto cruiseAltString = cbvar_cast(cbvar)->fromFSD(fp->cruiseAltitude); static const QRegExp withUnit("\\D+"); if (!cruiseAltString.isEmpty() && withUnit.indexIn(cruiseAltString) < 0) { @@ -1057,74 +762,74 @@ namespace BlackCore cruiseAlt.parseFromString(cruiseAltString); - QString depTimePlanned = QString("0000").append(QString::number(fp.depTimePlanned)).right(4); - QString depTimeActual = QString("0000").append(QString::number(fp.depTimeActual)).right(4); + QString depTimePlanned = QString("0000").append(QString::number(fp->departTime)).right(4); + QString depTimeActual = QString("0000").append(QString::number(fp->departTimeActual)).right(4); BlackMisc::Aviation::CFlightPlan flightPlan( - cbvar_cast(cbvar)->fromFSD(fp.acType), - cbvar_cast(cbvar)->fromFSD(fp.depApt), - cbvar_cast(cbvar)->fromFSD(fp.destApt), - cbvar_cast(cbvar)->fromFSD(fp.altApt), + cbvar_cast(cbvar)->fromFSD(fp->aircraftType), + cbvar_cast(cbvar)->fromFSD(fp->departAirport), + cbvar_cast(cbvar)->fromFSD(fp->destAirport), + cbvar_cast(cbvar)->fromFSD(fp->alternateAirport), QDateTime::fromString(depTimePlanned, "hhmm"), QDateTime::fromString(depTimeActual, "hhmm"), - BlackMisc::PhysicalQuantities::CTime(fp.enrouteHrs * 60 + fp.enrouteMins, BlackMisc::PhysicalQuantities::CTimeUnit::min()), - BlackMisc::PhysicalQuantities::CTime(fp.fuelHrs * 60 + fp.fuelMins, BlackMisc::PhysicalQuantities::CTimeUnit::min()), + BlackMisc::PhysicalQuantities::CTime(fp->enrouteHrs * 60 + fp->enrouteMins, BlackMisc::PhysicalQuantities::CTimeUnit::min()), + BlackMisc::PhysicalQuantities::CTime(fp->fuelHrs * 60 + fp->fuelMins, BlackMisc::PhysicalQuantities::CTimeUnit::min()), cruiseAlt, - BlackMisc::PhysicalQuantities::CSpeed(fp.trueCruiseSpeed, BlackMisc::PhysicalQuantities::CSpeedUnit::kts()), + BlackMisc::PhysicalQuantities::CSpeed(fp->trueCruisingSpeed, BlackMisc::PhysicalQuantities::CSpeedUnit::kts()), rules, - cbvar_cast(cbvar)->fromFSD(fp.route), - cbvar_cast(cbvar)->fromFSD(fp.remarks) + cbvar_cast(cbvar)->fromFSD(fp->route), + cbvar_cast(cbvar)->fromFSD(fp->remarks) ); emit cbvar_cast(cbvar)->flightPlanReplyReceived(callsign, flightPlan); } - void CNetworkVatlib::onTemperatureDataReceived(Cvatlib_Network *, Cvatlib_Network::TempLayer /** layers **/ [4], INT /** pressure **/, void * /** cbvar **/) + void CNetworkVatlib::onTemperatureDataReceived(VatSessionID, const VatTempLayer /** layer **/ [4], int /** pressure **/, void * /** cbvar **/) { //TODO } - void CNetworkVatlib::onErrorReceived(Cvatlib_Network *, Cvatlib_Network::error type, const char *msg, const char *data, void *cbvar) + void CNetworkVatlib::onErrorReceived(VatSessionID, VatServerError error, const char *msg, const char *data, void *cbvar) { auto *self = cbvar_cast(cbvar); - switch (type) + switch (error) { - case Cvatlib_Network::error_CallsignTaken: CLogMessage(self).error("The requested callsign is already taken"); emit self->terminate(); break; - case Cvatlib_Network::error_CallsignInvalid: CLogMessage(self).error("The requested callsign is not valid"); emit self->terminate(); break; - case Cvatlib_Network::error_CIDPasswdInvalid: CLogMessage(self).error("Wrong user ID or password"); emit self->terminate(); break; - case Cvatlib_Network::error_ProtoVersion: CLogMessage(self).error("This server does not support our protocol version"); emit self->terminate(); break; - case Cvatlib_Network::error_LevelTooHigh: CLogMessage(self).error("You are not authorized to use the requested pilot rating"); emit self->terminate(); break; - case Cvatlib_Network::error_ServerFull: CLogMessage(self).error("The server is full"); emit self->terminate(); break; - case Cvatlib_Network::error_CIDSuspended: CLogMessage(self).error("Your user account is suspended"); emit self->terminate(); break; - case Cvatlib_Network::error_InvalidPosition: CLogMessage(self).error("You are not authorized to use the requested pilot rating"); emit self->terminate(); break; - case Cvatlib_Network::error_SoftwareNotAuthorized: CLogMessage(self).error("This software is not authorized for use on this network"); emit self->terminate(); break; + case vatServerErrorCsInUs: CLogMessage(self).error("The requested callsign is already taken"); emit self->terminate(); break; + case vatServerErrorCallsignInvalid: CLogMessage(self).error("The requested callsign is not valid"); emit self->terminate(); break; + case vatServerErrorCidInvalid: CLogMessage(self).error("Wrong user ID or password"); emit self->terminate(); break; + case vatServerErrorRevision: CLogMessage(self).error("This server does not support our protocol version"); emit self->terminate(); break; + case vatServerErrorLevel: CLogMessage(self).error("You are not authorized to use the requested pilot rating"); emit self->terminate(); break; + case vatServerErrorServFull: CLogMessage(self).error("The server is full"); emit self->terminate(); break; + case vatServerErrorCsSuspended: CLogMessage(self).error("Your user account is suspended"); emit self->terminate(); break; + case vatServerErrorInvPos: CLogMessage(self).error("You are not authorized to use the requested rating"); emit self->terminate(); break; + case vatServerErrorUnAuth: CLogMessage(self).error("This software is not authorized for use on this network"); emit self->terminate(); break; - case Cvatlib_Network::error_Ok: CLogMessage(self).info("OK"); break; - case Cvatlib_Network::error_Syntax: CLogMessage(self).info("Malformed packet: Syntax error: %1") << self->fromFSD(data); break; - case Cvatlib_Network::error_SourceInvalid: CLogMessage(self).info("Server: source invalid %1") << self->fromFSD(data); break; - case Cvatlib_Network::error_CallsignNotExists: CLogMessage(self).info("Shim lib: %1 (%2)") << self->fromFSD(msg) << self->fromFSD(data); break; - case Cvatlib_Network::error_NoFP: CLogMessage(self).info("Server: no flight plan"); break; - case Cvatlib_Network::error_NoWeather: CLogMessage(self).info("Server: requested weather profile does not exist"); break; + case vatServerErrorNone: CLogMessage(self).info("OK"); break; + case vatServerErrorSyntax: CLogMessage(self).info("Malformed packet: Syntax error: %1") << self->fromFSD(data); break; + case vatServerErrorSrcInvalid: CLogMessage(self).info("Server: source invalid %1") << self->fromFSD(data); break; + case vatServerErrorNoSuchCs: CLogMessage(self).info("Shim lib: %1 (%2)") << self->fromFSD(msg) << self->fromFSD(data); break; + case vatServerErrorNoFP: CLogMessage(self).info("Server: no flight plan"); break; + case vatServerErrorNoWeather: CLogMessage(self).info("Server: requested weather profile does not exist"); break; // we have no idea what these mean - case Cvatlib_Network::error_Registered: - case Cvatlib_Network::error_InvalidControl: CLogMessage(self).info("Server: ") << self->fromFSD(msg); break; + case vatServerErrorRegistered: + case vatServerErrorInvalidCtrl: CLogMessage(self).info("Server: ") << self->fromFSD(msg); break; - default: qFatal("VATSIM shim library: %s (error %d)", msg, type); emit self->terminate(); + default: qFatal("vatlib: %s (error %d)", msg, error); emit self->terminate(); } } - void CNetworkVatlib::onWindDataReceived(Cvatlib_Network *, Cvatlib_Network::WindLayer /** layers **/[4], void * /** cbvar **/) + void CNetworkVatlib::onWindDataReceived(VatSessionID, const VatWindLayer /** layer **/ [4], void * /** cbvar **/) { //TODO } - void CNetworkVatlib::onCloudDataReceived(Cvatlib_Network *, Cvatlib_Network::CloudLayer /** layers **/ [2], Cvatlib_Network::StormLayer /** storm **/, float /** vis **/, void * /** cbvar **/) + void CNetworkVatlib::onCloudDataReceived(VatSessionID,const VatCloudLayer /** layers **/ [2], VatThunderStormLayer /** storm **/, float /** vis **/, void * /** cbvar **/) { //TODO } - void CNetworkVatlib::onPilotInfoRequestReceived(Cvatlib_Network *, const char *callsignString, void *cbvar) + void CNetworkVatlib::onPilotInfoRequestReceived(VatSessionID, const char *callsignString, void *cbvar) { auto timer = new QTimer(cbvar_cast(cbvar)); timer->setSingleShot(true); @@ -1134,19 +839,18 @@ namespace BlackCore connect(timer, &QTimer::timeout, [ = ]() { cbvar_cast(cbvar)->sendAircraftInfo(callsign); }); } - void CNetworkVatlib::onPilotInfoReceived(Cvatlib_Network *net, const char *callsign, const char **keysValues, void *cbvar) + void CNetworkVatlib::onPilotInfoReceived(VatSessionID, const char *callsign, const VatAircraftInfo *aircraftInfo, void *cbvar) { BlackMisc::Aviation::CAircraftIcao icao; - while (*keysValues) - { - QString key(*keysValues); - keysValues++; - if (key == net->acinfo_Equipment) { icao.setAircraftDesignator(*keysValues); } - else if (key == net->acinfo_Airline) { icao.setAirlineDesignator(*keysValues); } - else if (key == net->acinfo_Livery) { icao.setLivery(*keysValues); } - keysValues++; - } + icao.setAircraftDesignator(aircraftInfo->aircraftType); + icao.setAirlineDesignator(aircraftInfo->airline); + icao.setLivery(aircraftInfo->livery); emit cbvar_cast(cbvar)->icaoCodesReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), icao); } + void CNetworkVatlib::networkErrorHandler(const char *message) + { + CLogMessage(static_cast(nullptr)).error(message); + } + } // namespace diff --git a/src/blackcore/network_vatlib.h b/src/blackcore/network_vatlib.h index df5d31d43..1ceab00cc 100644 --- a/src/blackcore/network_vatlib.h +++ b/src/blackcore/network_vatlib.h @@ -9,7 +9,7 @@ #define BLACKCORE_NETWORK_VATLIB_H #include "network.h" -#include +#include #include #include #include @@ -33,16 +33,10 @@ namespace BlackCore virtual ~CNetworkVatlib(); //! \copydoc INetwork::isConnected() - virtual bool isConnected() const override { return m_status == Cvatlib_Network::connStatus_Connected; } + virtual bool isConnected() const override { return m_status == vatStatusConnected; } //! \copydoc INetwork::pendingConnection() - virtual bool isPendingConnection() const override { return m_status == Cvatlib_Network::connStatus_Connecting; } - - //! \copydoc INetwork::getStatusUrls() - virtual QList getStatusUrls() const override; - - //! \copydoc INetwork::getKnownServers() - virtual BlackMisc::Network::CServerList getKnownServers() const override; + virtual bool isPendingConnection() const override { return m_status == vatStatusConnecting; } // Network slots //! \copydoc INetwork::presetLoginMode @@ -93,29 +87,31 @@ namespace BlackCore void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign); private: //shimlib callbacks - static void onConnectionStatusChanged(Cvatlib_Network *, Cvatlib_Network::connStatus oldStatus, Cvatlib_Network::connStatus newStatus, void *cbvar); - static void onTextMessageReceived(Cvatlib_Network *, const char *from, const char *to, const char *msg, void *cbvar); - static void onRadioMessageReceived(Cvatlib_Network *, const char *from, INT numFreq, INT *freqList, const char *msg, void *cbvar); - static void onControllerDisconnected(Cvatlib_Network *, const char *callsign, void *cbvar); - static void onInterimPilotPositionUpdate(Cvatlib_Network *, const char *callsign, Cvatlib_Network::PilotPosUpdate pos, void *cbvar); - static void onAtcPositionUpdate(Cvatlib_Network *, const char *callsign, Cvatlib_Network::ATCPosUpdate pos, void *cbvar); - static void onKicked(Cvatlib_Network *, const char *reason, void *cbvar); - static void onPong(Cvatlib_Network *, const char *callsign, INT elapsedTime, void *cbvar); - static void onMetarReceived(Cvatlib_Network *, const char *data, void *cbvar); - static void onInfoQueryRequestReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::infoQuery type, const char *data, void *cbvar); - static void onInfoQueryReplyReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::infoQuery type, const char *data, const char *data2, void *cbvar); - static void onCapabilitiesReplyReceived(Cvatlib_Network *, const char *callsign, const char **keysValues, void *cbvar); - static void onAtisReplyReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::atisLineType type, const char *data, void *cbvar); - static void onFlightPlanReceived(Cvatlib_Network *, const char *callsign, Cvatlib_Network::FlightPlan fp, void *cbvar); - static void onTemperatureDataReceived(Cvatlib_Network *, Cvatlib_Network::TempLayer layers[4], INT pressure, void *cbvar); - static void onErrorReceived(Cvatlib_Network *, Cvatlib_Network::error type, const char *msg, const char *data, void *cbvar); - static void onWindDataReceived(Cvatlib_Network *, Cvatlib_Network::WindLayer layers[4], void *cbvar); - static void onCloudDataReceived(Cvatlib_Network *, Cvatlib_Network::CloudLayer layers[2], Cvatlib_Network::StormLayer storm, float vis, void *cbvar); - static void onPilotDisconnected(Cvatlib_Network *, const char *callsign, void *cbvar); - static void onPilotInfoRequestReceived(Cvatlib_Network *, const char *callsign, void *cbvar); - static void onPilotInfoReceived(Cvatlib_Network *, const char *callsign, const char **keysValues, void *cbvar); - static void onPilotPositionUpdate(Cvatlib_Network *, const char *callsign, Cvatlib_Network::PilotPosUpdate pos, void *cbvar); - static void onCustomPacketReceived(Cvatlib_Network *, const char *callsign, const char *packetId, const char **data, INT dataSize, void *cbvar); + static void onConnectionStatusChanged(VatSessionID, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbvar); + static void onTextMessageReceived(VatSessionID, const char *from, const char *to, const char *msg, void *cbvar); + + static void onRadioMessageReceived(VatSessionID, const char *from, int freqCount, int *freqList, const char *message, void *cbvar); + + static void onControllerDisconnected(VatSessionID, const char *callsign, void *cbvar); + static void onInterimPilotPositionUpdate(VatSessionID, const char *callsign, const VatPilotPosition *position, void *cbvar); + static void onAtcPositionUpdate(VatSessionID, const char *callsign, const VatAtcPosition *pos, void *cbvar); + static void onKicked(VatSessionID, const char *reason, void *cbvar); + static void onPong(VatSessionID, const char *sender, double elapsedTime, void *cbvar); + static void onMetarReceived(VatSessionID, const char *data, void *cbvar); + static void onInfoQueryRequestReceived(VatSessionID, const char *callsign, VatInfoQueryType type, const char *data, void *cbvar); + static void onInfoQueryReplyReceived(VatSessionID, const char *callsign, VatInfoQueryType type, const char *data, const char *data2, void *cbvar); + static void onCapabilitiesReplyReceived(VatSessionID, const char *callsign, int capabilityFlags, void *cbvar); + static void onAtisReplyReceived(VatSessionID, const char *callsign, const VatControllerAtis *atis, void *cbvar); + static void onFlightPlanReceived(VatSessionID, const char *callsign, const VatFlightPlan *fp, void *cbvar); + static void onTemperatureDataReceived(VatSessionID, const VatTempLayer layer[4], int pressure, void *cbvar); + static void onWindDataReceived(VatSessionID, const VatWindLayer layer[4], void *cbvar); + static void onCloudDataReceived(VatSessionID, const VatCloudLayer cloudLayer[2], VatThunderStormLayer thunderStormLayer, float visibility, void *cbvar); + static void onErrorReceived(VatSessionID, VatServerError error, const char *msg, const char *data, void *cbvar); + static void onPilotDisconnected(VatSessionID, const char *callsign, void *cbvar); + static void onPilotInfoRequestReceived(VatSessionID, const char *callsign, void *cbvar); + static void onPilotInfoReceived(VatSessionID, const char *callsign, const VatAircraftInfo *aircraftInfo, void *cbvar); + static void onPilotPositionUpdate(VatSessionID, const char *callsign, const VatPilotPosition *position, void *cbvar); + static void onCustomPacketReceived(VatSessionID, const char *callsign, const char *packetId, const char **data, int dataSize, void *cbvar); private: QByteArray toFSD(QString qstr) const; @@ -125,9 +121,9 @@ namespace BlackCore QStringList fromFSD(const char **cstrArray, int size) const; void initializeSession(); - void changeConnectionStatus(Cvatlib_Network::connStatus newStatus, QString errorMessage = ""); - bool isDisconnected() const { return m_status != Cvatlib_Network::connStatus_Connecting && m_status != Cvatlib_Network::connStatus_Connected; } - QString getSocketError() const; + void changeConnectionStatus(VatConnectionStatus newStatus); + bool isDisconnected() const { return m_status != vatStatusConnecting && m_status != vatStatusConnected; } + static void networkErrorHandler(const char *message); private slots: void process(); @@ -142,18 +138,17 @@ namespace BlackCore struct VatlibQScopedPointerDeleter { //! Called by QScopedPointer destructor - static void cleanup(Cvatlib_Network *net) { if (net) net->Destroy(); } + static void cleanup(VatSessionID session) { if (session) Vat_DestroyNetworkSession(session); } }; private: - QScopedPointer m_net; + QScopedPointer m_net; LoginMode m_loginMode; - Cvatlib_Network::connStatus m_status; + VatConnectionStatus m_status; BlackMisc::Network::CServer m_server; BlackMisc::Aviation::CCallsign m_callsign; BlackMisc::Aviation::CAircraftIcao m_icaoCode; BlackMisc::Aviation::CAircraft m_ownAircraft; // not using callsign, user, or icao parts of this member because they can't be changed when connected - QMap m_atisParts; QTimer m_processingTimer; QTimer m_updateTimer; diff --git a/src/blackgui/components/atcstationcomponent.cpp b/src/blackgui/components/atcstationcomponent.cpp index fd87393ca..6aa89a72e 100644 --- a/src/blackgui/components/atcstationcomponent.cpp +++ b/src/blackgui/components/atcstationcomponent.cpp @@ -191,12 +191,11 @@ namespace BlackGui this->m_timestampBookedStationsChanged = QDateTime::currentDateTimeUtc(); } - void CAtcStationComponent::ps_connectionStatusChanged(uint from, uint to, const QString &message) + void CAtcStationComponent::ps_connectionStatusChanged(uint from, uint to) { INetwork::ConnectionStatus fromStatus = static_cast(from); INetwork::ConnectionStatus toStatus = static_cast(to); Q_UNUSED(fromStatus); - Q_UNUSED(message); if (INetwork::isDisconnectedStatus(toStatus)) { this->ui->tvp_AtcStationsOnline->clear(); diff --git a/src/blackgui/components/atcstationcomponent.h b/src/blackgui/components/atcstationcomponent.h index 0399051dd..943cf3756 100644 --- a/src/blackgui/components/atcstationcomponent.h +++ b/src/blackgui/components/atcstationcomponent.h @@ -97,7 +97,7 @@ namespace BlackGui void ps_changedAtcStationsOnline(); //! Connection status has been changed - void ps_connectionStatusChanged(uint from, uint to, const QString &message); + void ps_connectionStatusChanged(uint from, uint to); //! Request dummy ATC online stations void ps_testCreateDummyOnlineAtcStations(int number); diff --git a/src/blackgui/components/infobarstatuscomponent.cpp b/src/blackgui/components/infobarstatuscomponent.cpp index dcbe24f70..085d6b619 100644 --- a/src/blackgui/components/infobarstatuscomponent.cpp +++ b/src/blackgui/components/infobarstatuscomponent.cpp @@ -113,12 +113,11 @@ namespace BlackGui Q_UNUSED(paused); } - void CInfoBarStatusComponent::ps_onNetworkConnectionChanged(uint from, uint to, const QString &message) + void CInfoBarStatusComponent::ps_onNetworkConnectionChanged(uint from, uint to) { INetwork::ConnectionStatus fromStatus = static_cast(from); INetwork::ConnectionStatus toStatus = static_cast(to); Q_UNUSED(fromStatus); - Q_UNUSED(message); switch (toStatus) { diff --git a/src/blackgui/components/infobarstatuscomponent.h b/src/blackgui/components/infobarstatuscomponent.h index 01ee91cde..b36aeb787 100644 --- a/src/blackgui/components/infobarstatuscomponent.h +++ b/src/blackgui/components/infobarstatuscomponent.h @@ -57,7 +57,7 @@ namespace BlackGui void ps_onSimulatorStatusChanged(bool connected, bool running, bool paused); //! Network connection has been changed - void ps_onNetworkConnectionChanged(uint from, uint to, const QString &message); + void ps_onNetworkConnectionChanged(uint from, uint to); //! Context menu requested void ps_customAudioContextMenuRequested(const QPoint &position); diff --git a/src/blackgui/components/mainkeypadareacomponent.cpp b/src/blackgui/components/mainkeypadareacomponent.cpp index 6e7799557..5582022aa 100644 --- a/src/blackgui/components/mainkeypadareacomponent.cpp +++ b/src/blackgui/components/mainkeypadareacomponent.cpp @@ -129,13 +129,12 @@ namespace BlackGui } } - void CMainKeypadAreaComponent::ps_connectionStatusChanged(uint from, uint to, const QString &message) + void CMainKeypadAreaComponent::ps_connectionStatusChanged(uint from, uint to) { INetwork::ConnectionStatus statusFrom = static_cast(from); INetwork::ConnectionStatus statusTo = static_cast(to); Q_UNUSED(statusFrom); - Q_UNUSED(message); // Connected button if (statusTo == INetwork::Connected) diff --git a/src/blackgui/components/mainkeypadareacomponent.h b/src/blackgui/components/mainkeypadareacomponent.h index f12e78c9c..d6e695fcb 100644 --- a/src/blackgui/components/mainkeypadareacomponent.h +++ b/src/blackgui/components/mainkeypadareacomponent.h @@ -72,7 +72,7 @@ namespace BlackGui void ps_buttonSelected(); //! \copydoc BlackCore::IContextNetwork::connectionStatusChanged - void ps_connectionStatusChanged(uint from, uint to, const QString &message); + void ps_connectionStatusChanged(uint from, uint to); //! Command line entered void ps_commandEntered(); diff --git a/src/blackmisc/avflightplan.h b/src/blackmisc/avflightplan.h index 653fa2a46..40d29745e 100644 --- a/src/blackmisc/avflightplan.h +++ b/src/blackmisc/avflightplan.h @@ -36,7 +36,8 @@ namespace BlackMisc { VFR = 0, //!< Visual flight rules IFR, //!< Instrument flight rules - SVFR //!< Special VFR (reserved for ATC use) + SVFR, //!< Special VFR (reserved for ATC use), + DVFR //!< Defense VFR }; static const int MaxRemarksLength = 150; //!< Max remarks length diff --git a/src/swiftgui_standard/swiftguistd.cpp b/src/swiftgui_standard/swiftguistd.cpp index 914951de0..b02daacfa 100644 --- a/src/swiftgui_standard/swiftguistd.cpp +++ b/src/swiftgui_standard/swiftguistd.cpp @@ -216,7 +216,7 @@ void SwiftGuiStd::ps_onConnectionTerminated() /* * Connection status changed */ -void SwiftGuiStd::ps_onConnectionStatusChanged(uint /** from **/, uint to, const QString & /* message */) +void SwiftGuiStd::ps_onConnectionStatusChanged(uint /** from **/, uint to) { this->updateGuiStatusInformation(); INetwork::ConnectionStatus newStatus = static_cast(to); diff --git a/src/swiftgui_standard/swiftguistd.h b/src/swiftgui_standard/swiftguistd.h index e944d6df6..3b4d70c72 100644 --- a/src/swiftgui_standard/swiftguistd.h +++ b/src/swiftgui_standard/swiftguistd.h @@ -200,7 +200,7 @@ private slots: * \param from old status, as uint so it is compliant with DBus * \param to new status, as uint so it is compliant with DBus */ - void ps_onConnectionStatusChanged(uint from, uint to, const QString &message); + void ps_onConnectionStatusChanged(uint from, uint to); // // GUI related slots