From ff3010931f36b4b338a82cb050e98e68a29c420a Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sun, 19 Jan 2014 03:09:39 +0000 Subject: [PATCH] connection status improvement, now we also check the return value of ConnectAndLogon refs #101 --- src/blackcore/network.h | 5 +++ src/blackcore/network_vatlib.cpp | 71 +++++++++++++++++++++----------- src/blackcore/network_vatlib.h | 1 + 3 files changed, 54 insertions(+), 23 deletions(-) diff --git a/src/blackcore/network.h b/src/blackcore/network.h index de79377dc..cad7657ef 100644 --- a/src/blackcore/network.h +++ b/src/blackcore/network.h @@ -89,6 +89,11 @@ namespace BlackCore return metaEnum.valueToKey(status); } + static bool isErrorStatus(ConnectionStatus status) + { + return status == DisconnectedError; + } + virtual bool isConnected() const = 0; public slots: diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index 4d6376311..bc6d0e582 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -101,7 +101,7 @@ namespace BlackCore { if (m_net->IsValid() && m_net->IsNetworkConnected()) { - m_net->LogoffAndDisconnect(0); + m_net->LogoffAndDisconnect(0); // emits a connectionStatusChanged signal } } catch (...) { exceptionDispatcher(Q_FUNC_INFO); } @@ -173,6 +173,34 @@ namespace BlackCore catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } + INetwork::ConnectionStatus convertConnectionStatus(Cvatlib_Network::connStatus status) + { + switch (status) + { + case Cvatlib_Network::connStatus_Idle: return INetwork::Disconnected; + case Cvatlib_Network::connStatus_Connecting: return INetwork::Connecting; + case Cvatlib_Network::connStatus_Connected: return INetwork::Connected; + case Cvatlib_Network::connStatus_Disconnected: return INetwork::Disconnected; + case Cvatlib_Network::connStatus_Error: return INetwork::DisconnectedError; + } + qFatal("unrecognised connection status"); + return INetwork::DisconnectedError; + } + + void CNetworkVatlib::changeConnectionStatus(Cvatlib_Network::connStatus status) + { + if (m_status != status) + { + qSwap(m_status, status); + emit connectionStatusChanged(convertConnectionStatus(status), convertConnectionStatus(m_status)); + + if (isDisconnected()) + { + m_updateTimer.stop(); + } + } + } + QByteArray CNetworkVatlib::toFSD(QString qstr) const { return m_fsdTextCodec->fromUnicode(qstr); @@ -286,15 +314,22 @@ namespace BlackCore toFSD(m_server.getUser().getPassword()), info); } - m_net->ConnectAndLogon(); - if (! m_updateTimer.isActive()) + + if (m_net->ConnectAndLogon()) { - m_updateTimer.start(c_updateIntervalMsec); + if (! m_updateTimer.isActive()) + { + m_updateTimer.start(c_updateIntervalMsec); + } + } + else + { + changeConnectionStatus(Cvatlib_Network::connStatus_Error); } } catch (...) { - m_status = Cvatlib_Network::connStatus_Idle; + changeConnectionStatus(Cvatlib_Network::connStatus_Error); exceptionDispatcher(Q_FUNC_INFO); } } @@ -304,7 +339,11 @@ namespace BlackCore try { m_updateTimer.stop(); - m_net->LogoffAndDisconnect(c_logoffTimeoutSec); + + if (m_net && m_net->IsValid() && m_net->IsNetworkConnected()) + { + m_net->LogoffAndDisconnect(c_logoffTimeoutSec); + } } catch (...) { exceptionDispatcher(Q_FUNC_INFO); } } @@ -539,24 +578,9 @@ namespace BlackCore return static_cast(cbvar); } - CNetworkVatlib::ConnectionStatus convertConnectionStatus(Cvatlib_Network::connStatus status) + void CNetworkVatlib::onConnectionStatusChanged(Cvatlib_Network *, Cvatlib_Network::connStatus, Cvatlib_Network::connStatus newStatus, void *cbvar) { - switch (status) - { - case Cvatlib_Network::connStatus_Idle: return CNetworkVatlib::Disconnected; - case Cvatlib_Network::connStatus_Connecting: return CNetworkVatlib::Connecting; - case Cvatlib_Network::connStatus_Connected: return CNetworkVatlib::Connected; - case Cvatlib_Network::connStatus_Disconnected: return CNetworkVatlib::Disconnected; - case Cvatlib_Network::connStatus_Error: return CNetworkVatlib::DisconnectedError; - } - qFatal("unrecognised connection status"); - return CNetworkVatlib::DisconnectedError; - } - - void CNetworkVatlib::onConnectionStatusChanged(Cvatlib_Network *, Cvatlib_Network::connStatus oldStatus, Cvatlib_Network::connStatus newStatus, void *cbvar) - { - cbvar_cast(cbvar)->m_status = newStatus; - emit cbvar_cast(cbvar)->connectionStatusChanged(convertConnectionStatus(oldStatus), convertConnectionStatus(newStatus)); + cbvar_cast(cbvar)->changeConnectionStatus(newStatus); } void CNetworkVatlib::onTextMessageReceived(Cvatlib_Network *, const char *from, const char *to, const char *msg, void *cbvar) @@ -636,6 +660,7 @@ namespace BlackCore void CNetworkVatlib::onKicked(Cvatlib_Network *, const char *reason, void *cbvar) { emit cbvar_cast(cbvar)->kicked(cbvar_cast(cbvar)->fromFSD(reason)); + emit cbvar_cast(cbvar)->terminate(); } void CNetworkVatlib::onPong(Cvatlib_Network *, const char *callsign, INT elapsedTime, void *cbvar) diff --git a/src/blackcore/network_vatlib.h b/src/blackcore/network_vatlib.h index bf525a04e..44b16d7d3 100644 --- a/src/blackcore/network_vatlib.h +++ b/src/blackcore/network_vatlib.h @@ -101,6 +101,7 @@ namespace BlackCore QByteArray toFSD(const BlackMisc::Aviation::CCallsign &callsign) const; QString fromFSD(const char *cstr) const; void initializeSession(); + void changeConnectionStatus(Cvatlib_Network::connStatus newStatus); bool isDisconnected() const { return m_status != Cvatlib_Network::connStatus_Connecting && m_status != Cvatlib_Network::connStatus_Connected; } private slots: