refs #274, pending connection state detection and disallowing further connection states while pending

This commit is contained in:
Klaus Basan
2014-06-17 23:12:32 +02:00
parent 427dd83a6a
commit ca8cbc4a0a
4 changed files with 57 additions and 11 deletions

View File

@@ -33,7 +33,8 @@ namespace BlackCore
* Init this context * Init this context
*/ */
CContextNetwork::CContextNetwork(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : CContextNetwork::CContextNetwork(CRuntimeConfig::ContextMode mode, CRuntime *runtime) :
IContextNetwork(mode, runtime), m_airspace(nullptr), m_network(nullptr), m_vatsimBookingReader(nullptr), m_vatsimDataFileReader(nullptr), m_dataUpdateTimer(nullptr) IContextNetwork(mode, runtime), m_airspace(nullptr), m_network(nullptr), m_currentStatus(INetwork::Disconnected),
m_vatsimBookingReader(nullptr), m_vatsimDataFileReader(nullptr), m_dataUpdateTimer(nullptr)
{ {
Q_ASSERT(this->getRuntime()); Q_ASSERT(this->getRuntime());
Q_ASSERT(this->getRuntime()->getIContextSettings()); Q_ASSERT(this->getRuntime()->getIContextSettings());
@@ -104,16 +105,21 @@ namespace BlackCore
{ {
msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityWarning, "Invalid ICAO data for own aircraft")); msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityWarning, "Invalid ICAO data for own aircraft"));
} }
else if (this->m_network->isConnected())
{
msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityWarning, "Already connected"));
}
else if (!CNetworkUtils::canConnect(currentServer, msg, 2000)) else if (!CNetworkUtils::canConnect(currentServer, msg, 2000))
{ {
msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityError, msg)); msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityError, msg));
} }
else if (this->m_network->isConnected())
{
msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityWarning, "Already connected"));
}
else if (this->isPendingConnection())
{
msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityWarning, "Pending connection, please wait"));
}
else else
{ {
this->m_currentStatus = INetwork::Connecting; // as semaphore we are going to connect
INetwork::LoginMode mode = static_cast<INetwork::LoginMode>(loginMode); INetwork::LoginMode mode = static_cast<INetwork::LoginMode>(loginMode);
this->getIContextOwnAircraft()->updatePilot(currentServer.getUser(), this->getPathAndContextId()); this->getIContextOwnAircraft()->updatePilot(currentServer.getUser(), this->getPathAndContextId());
const CAircraft ownAircraft = this->ownAircraft(); const CAircraft ownAircraft = this->ownAircraft();
@@ -139,10 +145,15 @@ namespace BlackCore
CStatusMessageList msgs; CStatusMessageList msgs;
if (this->m_network->isConnected()) if (this->m_network->isConnected())
{ {
this->m_currentStatus = INetwork::Disconnecting; // as semaphore we are going to disconnect
this->m_network->terminateConnection(); this->m_network->terminateConnection();
this->m_airspace->clear(); this->m_airspace->clear();
msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityInfo, "Connection terminating")); msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityInfo, "Connection terminating"));
} }
else if (this->isPendingConnection())
{
msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityWarning, "Pending connection, please wait"));
}
else else
{ {
msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityWarning, "Already disconnected")); msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, CStatusMessage::SeverityWarning, "Already disconnected"));
@@ -159,6 +170,15 @@ namespace BlackCore
return this->m_network->isConnected(); return this->m_network->isConnected();
} }
bool CContextNetwork::isPendingConnection() const
{
// if underlying class says pending, we believe it. But not all states (e.g. disconnecting) are covered
if (this->m_network->isPendingConnection()) return true;
// now check out own extra states, e.g. disconnecting
return INetwork::isPendingStatus(this->m_currentStatus);
}
/* /*
* Send text messages * Send text messages
*/ */
@@ -236,6 +256,7 @@ namespace BlackCore
void CContextNetwork::psFsdConnectionStatusChanged(INetwork::ConnectionStatus from, INetwork::ConnectionStatus to, const QString &message) void CContextNetwork::psFsdConnectionStatusChanged(INetwork::ConnectionStatus from, INetwork::ConnectionStatus to, const QString &message)
{ {
this->getRuntime()->logSlot(c_logContext, Q_FUNC_INFO, { QString::number(from), QString::number(to) }); this->getRuntime()->logSlot(c_logContext, Q_FUNC_INFO, { QString::number(from), QString::number(to) });
this->m_currentStatus = to;
CStatusMessageList msgs; CStatusMessageList msgs;
// send 1st position // send 1st position
if (to == INetwork::Connected) if (to == INetwork::Connected)
@@ -252,6 +273,7 @@ namespace BlackCore
msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork, msgs.push_back(CStatusMessage(CStatusMessage::TypeTrafficNetwork,
to == INetwork::DisconnectedError ? CStatusMessage::SeverityError : CStatusMessage::SeverityInfo, m)); to == INetwork::DisconnectedError ? CStatusMessage::SeverityError : CStatusMessage::SeverityInfo, m));
// FIXME (MS) conditional increases the number of scenarios which must be considered and continuously tested // FIXME (MS) conditional increases the number of scenarios which must be considered and continuously tested
// This is more a guard than a real conditional, e.g. when system shuts down
if (this->getIContextApplication()) if (this->getIContextApplication())
{ {
this->getIContextApplication()->sendStatusMessages(msgs); this->getIContextApplication()->sendStatusMessages(msgs);

View File

@@ -72,6 +72,13 @@ namespace BlackCore
//! \copydoc IContextNetwork::isConnected() //! \copydoc IContextNetwork::isConnected()
virtual bool isConnected() const override; virtual bool isConnected() const override;
/*!
* In transition state, e.g. connecting, disconnecting.
* \details In such a state it is advisable to wait until an end state (connected/disconnected) is reached
* \remarks Intentionally only running locally, not in interface
*/
bool isPendingConnection() const;
//! \copydoc IContextNetwork::sendTextMessages() //! \copydoc IContextNetwork::sendTextMessages()
virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &textMessages) override; virtual void sendTextMessages(const BlackMisc::Network::CTextMessageList &textMessages) override;
@@ -128,6 +135,7 @@ namespace BlackCore
CAirspaceMonitor *m_airspace; CAirspaceMonitor *m_airspace;
BlackCore::INetwork *m_network; BlackCore::INetwork *m_network;
INetwork::ConnectionStatus m_currentStatus; //!< used to detect pending connections
// for reading XML and VATSIM data files // for reading XML and VATSIM data files
CVatsimBookingReader *m_vatsimBookingReader; CVatsimBookingReader *m_vatsimBookingReader;

View File

@@ -117,11 +117,24 @@ namespace BlackCore
return status == DisconnectedError; return status == DisconnectedError;
} }
/*!
* Returns true if the given ConnectionStatus represents a pending state.
*/
static bool isPendingStatus(ConnectionStatus status)
{
return status == Disconnecting || status == Connecting;
}
/*! /*!
* Returns true if the current ConnectionStatus is a connected state. * Returns true if the current ConnectionStatus is a connected state.
*/ */
virtual bool isConnected() const = 0; virtual bool isConnected() const = 0;
/*!
* Returns true if the current ConnectionStatus is in transition, e.g. connecting.
*/
virtual bool isPendingConnection() const = 0;
/*! /*!
* Returns a list of URLs where network status data can be found. * 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. * To obtain the status, one of these URLs should be picked at random.
@@ -226,8 +239,8 @@ namespace BlackCore
virtual void sendCustomPacket(const BlackMisc::Aviation::CCallsign &callsign, const QString &packetId, const QStringList &data) = 0; virtual void sendCustomPacket(const BlackMisc::Aviation::CCallsign &callsign, const QString &packetId, const QStringList &data) = 0;
/*! /*!
* Send an FSInn custom packet. * Send a FSInn custom packet.
* \details FSIPI(R) queries * \details FSIPI(R) queries, some example data below:
* <BLOCKQUOTE> * <BLOCKQUOTE>
* index 0 .. 0/1 ??? * index 0 .. 0/1 ???
* 1 .. MQT, GEC, DLH -> Airline ICAO, most of the time empty * 1 .. MQT, GEC, DLH -> Airline ICAO, most of the time empty
@@ -242,9 +255,9 @@ namespace BlackCore
*/ */
//! @{ //! @{
virtual void sendFsipiCustomPacket(const BlackMisc::Aviation::CCallsign &callsign, const QString &airlineDesignator, virtual void sendFsipiCustomPacket(const BlackMisc::Aviation::CCallsign &callsign, const QString &airlineDesignator,
const QString &aircraftDesignator, const QString &combinedType, const QString &modelString) = 0; const QString &aircraftDesignator, const QString &combinedType, const QString &modelString) = 0;
virtual void sendFsipirCustomPacket(const BlackMisc::Aviation::CCallsign &callsign, const QString &airlineDesignator, virtual void sendFsipirCustomPacket(const BlackMisc::Aviation::CCallsign &callsign, const QString &airlineDesignator,
const QString &aircraftDesignator, const QString &combinedType, const QString &modelString) = 0; const QString &aircraftDesignator, const QString &combinedType, const QString &modelString) = 0;
//! @} //! @}
//! @} //! @}
@@ -509,13 +522,13 @@ namespace BlackCore
* We received an FSInn custom packet. * We received an FSInn custom packet.
*/ */
void fsipiCustomPacketReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &airlineDesignator, void fsipiCustomPacketReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &airlineDesignator,
const QString &aircraftDesignator, const QString &combinedType, const QString &modelString); const QString &aircraftDesignator, const QString &combinedType, const QString &modelString);
/*! /*!
* We received an FSInn custom response packet. * We received an FSInn custom response packet.
*/ */
void fsipirCustomPacketReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &airlineDesignator, void fsipirCustomPacketReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &airlineDesignator,
const QString &aircraftDesignator, const QString &combinedType, const QString &modelString); const QString &aircraftDesignator, const QString &combinedType, const QString &modelString);
//! @} //! @}
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////

View File

@@ -34,6 +34,9 @@ namespace BlackCore
//! \copydoc INetwork::isConnected() //! \copydoc INetwork::isConnected()
virtual bool isConnected() const override { return m_status == Cvatlib_Network::connStatus_Connected; } virtual bool isConnected() const override { return m_status == Cvatlib_Network::connStatus_Connected; }
//! \copydoc INetwork::pendingConnection()
virtual bool isPendingConnection() const override { return m_status == Cvatlib_Network::connStatus_Connecting; }
//! \copydoc INetwork::getStatusUrls() //! \copydoc INetwork::getStatusUrls()
virtual QList<QUrl> getStatusUrls() const override; virtual QList<QUrl> getStatusUrls() const override;