added ConnectionStatus enum values DisconnectedFailed and DisconnectedLost
added extra argument to connectionStatusChanged signal, containing the socket error message
This commit is contained in:
Mathew Sutcliffe
2014-03-22 17:50:10 +00:00
parent b4256298e7
commit 8e732b1ad6
3 changed files with 58 additions and 9 deletions

View File

@@ -91,6 +91,8 @@ namespace BlackCore
Disconnected = 0, //!< Not connected Disconnected = 0, //!< Not connected
Disconnecting, //!< In transition to disconnected Disconnecting, //!< In transition to disconnected
DisconnectedError, //!< Disconnected due to socket error 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 Connecting, //!< Connection initiated but not established
Connected //!< Connection established Connected //!< Connection established
}; };
@@ -387,7 +389,7 @@ namespace BlackCore
/*! /*!
* The status of our connection has changed. * 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. * We received a reply to one of our pings.

View File

@@ -183,18 +183,19 @@ namespace BlackCore
case Cvatlib_Network::connStatus_Connected: return INetwork::Connected; case Cvatlib_Network::connStatus_Connected: return INetwork::Connected;
case Cvatlib_Network::connStatus_Disconnected: return INetwork::Disconnected; case Cvatlib_Network::connStatus_Disconnected: return INetwork::Disconnected;
case Cvatlib_Network::connStatus_Error: return INetwork::DisconnectedError; 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"); qFatal("unrecognised connection status");
return INetwork::DisconnectedError; return INetwork::DisconnectedError;
} }
void CNetworkVatlib::changeConnectionStatus(Cvatlib_Network::connStatus status) void CNetworkVatlib::changeConnectionStatus(Cvatlib_Network::connStatus status, QString errorMessage)
{ {
if (m_status != status) if (m_status != status)
{ {
qSwap(m_status, status); qSwap(m_status, status);
emit connectionStatusChanged(convertConnectionStatus(status), convertConnectionStatus(m_status)); emit connectionStatusChanged(convertConnectionStatus(status), convertConnectionStatus(m_status), errorMessage);
if (isDisconnected()) if (isDisconnected())
{ {
@@ -203,6 +204,42 @@ namespace BlackCore
} }
} }
QString CNetworkVatlib::getSocketError() const
{
static QMap<QString, QString> 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 QByteArray CNetworkVatlib::toFSD(QString qstr) const
{ {
return m_fsdTextCodec->fromUnicode(qstr); return m_fsdTextCodec->fromUnicode(qstr);
@@ -326,12 +363,12 @@ namespace BlackCore
} }
else else
{ {
changeConnectionStatus(Cvatlib_Network::connStatus_Error); changeConnectionStatus(Cvatlib_Network::connStatus_Error/*, getSocketError()*/);
} }
} }
catch (...) catch (...)
{ {
changeConnectionStatus(Cvatlib_Network::connStatus_Error); changeConnectionStatus(Cvatlib_Network::connStatus_Error/*, getSocketError()*/);
exceptionDispatcher(Q_FUNC_INFO); exceptionDispatcher(Q_FUNC_INFO);
} }
} }
@@ -344,7 +381,7 @@ namespace BlackCore
if (m_net && m_net->IsValid() && m_net->IsNetworkConnected()) 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); emit this->connectionStatusChanged(convertConnectionStatus(m_status), Disconnecting);
m_net->LogoffAndDisconnect(c_logoffTimeoutSec); 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) 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) void CNetworkVatlib::onTextMessageReceived(Cvatlib_Network *, const char *from, const char *to, const char *msg, void *cbvar)

View File

@@ -106,8 +106,9 @@ namespace BlackCore
QByteArray toFSD(const BlackMisc::Aviation::CCallsign &callsign) const; QByteArray toFSD(const BlackMisc::Aviation::CCallsign &callsign) const;
QString fromFSD(const char *cstr) const; QString fromFSD(const char *cstr) const;
void initializeSession(); 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; } bool isDisconnected() const { return m_status != Cvatlib_Network::connStatus_Connecting && m_status != Cvatlib_Network::connStatus_Connected; }
QString getSocketError() const;
private slots: private slots:
void process(); void process();