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.
This commit is contained in:
Klaus Basan
2015-02-24 14:53:40 +01:00
parent 688b89e313
commit 7e39587226
3 changed files with 29 additions and 8 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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<INetwork::LoginMode>(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())