diff --git a/samples/cli_client/client.cpp b/samples/cli_client/client.cpp index d4a427ebf..ca6005867 100644 --- a/samples/cli_client/client.cpp +++ b/samples/cli_client/client.cpp @@ -15,23 +15,24 @@ Client::Client(BlackMisc::IContext &ctx) connect(m_net, &INetwork::atcPositionUpdate, this, &Client::atcPositionUpdate); connect(m_net, &INetwork::atcDisconnected, this, &Client::atcDisconnected); connect(m_net, &INetwork::connectionStatusChanged, this, &Client::connectionStatusChanged); - connect(m_net, &INetwork::ipQueryReplyReceived, this, &Client::ipQueryReplyReceived); - connect(m_net, &INetwork::frequencyQueryReplyReceived, this, &Client::freqQueryReplyReceived); - connect(m_net, &INetwork::serverQueryReplyReceived, this, &Client::serverQueryReplyReceived); - connect(m_net, &INetwork::atcQueryReplyReceived, this, &Client::atcQueryReplyReceived); - connect(m_net, &INetwork::atisQueryReplyReceived, this, &Client::atisQueryReplyReceived); - connect(m_net, &INetwork::nameQueryReplyReceived, this, &Client::nameQueryReplyReceived); - connect(m_net, &INetwork::capabilitiesQueryReplyReceived, this, &Client::capabilitiesQueryReplyReceived); + connect(m_net, &INetwork::ipReplyReceived, this, &Client::ipReplyReceived); + connect(m_net, &INetwork::frequencyReplyReceived, this, &Client::freqReplyReceived); + connect(m_net, &INetwork::serverReplyReceived, this, &Client::serverReplyReceived); + connect(m_net, &INetwork::atcReplyReceived, this, &Client::atcReplyReceived); + connect(m_net, &INetwork::atisReplyReceived, this, &Client::atisReplyReceived); + connect(m_net, &INetwork::nameReplyReceived, this, &Client::nameReplyReceived); + connect(m_net, &INetwork::capabilitiesReplyReceived, this, &Client::capabilitiesReplyReceived); connect(m_net, &INetwork::kicked, this, &Client::kicked); - connect(m_net, &INetwork::metarReceived, this, &Client::metarReceived); + connect(m_net, &INetwork::metarReplyReceived, this, &Client::metarReplyReceived); connect(m_net, &INetwork::pilotDisconnected, this, &Client::pilotDisconnected); - connect(m_net, &INetwork::aircraftInfoReceived, this, &Client::aircraftInfoReceived); - connect(m_net, &INetwork::pong, this, &Client::pong); + connect(m_net, &INetwork::aircraftInfoReplyReceived, this, &Client::aircraftInfoReplyReceived); + connect(m_net, &INetwork::pongReceived, this, &Client::pongReceived); connect(m_net, &INetwork::textMessagesReceived, this, &Client::textMessagesReceived); - connect(this, &Client::setServer, m_net, &INetwork::setServer); - connect(this, &Client::setCallsign, m_net, &INetwork::setCallsign); - connect(this, &Client::setRealName, m_net, &INetwork::setRealName); + connect(this, &Client::presetServer, m_net, &INetwork::presetServer); + connect(this, &Client::presetCallsign, m_net, &INetwork::presetCallsign); + connect(this, &Client::presetIcaoCodes, m_net, &INetwork::presetIcaoCodes); + connect(this, &Client::presetLoginMode, m_net, &INetwork::presetLoginMode); connect(this, &Client::initiateConnection, m_net, &INetwork::initiateConnection); connect(this, &Client::terminateConnection, m_net, &INetwork::terminateConnection); connect(this, &Client::sendTextMessages, m_net, &INetwork::sendTextMessages); @@ -42,22 +43,23 @@ Client::Client(BlackMisc::IContext &ctx) connect(this, &Client::sendAtisQuery, m_net, &INetwork::sendAtisQuery); connect(this, &Client::sendNameQuery, m_net, &INetwork::sendNameQuery); connect(this, &Client::sendCapabilitiesQuery, m_net, &INetwork::sendCapabilitiesQuery); - connect(this, &Client::requestPlaneInfo, m_net, &INetwork::requestAircraftInfo); + connect(this, &Client::sendAircraftInfoQuery, m_net, &INetwork::sendAircraftInfoQuery); connect(this, &Client::setOwnAircraft, m_net, &INetwork::setOwnAircraft); connect(this, &Client::setOwnAircraftPosition, m_net, &INetwork::setOwnAircraftPosition); connect(this, &Client::setOwnAircraftSituation, m_net, &INetwork::setOwnAircraftSituation); connect(this, &Client::setOwnAircraftAvionics, m_net, &INetwork::setOwnAircraftAvionics); - connect(this, &Client::ping, m_net, &INetwork::ping); - connect(this, &Client::requestMetar, m_net, &INetwork::requestMetar); - connect(this, &Client::requestWeatherData, m_net, &INetwork::requestWeatherData); + connect(this, &Client::sendPing, m_net, &INetwork::sendPing); + connect(this, &Client::sendMetarQuery, m_net, &INetwork::sendMetarQuery); + connect(this, &Client::sendWeatherDataQuery, m_net, &INetwork::sendWeatherDataQuery); using namespace std::placeholders; 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["setserver"] = std::bind(&Client::setServerCmd, this, _1); - m_commands["setcallsign"] = std::bind(&Client::setCallsignCmd, this, _1); - m_commands["setrealname"] = std::bind(&Client::setRealNameCmd, 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); + m_commands["loginmode"] = std::bind(&Client::presetLoginModeCmd, this, _1); m_commands["initconnect"] = std::bind(&Client::initiateConnectionCmd, this, _1); m_commands["termconnect"] = std::bind(&Client::terminateConnectionCmd, this, _1); m_commands["privmsg"] = std::bind(&Client::sendPrivateTextMessageCmd, this, _1); @@ -69,14 +71,14 @@ Client::Client(BlackMisc::IContext &ctx) m_commands["atis"] = std::bind(&Client::sendAtisQueryCmd, this, _1); m_commands["name"] = std::bind(&Client::sendNameQueryCmd, this, _1); m_commands["caps"] = std::bind(&Client::sendCapabilitiesQueryCmd, this, _1); - m_commands["aircraftinfo"] = std::bind(&Client::requestAircraftInfoCmd, this, _1); + m_commands["aircraftinfo"] = std::bind(&Client::sendAircraftInfoQueryCmd, this, _1); m_commands["setaircraft"] = std::bind(&Client::setOwnAircraftCmd, this, _1); m_commands["setposition"] = std::bind(&Client::setOwnAircraftPositionCmd, this, _1); m_commands["setsituation"] = std::bind(&Client::setOwnAircraftSituationCmd, this, _1); m_commands["setavionics"] = std::bind(&Client::setOwnAircraftAvionicsCmd, this, _1); - m_commands["ping"] = std::bind(&Client::pingCmd, this, _1); - m_commands["metar"] = std::bind(&Client::requestMetarCmd, this, _1); - m_commands["weather"] = std::bind(&Client::requestWeatherDataCmd, this, _1); + m_commands["ping"] = std::bind(&Client::sendPingCmd, this, _1); + m_commands["metar"] = std::bind(&Client::sendMetarQueryCmd, this, _1); + m_commands["weather"] = std::bind(&Client::sendWeatherDataQueryCmd, this, _1); } void Client::command(QString line) @@ -121,26 +123,44 @@ void Client::exit(QTextStream &) emit quit(); } -void Client::setServerCmd(QTextStream &args) +void Client::presetServerCmd(QTextStream &args) { QString hostname; quint16 port; QString username; QString password; args >> hostname >> port >> username >> password; - emit setServer(BlackMisc::Network::CServer("", "", hostname, port, BlackMisc::Network::CUser(username, "", "", password))); + args.skipWhiteSpace(); + emit presetServer(BlackMisc::Network::CServer("", "", hostname, port, BlackMisc::Network::CUser(username, args.readAll(), "", password))); } -void Client::setCallsignCmd(QTextStream &args) +void Client::presetCallsignCmd(QTextStream &args) { QString callsign; args >> callsign; - emit setCallsign(callsign); + emit presetCallsign(callsign); } -void Client::setRealNameCmd(QTextStream &args) +void Client::presetIcaoCodesCmd(QTextStream &args) { - emit setRealName(args.readAll()); + QString acTypeICAO; + QString descriptionICAO; + QString airlineICAO; + QString livery; + QString color; + args >> acTypeICAO >> descriptionICAO >> airlineICAO >> livery >> color; + emit presetIcaoCodes(BlackMisc::Aviation::CAircraftIcao(acTypeICAO, descriptionICAO, airlineICAO, livery, color)); +} + +void Client::presetLoginModeCmd(QTextStream &args) +{ + QString modeString; + args >> modeString; + BlackCore::INetwork::LoginMode mode; + if (modeString == "normal") { mode = BlackCore::INetwork::LoginNormal; } + if (modeString == "observer") { mode = BlackCore::INetwork::LoginAsObserver; } + if (modeString == "stealth") { mode = BlackCore::INetwork::LoginStealth; } + emit presetLoginMode(mode); } void Client::initiateConnectionCmd(QTextStream &) @@ -223,19 +243,15 @@ void Client::sendCapabilitiesQueryCmd(QTextStream &args) emit sendCapabilitiesQuery(callsign); } -void Client::requestAircraftInfoCmd(QTextStream &args) +void Client::sendAircraftInfoQueryCmd(QTextStream &args) { QString callsign; args >> callsign; - emit requestPlaneInfo(callsign); + emit sendAircraftInfoQuery(callsign); } void Client::setOwnAircraftCmd(QTextStream &args) { - QString callsign; - QString acTypeICAO; - QString airlineICAO; - QString livery; double lat; double lon; double alt; @@ -243,15 +259,23 @@ void Client::setOwnAircraftCmd(QTextStream &args) double pitch; double bank; double gs; - args >> callsign >> acTypeICAO >> airlineICAO >> livery >> lat >> lon >> alt >> hdg >> pitch >> bank >> gs; - emit setOwnAircraft(BlackMisc::Aviation::CAircraft(callsign, BlackMisc::Network::CUser(), BlackMisc::Aviation::CAircraftSituation( + double com1; + double com2; + int xpdrCode; + QString xpdrMode; + args >> lat >> lon >> alt >> hdg >> pitch >> bank >> gs >> com1 >> com2 >> xpdrCode >> xpdrMode; + BlackMisc::Aviation::CAircraft aircraft("", BlackMisc::Network::CUser(), BlackMisc::Aviation::CAircraftSituation( BlackMisc::Geo::CCoordinateGeodetic(lat, lon, 0), BlackMisc::Aviation::CAltitude(alt, BlackMisc::Aviation::CAltitude::MeanSeaLevel, BlackMisc::PhysicalQuantities::CLengthUnit::ft()), BlackMisc::Aviation::CHeading(hdg, BlackMisc::Aviation::CHeading::True, BlackMisc::PhysicalQuantities::CAngleUnit::deg()), BlackMisc::PhysicalQuantities::CAngle(pitch, BlackMisc::PhysicalQuantities::CAngleUnit::deg()), BlackMisc::PhysicalQuantities::CAngle(bank, BlackMisc::PhysicalQuantities::CAngleUnit::deg()), BlackMisc::PhysicalQuantities::CSpeed(gs, BlackMisc::PhysicalQuantities::CSpeedUnit::kts()) - ))); + )); + aircraft.setCom1System(BlackMisc::Aviation::CComSystem("COM1", BlackMisc::PhysicalQuantities::CFrequency(com1, BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz()))); + aircraft.setCom2System(BlackMisc::Aviation::CComSystem("COM2", BlackMisc::PhysicalQuantities::CFrequency(com2, BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz()))); + aircraft.setTransponder(BlackMisc::Aviation::CTransponder("Transponder", xpdrCode, xpdrMode)); + emit setOwnAircraft(aircraft); } void Client::setOwnAircraftPositionCmd(QTextStream &args) @@ -298,25 +322,25 @@ void Client::setOwnAircraftAvionicsCmd(QTextStream &args) ); } -void Client::pingCmd(QTextStream &args) +void Client::sendPingCmd(QTextStream &args) { QString callsign; args >> callsign; - emit ping(callsign); + emit sendPing(callsign); } -void Client::requestMetarCmd(QTextStream &args) +void Client::sendMetarQueryCmd(QTextStream &args) { QString airportICAO; args >> airportICAO; - emit requestMetar(airportICAO); + emit sendMetarQuery(airportICAO); } -void Client::requestWeatherDataCmd(QTextStream &args) +void Client::sendWeatherDataQueryCmd(QTextStream &args) { QString airportICAO; args >> airportICAO; - emit requestWeatherData(airportICAO); + emit sendWeatherDataQuery(airportICAO); } /****************************************************************************/ @@ -352,37 +376,37 @@ void Client::connectionStatusChanged(BlackCore::INetwork::ConnectionStatus oldSt } } -void Client::ipQueryReplyReceived(const QString &ip) +void Client::ipReplyReceived(const QString &ip) { std::cout << "IP_REPLY " << ip.toStdString() << std::endl; } -void Client::freqQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq) +void Client::freqReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq) { std::cout << "FREQ_REPLY " << callsign << " " << freq << std::endl; } -void Client::serverQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &hostname) +void Client::serverReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &hostname) { std::cout << "SERVER_REPLY " << callsign << " " << hostname.toStdString() << std::endl; } -void Client::atcQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, bool isATC) +void Client::atcReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, bool isATC) { std::cout << "ATC_REPLY " << callsign << (isATC ? " yes" : " no") << std::endl; } -void Client::atisQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CInformationMessage &atis) +void Client::atisReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CInformationMessage &atis) { std::cout << "ATIS_REPLY " << callsign << " " << atis << std::endl; } -void Client::nameQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname) +void Client::nameReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname) { std::cout << "NAME_REPLY " << callsign << " " << realname.toStdString() << std::endl; } -void Client::capabilitiesQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags) +void Client::capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags) { std::cout << "CAPS_REPLY " << callsign << " " << flags << std::endl; } @@ -392,7 +416,7 @@ void Client::kicked(const QString &msg) std::cout << "KICKED " << msg.toStdString() << std::endl; } -void Client::metarReceived(const QString &data) +void Client::metarReplyReceived(const QString &data) { std::cout << "METAR " << data.toStdString() << std::endl; } @@ -402,12 +426,12 @@ void Client::pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign) std::cout << "PILOT_DISCONNECTED " << callsign << std::endl; } -void Client::aircraftInfoReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icaoData) +void Client::aircraftInfoReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icaoData) { std::cout << "PLANE_INFO_REPLY " << callsign << " " << icaoData.toStdString(); } -void Client::pong(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime) +void Client::pongReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime) { std::cout << "PONG " << callsign << " " << elapsedTime << std::endl; } diff --git a/samples/cli_client/client.h b/samples/cli_client/client.h index dd2a58208..c2f7f0e14 100644 --- a/samples/cli_client/client.h +++ b/samples/cli_client/client.h @@ -30,9 +30,10 @@ private: //commands void help(QTextStream &args); void echo(QTextStream &args); void exit(QTextStream &args); - void setServerCmd(QTextStream &args); - void setCallsignCmd(QTextStream &args); - void setRealNameCmd(QTextStream &args); + void presetServerCmd(QTextStream &args); + void presetCallsignCmd(QTextStream &args); + void presetIcaoCodesCmd(QTextStream &args); + void presetLoginModeCmd(QTextStream &args); void initiateConnectionCmd(QTextStream &args); void terminateConnectionCmd(QTextStream &args); void sendPrivateTextMessageCmd(QTextStream &args); @@ -44,19 +45,21 @@ private: //commands void sendAtisQueryCmd(QTextStream &args); void sendNameQueryCmd(QTextStream &args); void sendCapabilitiesQueryCmd(QTextStream &args); - void requestAircraftInfoCmd(QTextStream &args); + void sendAircraftInfoQueryCmd(QTextStream &args); void setOwnAircraftCmd(QTextStream &args); void setOwnAircraftPositionCmd(QTextStream &args); void setOwnAircraftSituationCmd(QTextStream &args); void setOwnAircraftAvionicsCmd(QTextStream &args); - void pingCmd(QTextStream &args); - void requestMetarCmd(QTextStream &args); - void requestWeatherDataCmd(QTextStream &args); + void sendPingCmd(QTextStream &args); + void sendMetarQueryCmd(QTextStream &args); + void sendWeatherDataQueryCmd(QTextStream &args); signals: //to send to INetwork - void setServer(const BlackMisc::Network::CServer &server); - void setCallsign(const BlackMisc::Aviation::CCallsign &callsign); - void setRealName(const QString &name); + void presetServer(const BlackMisc::Network::CServer &server); + void presetCallsign(const BlackMisc::Aviation::CCallsign &callsign); + void presetRealName(const QString &name); + void presetIcaoCodes(const BlackMisc::Aviation::CAircraftIcao &icao); + void presetLoginMode(BlackCore::INetwork::LoginMode mode); void initiateConnection(); void terminateConnection(); void sendTextMessages(const BlackMisc::Network::CTextMessageList &textMessages); @@ -68,33 +71,33 @@ signals: //to send to INetwork void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign); void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign); void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign); - void requestPlaneInfo(const BlackMisc::Aviation::CCallsign &callsign); + void sendAircraftInfoQuery(const BlackMisc::Aviation::CCallsign &callsign); void setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft); void setOwnAircraftPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude); void setOwnAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation); void setOwnAircraftAvionics(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &xpdr); - void ping(const BlackMisc::Aviation::CCallsign &callsign); - void requestMetar(const QString &airportICAO); - void requestWeatherData(const QString &airportICAO); + void sendPing(const BlackMisc::Aviation::CCallsign &callsign); + void sendMetarQuery(const QString &airportICAO); + void sendWeatherDataQuery(const QString &airportICAO); 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); - void ipQueryReplyReceived(const QString &ip); - void freqQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq); - void serverQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &hostname); - void atcQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, bool isATC); - void atisQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CInformationMessage &atis); - void nameQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname); - void capabilitiesQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags); + 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 &hostname); + void atcReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, bool isATC); + void atisReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CInformationMessage &atis); + void nameReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname); + void capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags); void kicked(const QString &msg); - void metarReceived(const QString &data); + void metarReplyReceived(const QString &data); void pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign); - void aircraftInfoReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icaoData); - void pong(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime); + void aircraftInfoReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icaoData); + void pongReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime); void textMessagesReceived(const BlackMisc::Network::CTextMessageList &messages); private: diff --git a/src/blackcore/context_network.cpp b/src/blackcore/context_network.cpp index 85ac3f4c5..239a435ba 100644 --- a/src/blackcore/context_network.cpp +++ b/src/blackcore/context_network.cpp @@ -27,7 +27,7 @@ namespace BlackCore { // 1. Init by "network driver" - this->m_network = new CNetworkVatlib(CNetworkVatlib::LoginNormal, this); + this->m_network = new CNetworkVatlib(this); // 2. Init own aircraft this->initOwnAircraft(); @@ -42,15 +42,15 @@ namespace BlackCore // 4. connect signals and slots this->connect(this->m_network, &INetwork::connectionStatusChanged, this, &CContextNetwork::psFsdConnectionStatusChanged); this->connect(this->m_network, &INetwork::atcPositionUpdate, this, &CContextNetwork::psFsdAtcPositionUpdate); - this->connect(this->m_network, &INetwork::atisQueryReplyReceived, this, &CContextNetwork::psFsdAtisQueryReceived); - this->connect(this->m_network, &INetwork::atisQueryVoiceRoomReplyReceived, this, &CContextNetwork::psFsdAtisVoiceRoomQueryReceived); - this->connect(this->m_network, &INetwork::atisQueryLogoffTimeReplyReceived, this, &CContextNetwork::psFsdAtisLogoffTimeQueryReceived); - this->connect(this->m_network, &INetwork::metarReceived, this, &CContextNetwork::psFsdMetarReceived); - this->connect(this->m_network, &INetwork::nameQueryReplyReceived, this, &CContextNetwork::psFsdNameQueryReplyReceived); - this->connect(this->m_network, &INetwork::aircraftInfoReceived, this, &CContextNetwork::psFsdAircraftInfoReceived); + this->connect(this->m_network, &INetwork::atisReplyReceived, this, &CContextNetwork::psFsdAtisQueryReceived); + this->connect(this->m_network, &INetwork::atisVoiceRoomReplyReceived, this, &CContextNetwork::psFsdAtisVoiceRoomQueryReceived); + this->connect(this->m_network, &INetwork::atisLogoffTimeReplyReceived, this, &CContextNetwork::psFsdAtisLogoffTimeQueryReceived); + this->connect(this->m_network, &INetwork::metarReplyReceived, this, &CContextNetwork::psFsdMetarReceived); + this->connect(this->m_network, &INetwork::nameReplyReceived, this, &CContextNetwork::psFsdNameQueryReplyReceived); + this->connect(this->m_network, &INetwork::aircraftInfoReplyReceived, this, &CContextNetwork::psFsdAircraftInfoReceived); this->connect(this->m_network, &INetwork::pilotDisconnected, this, &CContextNetwork::psFsdPilotDisconnected); this->connect(this->m_network, &INetwork::aircraftPositionUpdate, this, &CContextNetwork::psFsdAircraftPositionUpdate); - this->connect(this->m_network, &INetwork::frequencyQueryReplyReceived, this, &CContextNetwork::psFsdFrequencyReceived); + 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::statusMessage, this, &CContextNetwork::statusMessage); } @@ -107,8 +107,10 @@ namespace BlackCore } else { - this->m_ownAircraft.setPilot(currentServer.getUser()); - this->m_network->setServer(currentServer); + this->m_ownAircraft.setPilot(currentServer.getUser()); // still needed? + this->m_network->presetServer(currentServer); + this->m_network->presetCallsign(this->m_ownAircraft.getCallsign()); + this->m_network->presetIcaoCodes(this->m_ownAircraft.getIcaoInfo()); this->m_network->setOwnAircraft(this->m_ownAircraft); this->m_network->initiateConnection(); QString msg = "Connection pending "; diff --git a/src/blackcore/context_network_aircraft.cpp b/src/blackcore/context_network_aircraft.cpp index 4dee0903f..f66496324 100644 --- a/src/blackcore/context_network_aircraft.cpp +++ b/src/blackcore/context_network_aircraft.cpp @@ -62,7 +62,7 @@ namespace BlackCore this->m_aircraftsInRange.push_back(aircraft); emit this->m_network->sendFrequencyQuery(callsign); emit this->m_network->sendNameQuery(callsign); - emit this->m_network->requestAircraftInfo(callsign); + emit this->m_network->sendAircraftInfoQuery(callsign); emit this->changedAircraftsInRange(); } else diff --git a/src/blackcore/context_network_atc.cpp b/src/blackcore/context_network_atc.cpp index 56509db36..7ba0ff863 100644 --- a/src/blackcore/context_network_atc.cpp +++ b/src/blackcore/context_network_atc.cpp @@ -63,7 +63,7 @@ namespace BlackCore if (metar.isEmpty() || metar.timeDiffReceivedMs() > 10 * 1000) { // outdated, or not in cache at all - this->m_network->requestMetar(airportIcaoCode.trimmed().toUpper()); + this->m_network->sendMetarQuery(airportIcaoCode.trimmed().toUpper()); // with this little trick we try to make an asynchronous signal / slot // based approach a synchronous return value diff --git a/src/blackcore/network.h b/src/blackcore/network.h index e8e37ce28..de79377dc 100644 --- a/src/blackcore/network.h +++ b/src/blackcore/network.h @@ -31,6 +31,16 @@ namespace BlackCore /*! * Interface for a connection to a multi-user flight simulation and ATC network. * + * The connection can be in one of three essential states: disconnected, connecting, and + * connected. (There is a fourth state, disconnected due to error, which is a substate of + * disconnected.) Some slots may only be called when connected, and some may only be called + * when disconnected; there is a naming convention to highlight this fact using prefixes: + * "preset" slots are only callable when disconnected, "send" slots are only callable when + * connected, and "set" slots are callable in any state. + * + * Slots with the word "query" in their names are handled asynchronously, with one or more + * "reply" signals being sent in response to each invokation of a query slot. + * * \warning If an INetwork signal is connected to a slot, and that slot emits a signal * which is connected to an INetwork slot, then at least one of those connections * must be a Qt::QueuedConnection. @@ -57,6 +67,13 @@ namespace BlackCore SupportsModelDescriptions = 1 << 2 }; + enum LoginMode + { + LoginNormal = 0, + LoginAsObserver, + LoginStealth + }; + enum ConnectionStatus { Disconnected = 0, @@ -76,19 +93,20 @@ namespace BlackCore public slots: // Network - virtual void setServer(const BlackMisc::Network::CServer &server) = 0; - virtual void setCallsign(const BlackMisc::Aviation::CCallsign &callsign) = 0; - virtual void setRealName(const QString &name) = 0; + virtual void presetServer(const BlackMisc::Network::CServer &server) = 0; + virtual void presetCallsign(const BlackMisc::Aviation::CCallsign &callsign) = 0; + virtual void presetIcaoCodes(const BlackMisc::Aviation::CAircraftIcao &icao) = 0; + virtual void presetLoginMode(LoginMode mode) = 0; virtual void initiateConnection() = 0; virtual void terminateConnection() = 0; - virtual void ping(const BlackMisc::Aviation::CCallsign &callsign) = 0; + virtual void sendPing(const BlackMisc::Aviation::CCallsign &callsign) = 0; virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; virtual void sendIpQuery() = 0; virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; // Text messages - virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &textMessages) = 0; + virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &messages) = 0; // ATC virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; @@ -96,7 +114,7 @@ namespace BlackCore // Aircraft virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; - virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) = 0; + virtual void sendAircraftInfoQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0; virtual void setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft) = 0; virtual void setOwnAircraftPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) = 0; @@ -105,8 +123,8 @@ namespace BlackCore const BlackMisc::Aviation::CTransponder &transponder) = 0; // Weather / flight plan - virtual void requestMetar(const QString &airportICAO) = 0; - virtual void requestWeatherData(const QString &airportICAO) = 0; + virtual void sendMetarQuery(const QString &airportICAO) = 0; + virtual void sendWeatherDataQuery(const QString &airportICAO) = 0; // TODO virtual void sendFlightPlan(...) = 0; signals: @@ -114,37 +132,37 @@ namespace BlackCore 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 atcQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, bool isATC); - void atisQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CInformationMessage &atis); - void atisQueryVoiceRoomReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &url); - void atisQueryLogoffTimeReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &zuluTime); - void metarReceived(const QString &data); + void atcReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, bool isATC); + void atisReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CInformationMessage &atis); + void atisVoiceRoomReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &url); + void atisLogoffTimeReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &zuluTime); + void metarReplyReceived(const QString &data); // Aircraft void pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign); - void aircraftInfoReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao); + void aircraftInfoReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icao); void aircraftPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CTransponder &transponder); // TODO void aircraftInterimPositionUpdate(...); - void frequencyQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq); + void frequencyReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &freq); // Connection / Network in general void statusMessage(const BlackMisc::CStatusMessage &message); void kicked(const QString &msg); void connectionStatusChanged(ConnectionStatus oldStatus, ConnectionStatus newStatus); - void pong(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime); - void capabilitiesQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags); - void ipQueryReplyReceived(const QString &ip); - void serverQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &hostname); - void nameQueryReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname); + void pongReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CTime &elapsedTime); + void capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags); + void ipReplyReceived(const QString &ip); + void serverReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &hostname); + void nameReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname); // Text messages void textMessagesReceived(const BlackMisc::Network::CTextMessageList &messages); // Weather - // TODO void temperatureDataReceived(...); - // TODO void windDataReceived(...); - // TODO void cloudDataReceived(...); + // TODO void temperatureDataReplyReceived(...); + // TODO void windDataReplyReceived(...); + // TODO void cloudDataReplyReceived(...); }; } // namespace diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index 39c556d06..4d6376311 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -28,19 +28,29 @@ namespace BlackCore void exceptionDispatcher(const char *caller); - CNetworkVatlib::CNetworkVatlib(CNetworkVatlib::LoginMode loginMode, QObject *parent) + CNetworkVatlib::CNetworkVatlib(QObject *parent) : INetwork(parent), - m_net(Cvatlib_Network::Create()), - m_loginMode(loginMode), + m_loginMode(LoginNormal), m_status(Cvatlib_Network::connStatus_Idle), m_fsdTextCodec(QTextCodec::codecForName("latin1")) { + connect(this, &CNetworkVatlib::terminate, this, &INetwork::terminateConnection, Qt::QueuedConnection); + + Q_ASSERT_X(m_fsdTextCodec, "CNetworkVatlib", "Missing default wire text encoding"); + //TODO reinit m_fsdTextCodec from WireTextEncoding config setting if present + + connect(&m_processingTimer, SIGNAL(timeout()), this, SLOT(process())); + connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(update())); + m_processingTimer.start(c_processingIntervalMsec); + } + + void CNetworkVatlib::initializeSession() + { + Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "attempted to reinitialize session while still connected"); + try { - connect(this, SIGNAL(terminate()), this, SLOT(terminateConnection()), Qt::QueuedConnection); - - Q_ASSERT_X(m_fsdTextCodec, "CNetworkVatlib", "Missing default wire text encoding"); - //TODO reinit m_fsdTextCodec from WireTextEncoding config setting if present + m_net.reset(Cvatlib_Network::Create()); QString capabilities; capabilities += m_net->capability_AtcInfo; @@ -49,7 +59,7 @@ namespace BlackCore capabilities += "=1:"; capabilities += m_net->capability_ModelDesc; capabilities += "=1"; - if (loginMode == LoginStealth) + if (m_loginMode == LoginStealth) { capabilities += "STEALTH"; // TODO m_net->capability_Stealth capabilities += "=1"; @@ -79,19 +89,17 @@ namespace BlackCore m_net->InstallOnCloudDataReceivedEvent(onCloudDataReceived, this); m_net->InstallOnPilotInfoRequestReceivedEvent(onPilotInfoRequestReceived, this); m_net->InstallOnPilotInfoReceivedEvent(onPilotInfoReceived, this); - - connect(&m_processingTimer, SIGNAL(timeout()), this, SLOT(process())); - connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(update())); - m_processingTimer.start(c_processingIntervalMsec); } catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } CNetworkVatlib::~CNetworkVatlib() { + if (!m_net) { return; } + try { - if (m_net->IsNetworkConnected()) + if (m_net->IsValid() && m_net->IsNetworkConnected()) { m_net->LogoffAndDisconnect(0); } @@ -106,6 +114,8 @@ namespace BlackCore void CNetworkVatlib::process() { + if (!m_net) { return; } + try { if (m_net->IsValid() && m_net->IsSessionExists()) @@ -118,6 +128,8 @@ namespace BlackCore void CNetworkVatlib::update() { + if (!m_net) { return; } + try { if (m_net->IsValid() && m_net->IsSessionExists() && isConnected()) @@ -176,11 +188,6 @@ namespace BlackCore return m_fsdTextCodec->toUnicode(cstr); } - bool CNetworkVatlib::isConnected() const - { - return m_status == Cvatlib_Network::connStatus_Connected; - } - void exceptionDispatcher(const char *caller) { try @@ -210,26 +217,30 @@ namespace BlackCore /********************************** INetwork slots ************************************/ /********************************** * * * * * * * * * * * * * * * * * * * ************************************/ - void CNetworkVatlib::setServer(const CServer &server) + void CNetworkVatlib::presetServer(const CServer &server) { Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change server details while still connected"); - this->m_server = server; + m_server = server; } - void CNetworkVatlib::setCallsign(const BlackMisc::Aviation::CCallsign &callsign) + void CNetworkVatlib::presetCallsign(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change callsign while still connected"); - - m_ownAircraft.setCallsign(callsign); + m_callsign = callsign; } - void CNetworkVatlib::setRealName(const QString &name) + void CNetworkVatlib::presetIcaoCodes(const BlackMisc::Aviation::CAircraftIcao &icao) { - Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change name while still connected"); + Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change ICAO codes while still connected"); + m_icaoCodes = icao; + } - auto pilot = m_ownAircraft.getPilot(); - pilot.setRealName(name); - m_ownAircraft.setPilot(pilot); + void CNetworkVatlib::presetLoginMode(LoginMode mode) + { + Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change login mode while still connected"); + m_loginMode = mode; + + m_net.reset(nullptr); } void CNetworkVatlib::initiateConnection() @@ -238,12 +249,17 @@ namespace BlackCore try { - m_status = Cvatlib_Network::connStatus_Connecting; // paranoia + if (!m_net) + { + initializeSession(); + } + + changeConnectionStatus(Cvatlib_Network::connStatus_Connecting); // paranoia QByteArray callsign = toFSD(m_loginMode == LoginAsObserver ? - m_ownAircraft.getCallsign().getAsObserverCallsignString() : - m_ownAircraft.getCallsign().asString()); - QByteArray name = toFSD(m_ownAircraft.getPilot().getRealName()); + m_callsign.getAsObserverCallsignString() : + m_callsign.asString()); + QByteArray name = toFSD(m_server.getUser().getRealName()); if (this->m_loginMode == LoginAsObserver) { @@ -319,6 +335,8 @@ namespace BlackCore void CNetworkVatlib::sendTextMessages(const BlackMisc::Network::CTextMessageList &messages) { + Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); + if (messages.isEmpty()) return; try { @@ -345,6 +363,8 @@ namespace BlackCore void CNetworkVatlib::sendIpQuery() { + Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); + try { m_net->SendInfoQuery(Cvatlib_Network::infoQuery_IP, "SERVER"); @@ -354,6 +374,8 @@ namespace BlackCore 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)); @@ -363,6 +385,8 @@ namespace BlackCore 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)); @@ -372,6 +396,8 @@ namespace BlackCore 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)); @@ -381,6 +407,8 @@ namespace BlackCore 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)); @@ -390,6 +418,8 @@ namespace BlackCore void CNetworkVatlib::sendNameQuery(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)); @@ -399,6 +429,8 @@ namespace BlackCore 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)); @@ -406,7 +438,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void CNetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) + void CNetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) // private { try { @@ -416,7 +448,7 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void CNetworkVatlib::replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign) + void CNetworkVatlib::replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign) // private { try { @@ -425,8 +457,10 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void CNetworkVatlib::requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) + void CNetworkVatlib::sendAircraftInfoQuery(const BlackMisc::Aviation::CCallsign &callsign) { + Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); + try { m_net->RequestPlaneInfo(toFSD(callsign)); @@ -434,25 +468,25 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void CNetworkVatlib::sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) + void CNetworkVatlib::sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign) // private { try { - const QByteArray acTypeICAObytes = toFSD(m_ownAircraft.getIcaoInfo().getDesignator()); - const QByteArray airlineICAObytes = toFSD(m_ownAircraft.getIcaoInfo().getAirline()); - const QByteArray liverybytes = toFSD(m_ownAircraft.getIcaoInfo().getLivery()); + const QByteArray acTypeICAObytes = toFSD(m_icaoCodes.getDesignator()); + const QByteArray airlineICAObytes = toFSD(m_icaoCodes.getAirline()); + const QByteArray liverybytes = toFSD(m_icaoCodes.getLivery()); std::vector keysValues; - if (!m_ownAircraft.getIcaoInfo().getDesignator().isEmpty()) + if (!m_icaoCodes.getDesignator().isEmpty()) { keysValues.push_back(m_net->acinfo_Equipment); keysValues.push_back(acTypeICAObytes); } - if (m_ownAircraft.getIcaoInfo().hasAirline()) + if (m_icaoCodes.hasAirline()) { keysValues.push_back(m_net->acinfo_Airline); keysValues.push_back(airlineICAObytes); } - if (m_ownAircraft.getIcaoInfo().hasLivery()) + if (m_icaoCodes.hasLivery()) { keysValues.push_back(m_net->acinfo_Livery); keysValues.push_back(liverybytes); @@ -463,8 +497,10 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void CNetworkVatlib::ping(const BlackMisc::Aviation::CCallsign &callsign) + 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)); @@ -472,8 +508,10 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void CNetworkVatlib::requestMetar(const QString &airportICAO) + void CNetworkVatlib::sendMetarQuery(const QString &airportICAO) { + Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); + try { m_net->RequestMetar(toFSD(airportICAO)); @@ -481,8 +519,10 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } - void CNetworkVatlib::requestWeatherData(const QString &airportICAO) + void CNetworkVatlib::sendWeatherDataQuery(const QString &airportICAO) { + Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); + try { m_net->RequestWeatherData(toFSD(airportICAO)); @@ -600,12 +640,12 @@ namespace BlackCore void CNetworkVatlib::onPong(Cvatlib_Network *, const char *callsign, INT elapsedTime, void *cbvar) { - emit cbvar_cast(cbvar)->pong(cbvar_cast(cbvar)->fromFSD(callsign), CTime(elapsedTime, CTimeUnit::s())); + emit cbvar_cast(cbvar)->pongReceived(cbvar_cast(cbvar)->fromFSD(callsign), CTime(elapsedTime, CTimeUnit::s())); } void CNetworkVatlib::onMetarReceived(Cvatlib_Network *, const char *data, void *cbvar) { - emit cbvar_cast(cbvar)->metarReceived(cbvar_cast(cbvar)->fromFSD(data)); + 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) @@ -630,11 +670,11 @@ namespace BlackCore { switch (type) { - case Cvatlib_Network::infoQuery_Freq: emit cbvar_cast(cbvar)->frequencyQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), CFrequency(cbvar_cast(cbvar)->fromFSD(data).toFloat(), CFrequencyUnit::MHz())); break; - case Cvatlib_Network::infoQuery_Server: emit cbvar_cast(cbvar)->serverQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); break; - case Cvatlib_Network::infoQuery_ATC: emit cbvar_cast(cbvar)->atcQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(data2), *data == 'Y'); break; - case Cvatlib_Network::infoQuery_Name: emit cbvar_cast(cbvar)->nameQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); break; - case Cvatlib_Network::infoQuery_IP: emit cbvar_cast(cbvar)->ipQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(data)); break; + 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)->nameReplyReceived(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; } } @@ -653,7 +693,7 @@ namespace BlackCore } keysValues += 2; } - emit cbvar_cast(cbvar)->capabilitiesQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), flags); + 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) @@ -662,17 +702,17 @@ namespace BlackCore if (lineType == Cvatlib_Network::atisLineType_VoiceRoom) { - emit cbvar_cast(cbvar)->atisQueryVoiceRoomReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); + 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)->atisQueryLogoffTimeReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(data)); + 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)->atisQueryReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), atis); + emit cbvar_cast(cbvar)->atisReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), atis); cbvar_cast(cbvar)->m_atisParts.remove(cbvar_cast(cbvar)->fromFSD(callsign)); } else @@ -734,7 +774,7 @@ namespace BlackCore terminate: emit cbvar_cast(cbvar)->statusMessage(BlackMisc::CStatusMessage(BlackMisc::CStatusMessage::TypeTrafficNetwork, BlackMisc::CStatusMessage::SeverityError, msg)); - emit cbvar_cast(cbvar)->terminate(); + emit cbvar_cast(cbvar)->terminate(); // private, will be handled during the next pass of the Qt event loop } void CNetworkVatlib::onWindDataReceived(Cvatlib_Network *, Cvatlib_Network::WindLayer /** layers **/[4], void * /** cbvar **/) @@ -769,7 +809,7 @@ namespace BlackCore else if (key == net->acinfo_Livery) { icao.setLivery(*keysValues); } keysValues++; } - emit cbvar_cast(cbvar)->aircraftInfoReceived(cbvar_cast(cbvar)->fromFSD(callsign), icao); + emit cbvar_cast(cbvar)->aircraftInfoReplyReceived(cbvar_cast(cbvar)->fromFSD(callsign), icao); } } // namespace diff --git a/src/blackcore/network_vatlib.h b/src/blackcore/network_vatlib.h index e30be0c0b..bf525a04e 100644 --- a/src/blackcore/network_vatlib.h +++ b/src/blackcore/network_vatlib.h @@ -27,40 +27,36 @@ namespace BlackCore Q_OBJECT public: - enum LoginMode - { - LoginNormal = 0, - LoginAsObserver, - LoginStealth - }; - - CNetworkVatlib(LoginMode loginMode = LoginNormal, QObject *parent = nullptr); + CNetworkVatlib(QObject *parent = nullptr); virtual ~CNetworkVatlib(); - bool isConnected() const; + bool isConnected() const { return m_status == Cvatlib_Network::connStatus_Connected; } public: // INetwork slots overrides // Network - virtual void setServer(const BlackMisc::Network::CServer &server); - virtual void setCallsign(const BlackMisc::Aviation::CCallsign &callsign); - virtual void setRealName(const QString &name); + virtual void presetServer(const BlackMisc::Network::CServer &server); + virtual void presetCallsign(const BlackMisc::Aviation::CCallsign &callsign); + virtual void presetIcaoCodes(const BlackMisc::Aviation::CAircraftIcao &icao); + virtual void presetLoginMode(LoginMode mode); virtual void initiateConnection(); virtual void terminateConnection(); + virtual void sendPing(const BlackMisc::Aviation::CCallsign &callsign); + + virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign); virtual void sendIpQuery(); virtual void sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign); - virtual void sendNameQuery(const BlackMisc::Aviation::CCallsign &callsign); - virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign); - virtual void ping(const BlackMisc::Aviation::CCallsign &callsign); - - // Weather - virtual void requestWeatherData(const QString &airportICAO); // Text messages virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &messages); + // ATC + virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign); + virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign); + // Aircraft - virtual void requestAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign); + virtual void sendCapabilitiesQuery(const BlackMisc::Aviation::CCallsign &callsign); + virtual void sendAircraftInfoQuery(const BlackMisc::Aviation::CCallsign &callsign); virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign); virtual void setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft); virtual void setOwnAircraftPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude); @@ -68,10 +64,9 @@ namespace BlackCore virtual void setOwnAircraftAvionics(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &xpdr); - // ATC - virtual void sendAtcQuery(const BlackMisc::Aviation::CCallsign &callsign); - virtual void sendAtisQuery(const BlackMisc::Aviation::CCallsign &callsign); - virtual void requestMetar(const QString &airportICAO); + // Weather + virtual void sendMetarQuery(const QString &airportICAO); + virtual void sendWeatherDataQuery(const QString &airportICAO); private slots: void replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign); @@ -105,6 +100,7 @@ namespace BlackCore QByteArray toFSD(QString qstr) const; QByteArray toFSD(const BlackMisc::Aviation::CCallsign &callsign) const; QString fromFSD(const char *cstr) const; + void initializeSession(); bool isDisconnected() const { return m_status != Cvatlib_Network::connStatus_Connecting && m_status != Cvatlib_Network::connStatus_Connected; } private slots: @@ -127,7 +123,9 @@ namespace BlackCore LoginMode m_loginMode; Cvatlib_Network::connStatus m_status; BlackMisc::Network::CServer m_server; - BlackMisc::Aviation::CAircraft m_ownAircraft; + BlackMisc::Aviation::CCallsign m_callsign; + BlackMisc::Aviation::CAircraftIcao m_icaoCodes; + 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; diff --git a/tests/blackcore/testnetwork.cpp b/tests/blackcore/testnetwork.cpp index 3dc24cf45..1db3e1441 100644 --- a/tests/blackcore/testnetwork.cpp +++ b/tests/blackcore/testnetwork.cpp @@ -15,38 +15,42 @@ using namespace BlackMisc::PhysicalQuantities; void BlackCoreTest::CTestNetwork::networkTest(BlackCore::INetwork *net) { + QString string = net->connectionStatusToString(INetwork::Connected); + QVERIFY(string == "Connected"); + Expect e(net); EXPECT_UNIT(e) - .send(&INetwork::setServer, CServer("", "", "vatsim-germany.org", 6809, CUser("guest", "", "", "guest"))) - .send(&INetwork::setCallsign, "BLACK") + .send(&INetwork::presetServer, CServer("", "", "vatsim-germany.org", 6809, CUser("guest", "", "", "guest"))) + .send(&INetwork::presetCallsign, "BLACK") + .send(&INetwork::presetIcaoCodes, CAircraftIcao("C172", "P1L", "YYY", "YYY", "white")) .send(&INetwork::initiateConnection) .expect(&INetwork::connectionStatusChanged, [](INetwork::ConnectionStatus, INetwork::ConnectionStatus newStatus) { QVERIFY(newStatus == INetwork::Connecting); qDebug() << "CONNECTING"; - } - ).expect(&INetwork::connectionStatusChanged, [](INetwork::ConnectionStatus, INetwork::ConnectionStatus newStatus) + }) + .expect(&INetwork::connectionStatusChanged, [](INetwork::ConnectionStatus, INetwork::ConnectionStatus newStatus) { QVERIFY(newStatus == INetwork::Connected); qDebug() << "CONNECTED"; - } - ).wait(10); + }) + .wait(10); EXPECT_UNIT(e) - .send(&INetwork::ping, "server") - .expect(&INetwork::pong, [](CCallsign callsign, PhysicalQuantities::CTime elapsedTime) + .send(&INetwork::sendPing, "server") + .expect(&INetwork::pongReceived, [](CCallsign callsign, PhysicalQuantities::CTime elapsedTime) { qDebug() << "PONG" << callsign << elapsedTime; - } - ).wait(10); + }) + .wait(10); EXPECT_UNIT(e) .send(&INetwork::terminateConnection) - .expect(&INetwork::connectionStatusChanged, [](INetwork::ConnectionStatus s) + .expect(&INetwork::connectionStatusChanged, [](INetwork::ConnectionStatus, INetwork::ConnectionStatus newStatus) { - QVERIFY(s == INetwork::Disconnected); + QVERIFY(newStatus == INetwork::Disconnected); qDebug() << "DISCONNECTED"; - } - ).wait(10); + }) + .wait(10); }