diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index 7dd956eb3..2a795c363 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -352,10 +352,19 @@ namespace BlackCore removeAllOtherClients(); } + void CAirspaceMonitor::setConnected(bool connected) + { + this->m_connected = connected; + if (!connected) + { + this->clear(); + } + } + void CAirspaceMonitor::ps_realNameReplyReceived(const CCallsign &callsign, const QString &realname) { Q_ASSERT(this->m_vatsimDataFileReader); - if (realname.isEmpty()) { return; } + if (!this->m_connected || realname.isEmpty()) { return; } CPropertyIndexVariantMap vm({CAtcStation::IndexController, CUser::IndexRealName}, realname); this->m_atcStationsOnline.applyIf(&CAtcStation::getCallsign, callsign, vm); this->m_atcStationsBooked.applyIf(&CAtcStation::getCallsign, callsign, vm); @@ -376,7 +385,7 @@ namespace BlackCore void CAirspaceMonitor::ps_capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags) { - if (callsign.isEmpty()) { return; } + if (!this->m_connected || callsign.isEmpty()) { return; } CPropertyIndexVariantMap capabilities; capabilities.addValue(CClient::FsdAtisCanBeReceived, (flags & INetwork::AcceptsAtisResponses)); capabilities.addValue(CClient::FsdWithInterimPositions, (flags & INetwork::SupportsInterimPosUpdates)); @@ -398,7 +407,7 @@ namespace BlackCore void CAirspaceMonitor::ps_fsipirCustomPacketReceived(const CCallsign &callsign, const QString &airlineIcao, const QString &aircraftDesignator, const QString &combinedAircraftType, const QString &model) { - if (callsign.isEmpty() || model.isEmpty()) { return; } + if (!this->m_connected || callsign.isEmpty() || model.isEmpty()) { return; } // Request of other client, I can get the other's model from that CPropertyIndexVariantMap vm({ CClient::IndexModel, CAircraftModel::IndexModelString }, model); @@ -433,7 +442,7 @@ namespace BlackCore void CAirspaceMonitor::ps_serverReplyReceived(const CCallsign &callsign, const QString &server) { - if (callsign.isEmpty() || server.isEmpty()) { return; } + if (!this->m_connected || callsign.isEmpty() || server.isEmpty()) { return; } if (!this->m_otherClients.contains(&CClient::getCallsign, callsign)) { this->m_otherClients.push_back(CClient(callsign)); } CPropertyIndexVariantMap vm(CClient::IndexServer, server); this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm); @@ -441,7 +450,7 @@ namespace BlackCore void CAirspaceMonitor::ps_metarReceived(const QString &metarMessage) { - if (metarMessage.length() < 10) return; // invalid + if (!this->m_connected || metarMessage.length() < 10) return; // invalid const QString icaoCode = metarMessage.left(4).toUpper(); const QString icaoCodeTower = icaoCode + "_TWR"; CCallsign callsignTower(icaoCodeTower); @@ -465,6 +474,7 @@ namespace BlackCore void CAirspaceMonitor::sendFsipiCustomPacket(const CCallsign &recipientCallsign) const { + if (!this->m_connected) { return; } CAircraftIcao icao = ownAircraft().getIcaoInfo(); QString modelString = ownAircraft().getModel().getModelString(); if (modelString.isEmpty()) { modelString = CProject::systemNameAndVersion(); } @@ -473,6 +483,7 @@ namespace BlackCore void CAirspaceMonitor::sendFsipirCustomPacket(const CCallsign &recipientCallsign) const { + if (!this->m_connected) { return; } CAircraftIcao icao = ownAircraft().getIcaoInfo(); QString modelString = ownAircraft().getModel().getModelString(); if (modelString.isEmpty()) { modelString = CProject::systemNameAndVersion(); } @@ -553,7 +564,7 @@ namespace BlackCore void CAirspaceMonitor::ps_sendReadyForModelMatching(const CCallsign &callsign, int trial) { // some checks for special conditions, e.g. logout -> empty list, but still signals pending - if (this->m_aircraftInRange.isEmpty()) { return; } + if (!this->m_connected || this->m_aircraftInRange.isEmpty()) { return; } if (!this->m_aircraftInRange.containsCallsign(callsign)) { return; } // build simulated aircraft and crosscheck if all data are available @@ -583,6 +594,7 @@ namespace BlackCore void CAirspaceMonitor::ps_atcPositionUpdate(const CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency, const CCoordinateGeodetic &position, const BlackMisc::PhysicalQuantities::CLength &range) { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); + if (!this->m_connected) { return; } CAtcStationList stationsWithCallsign = this->m_atcStationsOnline.findByCallsign(callsign); if (stationsWithCallsign.isEmpty()) { @@ -644,7 +656,7 @@ namespace BlackCore void CAirspaceMonitor::ps_atisReceived(const CCallsign &callsign, const CInformationMessage &atisMessage) { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); - if (callsign.isEmpty()) return; + if (!this->m_connected || callsign.isEmpty()) return; CPropertyIndexVariantMap vm(CAtcStation::IndexAtis, atisMessage.toCVariant()); int changedOnline = this->m_atcStationsOnline.applyIf(&CAtcStation::getCallsign, callsign, vm); @@ -658,6 +670,7 @@ namespace BlackCore void CAirspaceMonitor::ps_atisVoiceRoomReceived(const CCallsign &callsign, const QString &url) { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); + if (!this->m_connected) { return; } QString trimmedUrl = url.trimmed(); CPropertyIndexVariantMap vm({ CAtcStation::IndexVoiceRoom, CVoiceRoom::IndexUrl }, trimmedUrl); int changedOnline = this->m_atcStationsOnline.applyIf(&CAtcStation::getCallsign, callsign, vm, true); @@ -684,6 +697,7 @@ namespace BlackCore void CAirspaceMonitor::ps_atisLogoffTimeReceived(const CCallsign &callsign, const QString &zuluTime) { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); + if (!this->m_connected) { return; } if (zuluTime.length() == 4) { // Logic to set logoff time @@ -708,6 +722,7 @@ namespace BlackCore { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); Q_ASSERT(!callsign.isEmpty()); + if (!this->m_connected) { return; } // update CPropertyIndexVariantMap vm(CAircraft::IndexIcao, icaoData.toCVariant()); @@ -735,6 +750,7 @@ namespace BlackCore void CAirspaceMonitor::ps_aircraftUpdateReceived(const CCallsign &callsign, const CAircraftSituation &situation, const CTransponder &transponder) { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); + if (!this->m_connected) { return; } // store situation history CAircraftSituation situationWithCallsign(situation); diff --git a/src/blackcore/airspace_monitor.h b/src/blackcore/airspace_monitor.h index 062bb62d0..1a4c6e6e0 100644 --- a/src/blackcore/airspace_monitor.h +++ b/src/blackcore/airspace_monitor.h @@ -99,6 +99,9 @@ namespace BlackCore //! Clear the contents void clear(); + //! Connection status + void setConnected(bool connected); + //! Request to update other clients' data from the network void requestDataUpdates(); @@ -173,6 +176,7 @@ namespace BlackCore CAirspaceWatchdog m_atcWatchdog; CAirspaceWatchdog m_aircraftWatchdog; bool m_serverSupportsNameQuery = false; //!< not all servers support name query + bool m_connected = false; //!< retrieve data // TODO FIXME (MS) should be in INetwork void sendFsipiCustomPacket(const BlackMisc::Aviation::CCallsign &recipientCallsign) const; diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index 7c2322c5f..f0fe299c4 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -167,6 +167,7 @@ namespace BlackCore else { this->m_currentStatus = INetwork::Connecting; // as semaphore we are going to connect + this->m_airspace->setConnected(true); INetwork::LoginMode mode = static_cast(loginMode); this->getIContextOwnAircraft()->updatePilot(server.getUser()); const CAircraft ownAircraft = this->ownAircraft(); @@ -186,7 +187,7 @@ namespace BlackCore { this->m_currentStatus = INetwork::Disconnecting; // as semaphore we are going to disconnect this->m_network->terminateConnection(); - this->m_airspace->clear(); + this->m_airspace->setConnected(false); return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityInfo, "Connection terminating"); } else if (this->isPendingConnection())