mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-31 21:15:33 +08:00
refs #179
added ConnectionStatus enum values DisconnectedFailed and DisconnectedLost added extra argument to connectionStatusChanged signal, containing the socket error message
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user