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
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.

View File

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

View File

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