diff --git a/network.c b/network.c index b500c46c19..1d9064425f 100644 --- a/network.c +++ b/network.c @@ -256,6 +256,36 @@ static void NetworkClientError(byte res, NetworkClientState *cs) { _networking = false; } +/** Retrieve a string representation of an internal error number + * @param buf buffer where the error message will be stored + * @param err NetworkErrorCode (integer) + * @return returns a pointer to the error message (buf) */ +char *GetNetworkErrorMsg(char *buf, NetworkErrorCode err) +{ + /* List of possible network errors, used by + * PACKET_SERVER_ERROR and PACKET_CLIENT_ERROR */ + static const StringID network_error_strings[] = { + STR_NETWORK_ERR_CLIENT_GENERAL, + STR_NETWORK_ERR_CLIENT_DESYNC, + STR_NETWORK_ERR_CLIENT_SAVEGAME, + STR_NETWORK_ERR_CLIENT_CONNECTION_LOST, + STR_NETWORK_ERR_CLIENT_PROTOCOL_ERROR, + STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED, + STR_NETWORK_ERR_CLIENT_NOT_EXPECTED, + STR_NETWORK_ERR_CLIENT_WRONG_REVISION, + STR_NETWORK_ERR_CLIENT_NAME_IN_USE, + STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD, + STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH, + STR_NETWORK_ERR_CLIENT_KICKED, + STR_NETWORK_ERR_CLIENT_CHEATER, + STR_NETWORK_ERR_CLIENT_SERVER_FULL, + }; + + if (err >= lengthof(network_error_strings)) err = 0; + + return GetString(buf, network_error_strings[err]); +} + // Find all IP-aliases for this host static void NetworkFindIPs(void) { @@ -524,7 +554,7 @@ void NetworkCloseClient(NetworkClientState *cs) NetworkGetClientName(client_name, sizeof(client_name), cs); - GetString(str, STR_NETWORK_ERR_CLIENT_GENERAL + errorno); + GetNetworkErrorMsg(str, errorno); NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, client_name, "%s", str); diff --git a/network_client.c b/network_client.c index f78a7ff17d..da4256db72 100644 --- a/network_client.c +++ b/network_client.c @@ -676,15 +676,12 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CHAT) DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR_QUIT) { - int errorno; char str[100]; uint16 index; NetworkClientInfo *ci; index = NetworkRecv_uint16(MY_CLIENT, p); - errorno = NetworkRecv_uint8(MY_CLIENT, p); - - GetString(str, STR_NETWORK_ERR_CLIENT_GENERAL + errorno); + GetNetworkErrorMsg(str, NetworkRecv_uint8(MY_CLIENT, p)); ci = NetworkFindClientInfoFromIndex(index); if (ci != NULL) { diff --git a/network_data.h b/network_data.h index c2dbdc4b88..e24a1deea1 100644 --- a/network_data.h +++ b/network_data.h @@ -229,6 +229,7 @@ NetworkClientInfo *NetworkFindClientInfoFromIndex(uint16 client_index); NetworkClientInfo *NetworkFindClientInfoFromIP(const char *ip); NetworkClientState *NetworkFindClientStateFromIndex(uint16 client_index); unsigned long NetworkResolveHost(const char *hostname); +char *GetNetworkErrorMsg(char *buf, NetworkErrorCode err); #endif /* ENABLE_NETWORK */ diff --git a/network_server.c b/network_server.c index f64fad8375..fc4334d356 100644 --- a/network_server.c +++ b/network_server.c @@ -26,24 +26,6 @@ static void NetworkHandleCommandQueue(NetworkClientState* cs); void NetworkPopulateCompanyInfo(void); -/* List of possible network errors, used by PACKET_SERVER_ERROR and PACKET_CLIENT_ERROR */ -static const StringID _network_error_strings[] = { - STR_NETWORK_ERR_CLIENT_GENERAL, - STR_NETWORK_ERR_CLIENT_DESYNC, - STR_NETWORK_ERR_CLIENT_SAVEGAME, - STR_NETWORK_ERR_CLIENT_CONNECTION_LOST, - STR_NETWORK_ERR_CLIENT_PROTOCOL_ERROR, - STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED, - STR_NETWORK_ERR_CLIENT_NOT_EXPECTED, - STR_NETWORK_ERR_CLIENT_WRONG_REVISION, - STR_NETWORK_ERR_CLIENT_NAME_IN_USE, - STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD, - STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH, - STR_NETWORK_ERR_CLIENT_KICKED, - STR_NETWORK_ERR_CLIENT_CHEATER, - STR_NETWORK_ERR_CLIENT_SERVER_FULL, -}; - // ********** // Sending functions // DEF_SERVER_SEND_COMMAND has parameter: NetworkClientState *cs @@ -162,12 +144,10 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkClientState *cs, Netwo Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR); - if (error >= lengthof(_network_error_strings)) error = 0; - NetworkSend_uint8(p, error); NetworkSend_Packet(p, cs); - GetString(str, _network_error_strings[error]); + GetNetworkErrorMsg(str, error); // Only send when the current client was in game if (cs->status > STATUS_AUTH) { @@ -901,8 +881,8 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR) // This packets means a client noticed an error and is reporting this // to us. Display the error and report it to the other clients NetworkClientState *new_cs; - NetworkErrorCode errorno = NetworkRecv_uint8(cs, p); char str[100]; + NetworkErrorCode errorno = NetworkRecv_uint8(cs, p); char client_name[NETWORK_CLIENT_NAME_LENGTH]; // The client was never joined.. thank the client for the packet, but ignore it @@ -913,9 +893,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR) NetworkGetClientName(client_name, sizeof(client_name), cs); - if (errorno >= lengthof(_network_error_strings)) errorno = 0; - - GetString(str, _network_error_strings[errorno]); + GetNetworkErrorMsg(str, errorno); DEBUG(net, 2)("[NET] %s reported an error and is closing his connection (%s)", client_name, str);