From 7e3958722655da73ad395529039ad850dc1a2a44 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 24 Feb 2015 14:53:40 +0100 Subject: [PATCH] Passing connection status to airspace monitor. When the network connection is terminated, airspace monitor can still recevice pending signals from vatlib. Those have to be ignored. Otherwise it can happen aircraft (.. etc.) are added again to airspace, which gives inconsistent results. --- src/blackcore/airspace_monitor.cpp | 30 ++++++++++++++++++++------ src/blackcore/airspace_monitor.h | 4 ++++ src/blackcore/context_network_impl.cpp | 3 ++- 3 files changed, 29 insertions(+), 8 deletions(-) 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())