From 8e732b1ad6d3919477d0934f1593a723643878fd Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sat, 22 Mar 2014 17:50:10 +0000 Subject: [PATCH] refs #179 added ConnectionStatus enum values DisconnectedFailed and DisconnectedLost added extra argument to connectionStatusChanged signal, containing the socket error message --- src/blackcore/network.h | 4 ++- src/blackcore/network_vatlib.cpp | 60 ++++++++++++++++++++++++++++---- src/blackcore/network_vatlib.h | 3 +- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/blackcore/network.h b/src/blackcore/network.h index 016e6efdd..2f5100041 100644 --- a/src/blackcore/network.h +++ b/src/blackcore/network.h @@ -91,6 +91,8 @@ namespace BlackCore Disconnected = 0, //!< Not connected Disconnecting, //!< In transition to disconnected DisconnectedError, //!< Disconnected due to socket error + DisconnectedFailed, //!< A connection was not established due to socket error + DisconnectedLost, //!< Connection lost due to socket error Connecting, //!< Connection initiated but not established Connected //!< Connection established }; @@ -387,7 +389,7 @@ namespace BlackCore /*! * The status of our connection has changed. */ - void connectionStatusChanged(ConnectionStatus oldStatus, ConnectionStatus newStatus); + void connectionStatusChanged(ConnectionStatus oldStatus, ConnectionStatus newStatus, QString errorMessage = ""); /*! * We received a reply to one of our pings. diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index 5d4b46f83..540c07198 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -183,18 +183,19 @@ namespace BlackCore case Cvatlib_Network::connStatus_Connected: return INetwork::Connected; case Cvatlib_Network::connStatus_Disconnected: return INetwork::Disconnected; case Cvatlib_Network::connStatus_Error: return INetwork::DisconnectedError; - case Cvatlib_Network::connStatus_ConnectionLost: return INetwork::Disconnected; + case Cvatlib_Network::connStatus_ConnectionFailed: return INetwork::DisconnectedFailed; + case Cvatlib_Network::connStatus_ConnectionLost: return INetwork::DisconnectedLost; } qFatal("unrecognised connection status"); return INetwork::DisconnectedError; } - void CNetworkVatlib::changeConnectionStatus(Cvatlib_Network::connStatus status) + void CNetworkVatlib::changeConnectionStatus(Cvatlib_Network::connStatus status, QString errorMessage) { if (m_status != status) { qSwap(m_status, status); - emit connectionStatusChanged(convertConnectionStatus(status), convertConnectionStatus(m_status)); + emit connectionStatusChanged(convertConnectionStatus(status), convertConnectionStatus(m_status), errorMessage); if (isDisconnected()) { @@ -203,6 +204,42 @@ namespace BlackCore } } + QString CNetworkVatlib::getSocketError() const + { + static QMap errorCodes; + if (errorCodes.isEmpty()) + { + errorCodes["ECONNABORTED"] = "Connection aborted"; + errorCodes["ECONNREFUSED"] = "Connection refused"; + errorCodes["ECONNRESET"] = "Connection reset"; + errorCodes["EHOSTDOWN"] = "Host is down"; + errorCodes["EHOSTUNREACH"] = "Host is unreachable"; + errorCodes["ENETDOWN"] = "Network is down"; + errorCodes["ENETRESET"] = "Connection aborted by network"; + errorCodes["ENETUNREACH"] = "Network unreachable"; + errorCodes["ENOTCONN"] = "The socket is not connected"; + errorCodes["ETIMEDOUT"] = "Connection timed out"; + } + + QString err(m_net->GetNetworkErrorCode()); + if (errorCodes.contains(err)) + { + return errorCodes[err]; + } + else if (err.startsWith("EUNKWN")) + { + return "Unknown error code " + err.section(' ', 1); + } + else if (err == "EOK" || err.isEmpty()) + { + return ""; + } + else + { + return "Unrecognized error code " + err; + } + } + QByteArray CNetworkVatlib::toFSD(QString qstr) const { return m_fsdTextCodec->fromUnicode(qstr); @@ -326,12 +363,12 @@ namespace BlackCore } else { - changeConnectionStatus(Cvatlib_Network::connStatus_Error); + changeConnectionStatus(Cvatlib_Network::connStatus_Error/*, getSocketError()*/); } } catch (...) { - changeConnectionStatus(Cvatlib_Network::connStatus_Error); + changeConnectionStatus(Cvatlib_Network::connStatus_Error/*, getSocketError()*/); exceptionDispatcher(Q_FUNC_INFO); } } @@ -344,7 +381,7 @@ namespace BlackCore if (m_net && m_net->IsValid() && m_net->IsNetworkConnected()) { - // I let others know we are going down + // emit signal directly because there is no Cvatlib_Network enum for Disconnecting emit this->connectionStatusChanged(convertConnectionStatus(m_status), Disconnecting); m_net->LogoffAndDisconnect(c_logoffTimeoutSec); } @@ -618,7 +655,16 @@ namespace BlackCore void CNetworkVatlib::onConnectionStatusChanged(Cvatlib_Network *, Cvatlib_Network::connStatus, Cvatlib_Network::connStatus newStatus, void *cbvar) { - cbvar_cast(cbvar)->changeConnectionStatus(newStatus); + if (newStatus == Cvatlib_Network::connStatus_Error || + newStatus == Cvatlib_Network::connStatus_ConnectionFailed || + newStatus == Cvatlib_Network::connStatus_ConnectionLost) + { + cbvar_cast(cbvar)->changeConnectionStatus(newStatus, cbvar_cast(cbvar)->getSocketError()); + } + else + { + cbvar_cast(cbvar)->changeConnectionStatus(newStatus); + } } void CNetworkVatlib::onTextMessageReceived(Cvatlib_Network *, const char *from, const char *to, const char *msg, void *cbvar) diff --git a/src/blackcore/network_vatlib.h b/src/blackcore/network_vatlib.h index 6a35c5b00..9ee0f7a02 100644 --- a/src/blackcore/network_vatlib.h +++ b/src/blackcore/network_vatlib.h @@ -106,8 +106,9 @@ namespace BlackCore QByteArray toFSD(const BlackMisc::Aviation::CCallsign &callsign) const; QString fromFSD(const char *cstr) const; void initializeSession(); - void changeConnectionStatus(Cvatlib_Network::connStatus newStatus); + void changeConnectionStatus(Cvatlib_Network::connStatus newStatus, QString errorMessage = ""); bool isDisconnected() const { return m_status != Cvatlib_Network::connStatus_Connecting && m_status != Cvatlib_Network::connStatus_Connected; } + QString getSocketError() const; private slots: void process();