diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h index 2ae518d4c6..b3cf267e10 100644 --- a/src/network/core/tcp_admin.h +++ b/src/network/core/tcp_admin.h @@ -210,7 +210,7 @@ protected: * * The server will determine which of the authentication methods supplied by the client will be used. * When there is no supported authentication method, an \c ADMIN_PACKET_SERVER_ERROR packet will be - * sent with \c NETWORK_ERROR_NO_AUTHENTICATION_METHOD_AVAILABLE as error. + * sent with \c NetworkErrorCode::NoAuthenticationMethodAvailable as error. * @param p The packet that was just received. * @return The state the network should have. */ diff --git a/src/network/network.cpp b/src/network/network.cpp index bca35e299e..0358823cec 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -304,44 +304,39 @@ void ShowNetworkError(StringID error_string) } /** - * Retrieve the string id of an internal error number - * @param err NetworkErrorCode - * @return the StringID + * Retrieve a short translateable string of the error code. + * An unknown error code will get \c STR_NETWORK_ERROR_CLIENT_GENERAL. + * @param err The error code. + * @return The \c StringID. */ StringID GetNetworkErrorMsg(NetworkErrorCode err) { - /* List of possible network errors, used by - * PACKET_SERVER_ERROR and PACKET_CLIENT_ERROR */ - static const StringID network_error_strings[] = { - STR_NETWORK_ERROR_CLIENT_GENERAL, - STR_NETWORK_ERROR_CLIENT_DESYNC, - STR_NETWORK_ERROR_CLIENT_SAVEGAME, - STR_NETWORK_ERROR_CLIENT_CONNECTION_LOST, - STR_NETWORK_ERROR_CLIENT_PROTOCOL_ERROR, - STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH, - STR_NETWORK_ERROR_CLIENT_NOT_AUTHORIZED, - STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED, - STR_NETWORK_ERROR_CLIENT_WRONG_REVISION, - STR_NETWORK_ERROR_CLIENT_NAME_IN_USE, - STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD, - STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH, - STR_NETWORK_ERROR_CLIENT_KICKED, - STR_NETWORK_ERROR_CLIENT_CHEATER, - STR_NETWORK_ERROR_CLIENT_SERVER_FULL, - STR_NETWORK_ERROR_CLIENT_TOO_MANY_COMMANDS, - STR_NETWORK_ERROR_CLIENT_TIMEOUT_PASSWORD, - STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER, - STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP, - STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN, - STR_NETWORK_ERROR_CLIENT_INVALID_CLIENT_NAME, - STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST, - STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE, + switch (err) { + default: + case NetworkErrorCode::General: return STR_NETWORK_ERROR_CLIENT_GENERAL; + case NetworkErrorCode::Desync: return STR_NETWORK_ERROR_CLIENT_DESYNC; + case NetworkErrorCode::SavegameFailed: return STR_NETWORK_ERROR_CLIENT_SAVEGAME; + case NetworkErrorCode::ConnectionLost: return STR_NETWORK_ERROR_CLIENT_CONNECTION_LOST; + case NetworkErrorCode::IllegalPacket: return STR_NETWORK_ERROR_CLIENT_PROTOCOL_ERROR; + case NetworkErrorCode::NewGRFMismatch: return STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH; + case NetworkErrorCode::NotAuthorized: return STR_NETWORK_ERROR_CLIENT_NOT_AUTHORIZED; + case NetworkErrorCode::NotExpected: return STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED; + case NetworkErrorCode::WrongRevision: return STR_NETWORK_ERROR_CLIENT_WRONG_REVISION; + case NetworkErrorCode::NameInUse: return STR_NETWORK_ERROR_CLIENT_NAME_IN_USE; + case NetworkErrorCode::WrongPassword: return STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD; + case NetworkErrorCode::CompanyMismatch: return STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH; + case NetworkErrorCode::Kicked: return STR_NETWORK_ERROR_CLIENT_KICKED; + case NetworkErrorCode::Cheater: return STR_NETWORK_ERROR_CLIENT_CHEATER; + case NetworkErrorCode::ServerFull: return STR_NETWORK_ERROR_CLIENT_SERVER_FULL; + case NetworkErrorCode::TooManyCommands: return STR_NETWORK_ERROR_CLIENT_TOO_MANY_COMMANDS; + case NetworkErrorCode::TimeoutPassword: return STR_NETWORK_ERROR_CLIENT_TIMEOUT_PASSWORD; + case NetworkErrorCode::TimeoutComputer: return STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER; + case NetworkErrorCode::TimeoutMap: return STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP; + case NetworkErrorCode::TimeoutJoin: return STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN; + case NetworkErrorCode::InvalidClientName: return STR_NETWORK_ERROR_CLIENT_INVALID_CLIENT_NAME; + case NetworkErrorCode::NotOnAllowList: return STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST; + case NetworkErrorCode::NoAuthenticationMethodAvailable: return STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE; }; - static_assert(lengthof(network_error_strings) == NETWORK_ERROR_END); - - if (err >= (ptrdiff_t)lengthof(network_error_strings)) err = NETWORK_ERROR_GENERAL; - - return network_error_strings[err]; } /** diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index ece209c171..3a2541de3c 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -137,7 +137,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendError(NetworkErrorCode er auto p = std::make_unique(this, ADMIN_PACKET_SERVER_ERROR); - p->Send_uint8(error); + p->Send_uint8(to_underlying(error)); this->SendPacket(std::move(p)); std::string error_message = GetString(GetNetworkErrorMsg(error)); @@ -317,7 +317,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientError(ClientID clie auto p = std::make_unique(this, ADMIN_PACKET_SERVER_CLIENT_ERROR); p->Send_uint32(client_id); - p->Send_uint8 (error); + p->Send_uint8(to_underlying(error)); this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; @@ -516,7 +516,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRcon(uint16_t colour, std NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet &p) { - if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NetworkErrorCode::NotExpected); std::string command = p.Recv_string(NETWORK_RCONCOMMAND_LENGTH); @@ -530,7 +530,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet &p) NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet &p) { - if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NetworkErrorCode::NotExpected); std::string json = p.Recv_string(NETWORK_GAMESCRIPT_JSON_LENGTH); @@ -542,7 +542,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Pack NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_PING(Packet &p) { - if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NetworkErrorCode::NotExpected); uint32_t d1 = p.Recv_uint32(); @@ -664,18 +664,18 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID clien NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet &p) { - if (this->status != ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status != ADMIN_STATUS_INACTIVE) return this->SendError(NetworkErrorCode::NotExpected); if (!_settings_client.network.allow_insecure_admin_login) { /* You're not authorized to login using this method. */ - return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED); + return this->SendError(NetworkErrorCode::NotAuthorized); } std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH); if (_settings_client.network.admin_password.empty() || _settings_client.network.admin_password != password) { /* Password is invalid */ - return this->SendError(NETWORK_ERROR_WRONG_PASSWORD); + return this->SendError(NetworkErrorCode::WrongPassword); } this->admin_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH); @@ -683,7 +683,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet &p) if (this->admin_name.empty() || this->admin_version.empty()) { /* no name or version supplied */ - return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET); + return this->SendError(NetworkErrorCode::IllegalPacket); } Debug(net, 3, "[admin] '{}' ({}) has connected", this->admin_name, this->admin_version); @@ -699,7 +699,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet &) NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet &p) { - if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NetworkErrorCode::NotExpected); AdminUpdateType type = (AdminUpdateType)p.Recv_uint16(); AdminUpdateFrequencies freq = static_cast(p.Recv_uint16()); @@ -707,7 +707,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENC if (type >= ADMIN_UPDATE_END || !_admin_update_type_frequencies[type].All(freq)) { /* The server does not know of this UpdateType. */ Debug(net, 1, "[admin] Not supported update frequency {} ({}) from '{}' ({})", type, freq, this->admin_name, this->admin_version); - return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET); + return this->SendError(NetworkErrorCode::IllegalPacket); } this->update_frequency[type] = freq; @@ -719,7 +719,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENC NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet &p) { - if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NetworkErrorCode::NotExpected); AdminUpdateType type = (AdminUpdateType)p.Recv_uint8(); uint32_t d1 = p.Recv_uint32(); @@ -777,7 +777,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet &p) default: /* An unsupported "poll" update type. */ Debug(net, 1, "[admin] Not supported poll {} ({}) from '{}' ({}).", type, d1, this->admin_name, this->admin_version); - return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET); + return this->SendError(NetworkErrorCode::IllegalPacket); } return NETWORK_RECV_STATUS_OKAY; @@ -785,7 +785,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet &p) NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet &p) { - if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NetworkErrorCode::NotExpected); NetworkAction action = (NetworkAction)p.Recv_uint8(); DestType desttype = (DestType)p.Recv_uint8(); @@ -803,7 +803,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet &p) default: Debug(net, 1, "[admin] Invalid chat action {} from admin '{}' ({}).", action, this->admin_name, this->admin_version); - return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET); + return this->SendError(NetworkErrorCode::IllegalPacket); } return NETWORK_RECV_STATUS_OKAY; @@ -811,7 +811,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet &p) NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet &p) { - if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status <= ADMIN_STATUS_AUTHENTICATE) return this->SendError(NetworkErrorCode::NotExpected); std::string source = p.Recv_string(NETWORK_CHAT_LENGTH); TextColour colour = (TextColour)p.Recv_uint16(); @@ -820,7 +820,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(P if (!IsValidConsoleColour(colour)) { Debug(net, 1, "[admin] Not supported chat colour {} ({}, {}, {}) from '{}' ({}).", (uint16_t)colour, source, user, msg, this->admin_name, this->admin_version); - return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET); + return this->SendError(NetworkErrorCode::IllegalPacket); } NetworkServerSendExternalChat(source, colour, user, msg); @@ -834,7 +834,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(P NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN_SECURE(Packet &p) { - if (this->status != ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status != ADMIN_STATUS_INACTIVE) return this->SendError(NetworkErrorCode::NotExpected); this->admin_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH); this->admin_version = p.Recv_string(NETWORK_REVISION_LENGTH); @@ -845,11 +845,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN_SECURE(Pac if (this->admin_name.empty() || this->admin_version.empty()) { /* No name or version supplied. */ - return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET); + return this->SendError(NetworkErrorCode::IllegalPacket); } auto handler = NetworkAuthenticationServerHandler::Create(&_admin_password_provider, &_admin_authorized_key_handler, method_mask); - if (!handler->CanBeUsed()) return this->SendError(NETWORK_ERROR_NO_AUTHENTICATION_METHOD_AVAILABLE); + if (!handler->CanBeUsed()) return this->SendError(NetworkErrorCode::NoAuthenticationMethodAvailable); this->authentication_handler = std::move(handler); Debug(net, 3, "[admin] '{}' ({}) has connected", this->admin_name, this->admin_version); @@ -873,7 +873,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendAuthRequest() NetworkRecvStatus ServerNetworkAdminSocketHandler::SendEnableEncryption() { - if (this->status != ADMIN_STATUS_AUTHENTICATE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status != ADMIN_STATUS_AUTHENTICATE) return this->SendError(NetworkErrorCode::NotExpected); auto p = std::make_unique(this, ADMIN_PACKET_SERVER_ENABLE_ENCRYPTION); this->authentication_handler->SendEnableEncryption(*p); @@ -884,7 +884,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendEnableEncryption() NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_AUTH_RESPONSE(Packet &p) { - if (this->status != ADMIN_STATUS_AUTHENTICATE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status != ADMIN_STATUS_AUTHENTICATE) return this->SendError(NetworkErrorCode::NotExpected); switch (this->authentication_handler->ReceiveResponse(p)) { case NetworkAuthenticationServerHandler::ResponseResult::Authenticated: @@ -904,7 +904,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_AUTH_RESPONSE(P case NetworkAuthenticationServerHandler::ResponseResult::NotAuthenticated: default: Debug(net, 3, "[admin] '{}' ({}) authentication failed", this->admin_name, this->admin_version); - return this->SendError(NETWORK_ERROR_WRONG_PASSWORD); + return this->SendError(NetworkErrorCode::WrongPassword); } } diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index bb64c12d02..cb092a1d3b 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -147,10 +147,6 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res) { if (this->IsPendingDeletion()) return; - /* First, send a CLIENT_ERROR to the server, so it knows we are - * disconnected (and why!) */ - NetworkErrorCode errorno; - /* We just want to close the connection.. */ if (res == NETWORK_RECV_STATUS_CLOSE_QUERY) { this->NetworkSocketHandler::MarkClosed(); @@ -161,11 +157,13 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res) return; } + /* Send a CLIENT_ERROR to the server, so it knows we are disconnected (and why!) */ + NetworkErrorCode errorno; switch (res) { - case NETWORK_RECV_STATUS_DESYNC: errorno = NETWORK_ERROR_DESYNC; break; - case NETWORK_RECV_STATUS_SAVEGAME: errorno = NETWORK_ERROR_SAVEGAME_FAILED; break; - case NETWORK_RECV_STATUS_NEWGRF_MISMATCH: errorno = NETWORK_ERROR_NEWGRF_MISMATCH; break; - default: errorno = NETWORK_ERROR_GENERAL; break; + case NETWORK_RECV_STATUS_DESYNC: errorno = NetworkErrorCode::Desync; break; + case NETWORK_RECV_STATUS_SAVEGAME: errorno = NetworkErrorCode::SavegameFailed; break; + case NETWORK_RECV_STATUS_NEWGRF_MISMATCH: errorno = NetworkErrorCode::NewGRFMismatch; break; + default: errorno = NetworkErrorCode::General; break; } if (res == NETWORK_RECV_STATUS_SERVER_ERROR || res == NETWORK_RECV_STATUS_SERVER_FULL || @@ -447,7 +445,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendError(NetworkErrorCode err auto p = std::make_unique(my_client, PACKET_CLIENT_ERROR); - p->Send_uint8(errorno); + p->Send_uint8(to_underlying(errorno)); my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -614,43 +612,54 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Pac return NETWORK_RECV_STATUS_OKAY; } +/** + * Get a long form translateable string for a \c NetworkErrorCode. + * Any invalid errors will get \c STR_NETWORK_ERROR_LOSTCONNECTION. + * @param error The error code. + * @return The \c StringID. + */ +static StringID GetLongNetworkErrorString(NetworkErrorCode error) +{ + switch (error) { + case NetworkErrorCode::General: + case NetworkErrorCode::Desync: + case NetworkErrorCode::SavegameFailed: + case NetworkErrorCode::ConnectionLost: + case NetworkErrorCode::IllegalPacket: + case NetworkErrorCode::NewGRFMismatch: + case NetworkErrorCode::NameInUse: + default: + return STR_NETWORK_ERROR_LOSTCONNECTION; + + case NetworkErrorCode::NotAuthorized: + case NetworkErrorCode::NotExpected: + case NetworkErrorCode::CompanyMismatch: + case NetworkErrorCode::NoAuthenticationMethodAvailable: + return STR_NETWORK_ERROR_SERVER_ERROR; + + case NetworkErrorCode::WrongRevision: return STR_NETWORK_ERROR_WRONG_REVISION; + case NetworkErrorCode::WrongPassword: return STR_NETWORK_ERROR_WRONG_PASSWORD; + case NetworkErrorCode::Kicked: return STR_NETWORK_ERROR_KICKED; + case NetworkErrorCode::Cheater: return STR_NETWORK_ERROR_CHEATER; + case NetworkErrorCode::ServerFull: return STR_NETWORK_ERROR_SERVER_FULL; + case NetworkErrorCode::TooManyCommands: return STR_NETWORK_ERROR_TOO_MANY_COMMANDS; + case NetworkErrorCode::TimeoutPassword: return STR_NETWORK_ERROR_TIMEOUT_PASSWORD; + case NetworkErrorCode::TimeoutComputer: return STR_NETWORK_ERROR_TIMEOUT_COMPUTER; + case NetworkErrorCode::TimeoutMap: return STR_NETWORK_ERROR_TIMEOUT_MAP; + case NetworkErrorCode::TimeoutJoin: return STR_NETWORK_ERROR_TIMEOUT_JOIN; + case NetworkErrorCode::InvalidClientName: return STR_NETWORK_ERROR_INVALID_CLIENT_NAME; + case NetworkErrorCode::NotOnAllowList: return STR_NETWORK_ERROR_NOT_ON_ALLOW_LIST; + } +} + NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet &p) { - static const StringID network_error_strings[] = { - STR_NETWORK_ERROR_LOSTCONNECTION, // NETWORK_ERROR_GENERAL - STR_NETWORK_ERROR_LOSTCONNECTION, // NETWORK_ERROR_DESYNC - STR_NETWORK_ERROR_LOSTCONNECTION, // NETWORK_ERROR_SAVEGAME_FAILED - STR_NETWORK_ERROR_LOSTCONNECTION, // NETWORK_ERROR_CONNECTION_LOST - STR_NETWORK_ERROR_LOSTCONNECTION, // NETWORK_ERROR_ILLEGAL_PACKET - STR_NETWORK_ERROR_LOSTCONNECTION, // NETWORK_ERROR_NEWGRF_MISMATCH - STR_NETWORK_ERROR_SERVER_ERROR, // NETWORK_ERROR_NOT_AUTHORIZED - STR_NETWORK_ERROR_SERVER_ERROR, // NETWORK_ERROR_NOT_EXPECTED - STR_NETWORK_ERROR_WRONG_REVISION, // NETWORK_ERROR_WRONG_REVISION - STR_NETWORK_ERROR_LOSTCONNECTION, // NETWORK_ERROR_NAME_IN_USE - STR_NETWORK_ERROR_WRONG_PASSWORD, // NETWORK_ERROR_WRONG_PASSWORD - STR_NETWORK_ERROR_SERVER_ERROR, // NETWORK_ERROR_COMPANY_MISMATCH - STR_NETWORK_ERROR_KICKED, // NETWORK_ERROR_KICKED - STR_NETWORK_ERROR_CHEATER, // NETWORK_ERROR_CHEATER - STR_NETWORK_ERROR_SERVER_FULL, // NETWORK_ERROR_FULL - STR_NETWORK_ERROR_TOO_MANY_COMMANDS, // NETWORK_ERROR_TOO_MANY_COMMANDS - STR_NETWORK_ERROR_TIMEOUT_PASSWORD, // NETWORK_ERROR_TIMEOUT_PASSWORD - STR_NETWORK_ERROR_TIMEOUT_COMPUTER, // NETWORK_ERROR_TIMEOUT_COMPUTER - STR_NETWORK_ERROR_TIMEOUT_MAP, // NETWORK_ERROR_TIMEOUT_MAP - STR_NETWORK_ERROR_TIMEOUT_JOIN, // NETWORK_ERROR_TIMEOUT_JOIN - STR_NETWORK_ERROR_INVALID_CLIENT_NAME, // NETWORK_ERROR_INVALID_CLIENT_NAME - STR_NETWORK_ERROR_NOT_ON_ALLOW_LIST, // NETWORK_ERROR_NOT_ON_ALLOW_LIST - STR_NETWORK_ERROR_SERVER_ERROR, // NETWORK_ERROR_NO_AUTHENTICATION_METHOD_AVAILABLE - }; - static_assert(lengthof(network_error_strings) == NETWORK_ERROR_END); - - NetworkErrorCode error = (NetworkErrorCode)p.Recv_uint8(); - + NetworkErrorCode error = static_cast(p.Recv_uint8()); Debug(net, 9, "Client::Receive_SERVER_ERROR(): error={}", error); - StringID err = STR_NETWORK_ERROR_LOSTCONNECTION; - if (error < (ptrdiff_t)lengthof(network_error_strings)) err = network_error_strings[error]; + StringID err = GetLongNetworkErrorString(error); /* In case of kicking a client, we assume there is a kick message in the packet if we can read one byte */ - if (error == NETWORK_ERROR_KICKED && p.CanReadFromPacket(1)) { + if (error == NetworkErrorCode::Kicked && p.CanReadFromPacket(1)) { ShowErrorMessage(GetEncodedString(err), GetEncodedString(STR_NETWORK_ERROR_KICK_MESSAGE, p.Recv_string(NETWORK_CHAT_LENGTH)), WL_CRITICAL); @@ -1046,7 +1055,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Pack NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id); if (ci != nullptr) { - NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, "", GetNetworkErrorMsg((NetworkErrorCode)p.Recv_uint8())); + NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, "", GetNetworkErrorMsg(static_cast(p.Recv_uint8()))); delete ci; } diff --git a/src/network/network_query.cpp b/src/network/network_query.cpp index 53aabef8e9..95c1523fc4 100644 --- a/src/network/network_query.cpp +++ b/src/network/network_query.cpp @@ -136,15 +136,15 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet &p) { - NetworkErrorCode error = (NetworkErrorCode)p.Recv_uint8(); + NetworkErrorCode error = static_cast(p.Recv_uint8()); Debug(net, 9, "Query::Receive_SERVER_ERROR(): error={}", error); NetworkGame *item = NetworkGameListAddItem(this->connection_string); - if (error == NETWORK_ERROR_NOT_EXPECTED) { + if (error == NetworkErrorCode::NotExpected) { /* If we query a server that is 1.11.1 or older, we get an - * NETWORK_ERROR_NOT_EXPECTED on requesting the game info. Show to the + * NetworkErrorCode::NotExpected on requesting the game info. Show to the * user this server is too old to query. */ item->status = NGLS_TOO_OLD; diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 6d497f8e2e..fa2c38c971 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -255,7 +255,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::CloseConnection(NetworkRecvSta /* Inform other clients of this... strange leaving ;) */ for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) { if (new_cs->status >= STATUS_AUTHORIZED && this != new_cs) { - new_cs->SendErrorQuit(this->client_id, NETWORK_ERROR_CONNECTION_LOST); + new_cs->SendErrorQuit(this->client_id, NetworkErrorCode::ConnectionLost); } } } @@ -270,7 +270,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::CloseConnection(NetworkRecvSta this->CheckNextClientToSendMap(this); } - NetworkAdminClientError(this->client_id, NETWORK_ERROR_CONNECTION_LOST); + NetworkAdminClientError(this->client_id, NetworkErrorCode::ConnectionLost); Debug(net, 3, "[{}] Client #{} closed connection", ServerNetworkGameSocketHandler::GetName(), this->client_id); /* We just lost one client :( */ @@ -369,7 +369,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err auto p = std::make_unique(this, PACKET_SERVER_ERROR); - p->Send_uint8(error); + p->Send_uint8(to_underlying(error)); if (!reason.empty()) p->Send_string(reason); this->SendPacket(std::move(p)); @@ -381,7 +381,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err Debug(net, 1, "'{}' made an error and has been disconnected: {}", client_name, GetString(strid)); - if (error == NETWORK_ERROR_KICKED && !reason.empty()) { + if (error == NetworkErrorCode::Kicked && !reason.empty()) { NetworkTextMessage(NETWORK_ACTION_KICKED, CC_DEFAULT, false, client_name, reason, strid); } else { NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, "", strid); @@ -391,8 +391,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err if (new_cs->status >= STATUS_AUTHORIZED && new_cs != this) { /* Some errors we filter to a more general error. Clients don't have to know the real * reason a joining failed. */ - if (error == NETWORK_ERROR_NOT_AUTHORIZED || error == NETWORK_ERROR_NOT_EXPECTED || error == NETWORK_ERROR_WRONG_REVISION) { - error = NETWORK_ERROR_ILLEGAL_PACKET; + if (error == NetworkErrorCode::NotAuthorized || error == NetworkErrorCode::NotExpected || error == NetworkErrorCode::WrongRevision) { + error = NetworkErrorCode::IllegalPacket; } new_cs->SendErrorQuit(this->client_id, error); } @@ -576,7 +576,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap() { if (this->status < STATUS_AUTHORIZED) { /* Illegal call, return error and ignore the packet */ - return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED); + return this->SendError(NetworkErrorCode::IllegalPacket); } if (this->status == STATUS_AUTHORIZED) { @@ -767,7 +767,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendErrorQuit(ClientID client_ auto p = std::make_unique(this, PACKET_SERVER_ERROR_QUIT); p->Send_uint32(client_id); - p->Send_uint8 (errorno); + p->Send_uint8(to_underlying(errorno)); this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; @@ -883,7 +883,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED { if (this->status != STATUS_NEWGRFS_CHECK) { /* Illegal call, return error and ignore the packet */ - return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + return this->SendError(NetworkErrorCode::NotExpected); } Debug(net, 9, "client[{}] Receive_CLIENT_NEWGRFS_CHECKED()", this->client_id); @@ -895,12 +895,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet &p) { if (this->status != STATUS_INACTIVE) { /* Illegal call, return error and ignore the packet */ - return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + return this->SendError(NetworkErrorCode::NotExpected); } if (_network_game_info.clients_on >= _settings_client.network.max_clients) { /* Turns out we are full. Inform the user about this. */ - return this->SendError(NETWORK_ERROR_FULL); + return this->SendError(NetworkErrorCode::ServerFull); } std::string client_revision = p.Recv_string(NETWORK_REVISION_LENGTH); @@ -911,7 +911,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet &p) /* Check if the client has revision control enabled */ if (!IsNetworkCompatibleVersion(client_revision) || _openttd_newgrf_version != newgrf_version) { /* Different revisions!! */ - return this->SendError(NETWORK_ERROR_WRONG_REVISION); + return this->SendError(NetworkErrorCode::WrongRevision); } return this->SendAuthRequest(); @@ -919,7 +919,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet &p) NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_IDENTIFY(Packet &p) { - if (this->status != STATUS_IDENTIFY) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status != STATUS_IDENTIFY) return this->SendError(NetworkErrorCode::NotExpected); Debug(net, 9, "client[{}] Receive_CLIENT_IDENTIFY()", this->client_id); @@ -932,14 +932,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_IDENTIFY(Packet switch (playas.base()) { case COMPANY_NEW_COMPANY.base(): // New company if (Company::GetNumItems() >= _settings_client.network.max_companies) { - return this->SendError(NETWORK_ERROR_FULL); + return this->SendError(NetworkErrorCode::ServerFull); } break; case COMPANY_SPECTATOR.base(): // Spectator break; default: // Join another company (companies 1..MAX_COMPANIES (index 0..(MAX_COMPANIES-1))) if (!Company::IsValidHumanID(playas)) { - return this->SendError(NETWORK_ERROR_COMPANY_MISMATCH); + return this->SendError(NetworkErrorCode::CompanyMismatch); } const Company *c = Company::Get(playas); @@ -954,12 +954,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_IDENTIFY(Packet /* An invalid client name was given. However, the client ensures the name * is valid before it is sent over the network, so something went horribly * wrong. This is probably someone trying to troll us. */ - return this->SendError(NETWORK_ERROR_INVALID_CLIENT_NAME); + return this->SendError(NetworkErrorCode::InvalidClientName); } if (!NetworkMakeClientNameUnique(client_name)) { // Change name if duplicate /* We could not create a name for this client */ - return this->SendError(NETWORK_ERROR_NAME_IN_USE); + return this->SendError(NetworkErrorCode::NameInUse); } assert(NetworkClientInfo::CanAllocateItem()); @@ -982,9 +982,9 @@ static NetworkErrorCode GetErrorForAuthenticationMethod(NetworkAuthenticationMet { switch (method) { case NetworkAuthenticationMethod::X25519_PAKE: - return NETWORK_ERROR_WRONG_PASSWORD; + return NetworkErrorCode::WrongPassword; case NetworkAuthenticationMethod::X25519_AuthorizedKey: - return NETWORK_ERROR_NOT_ON_ALLOW_LIST; + return NetworkErrorCode::NotOnAllowList; default: NOT_REACHED(); @@ -994,7 +994,7 @@ static NetworkErrorCode GetErrorForAuthenticationMethod(NetworkAuthenticationMet NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_AUTH_RESPONSE(Packet &p) { if (this->status != STATUS_AUTH_GAME) { - return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + return this->SendError(NetworkErrorCode::NotExpected); } Debug(net, 9, "client[{}] Receive_CLIENT_AUTH_RESPONSE()", this->client_id); @@ -1034,7 +1034,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet & /* The client was never joined.. so this is impossible, right? * Ignore the packet, give the client a warning, and close the connection */ if (this->status < STATUS_AUTHORIZED || this->HasClientQuit()) { - return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED); + return this->SendError(NetworkErrorCode::NotAuthorized); } Debug(net, 9, "client[{}] Receive_CLIENT_GETMAP()", this->client_id); @@ -1093,7 +1093,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet & } /* Wrong status for this packet, give a warning to client, and close connection */ - return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + return this->SendError(NetworkErrorCode::NotExpected); } NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet &p) @@ -1101,11 +1101,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet /* The client was never joined.. so this is impossible, right? * Ignore the packet, give the client a warning, and close the connection */ if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) { - return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + return this->SendError(NetworkErrorCode::NotExpected); } if (this->incoming_queue.size() >= _settings_client.network.max_commands_in_queue) { - return this->SendError(NETWORK_ERROR_TOO_MANY_COMMANDS); + return this->SendError(NetworkErrorCode::TooManyCommands); } Debug(net, 9, "client[{}] Receive_CLIENT_COMMAND()", this->client_id); @@ -1119,17 +1119,17 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet if (err.has_value()) { IConsolePrint(CC_WARNING, "Dropping client #{} (IP: {}) due to {}.", ci->client_id, this->GetClientIP(), *err); - return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + return this->SendError(NetworkErrorCode::NotExpected); } if (GetCommandFlags(cp.cmd).Test(CommandFlag::Server) && ci->client_id != CLIENT_ID_SERVER) { IConsolePrint(CC_WARNING, "Kicking client #{} (IP: {}) due to calling a server only command {}.", ci->client_id, this->GetClientIP(), cp.cmd); - return this->SendError(NETWORK_ERROR_KICKED); + return this->SendError(NetworkErrorCode::Kicked); } if (!GetCommandFlags(cp.cmd).Test(CommandFlag::Spectator) && !Company::IsValidID(cp.company) && ci->client_id != CLIENT_ID_SERVER) { IConsolePrint(CC_WARNING, "Kicking client #{} (IP: {}) due to calling a non-spectator command {}.", ci->client_id, this->GetClientIP(), cp.cmd); - return this->SendError(NETWORK_ERROR_KICKED); + return this->SendError(NetworkErrorCode::Kicked); } /** @@ -1141,12 +1141,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet if (!(cp.cmd == Commands::CompanyControl && cca == CompanyCtrlAction::New && ci->client_playas == COMPANY_NEW_COMPANY) && ci->client_playas != cp.company) { IConsolePrint(CC_WARNING, "Kicking client #{} (IP: {}) due to calling a command as another company {}.", ci->client_playas + 1, this->GetClientIP(), cp.company + 1); - return this->SendError(NETWORK_ERROR_COMPANY_MISMATCH); + return this->SendError(NetworkErrorCode::CompanyMismatch); } if (cp.cmd == Commands::CompanyControl) { if (cca != CompanyCtrlAction::New || cp.company != COMPANY_SPECTATOR) { - return this->SendError(NETWORK_ERROR_CHEATER); + return this->SendError(NetworkErrorCode::Cheater); } /* Check if we are full - else it's possible for spectators to send a Commands::CompanyControl and the company is created regardless of max_companies! */ @@ -1186,7 +1186,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet &p { /* This packets means a client noticed an error and is reporting this * to us. Display the error and report it to the other clients */ - NetworkErrorCode errorno = (NetworkErrorCode)p.Recv_uint8(); + NetworkErrorCode errorno = static_cast(p.Recv_uint8()); Debug(net, 9, "client[{}] Receive_CLIENT_ERROR(): errorno={}", this->client_id, errorno); @@ -1241,7 +1241,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet &p) { if (this->status < STATUS_AUTHORIZED) { /* Illegal call, return error and ignore the packet */ - return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED); + return this->SendError(NetworkErrorCode::NotAuthorized); } uint32_t frame = p.Recv_uint32(); @@ -1425,7 +1425,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet &p) { if (this->status < STATUS_PRE_ACTIVE) { /* Illegal call, return error and ignore the packet */ - return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED); + return this->SendError(NetworkErrorCode::NotAuthorized); } NetworkAction action = (NetworkAction)p.Recv_uint8(); @@ -1446,7 +1446,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet &p) break; default: IConsolePrint(CC_WARNING, "Kicking client #{} (IP: {}) due to unknown chact action.", ci->client_id, this->GetClientIP()); - return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + return this->SendError(NetworkErrorCode::NotExpected); } return NETWORK_RECV_STATUS_OKAY; } @@ -1455,7 +1455,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet { if (this->status != STATUS_ACTIVE) { /* Illegal call, return error and ignore the packet */ - return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + return this->SendError(NetworkErrorCode::NotExpected); } Debug(net, 9, "client[{}] Receive_CLIENT_SET_NAME()", this->client_id); @@ -1472,7 +1472,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet /* An invalid client name was given. However, the client ensures the name * is valid before it is sent over the network, so something went horribly * wrong. This is probably someone trying to troll us. */ - return this->SendError(NETWORK_ERROR_INVALID_CLIENT_NAME); + return this->SendError(NetworkErrorCode::InvalidClientName); } /* Display change */ @@ -1487,7 +1487,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet &p) { - if (this->status != STATUS_ACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status != STATUS_ACTIVE) return this->SendError(NetworkErrorCode::NotExpected); Debug(net, 9, "client[{}] Receive_CLIENT_RCON()", this->client_id); @@ -1513,7 +1513,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet &p) NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet &p) { - if (this->status != STATUS_ACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED); + if (this->status != STATUS_ACTIVE) return this->SendError(NetworkErrorCode::NotExpected); CompanyID company_id = (Owner)p.Recv_uint8(); @@ -1762,7 +1762,7 @@ void NetworkServer_Tick(bool send_frame) /* No packet was received in the last three game days; sounds like a lost connection. */ IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because the client did not respond for more than {} ticks.", cs->client_id, cs->GetClientIP(), lag); } - cs->SendError(NETWORK_ERROR_TIMEOUT_COMPUTER); + cs->SendError(NetworkErrorCode::TimeoutComputer); continue; } @@ -1779,7 +1779,7 @@ void NetworkServer_Tick(bool send_frame) if (cs->last_frame_server - cs->last_token_frame >= _settings_client.network.max_lag_time) { /* This is a bad client! It didn't send the right token back within time. */ IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because it fails to send valid acks.", cs->client_id, cs->GetClientIP()); - cs->SendError(NETWORK_ERROR_TIMEOUT_COMPUTER); + cs->SendError(NetworkErrorCode::TimeoutComputer); continue; } break; @@ -1792,7 +1792,7 @@ void NetworkServer_Tick(bool send_frame) * So give them some lee-way, likewise for the query with inactive. */ if (lag > _settings_client.network.max_init_time) { IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because it took longer than {} ticks to start the joining process.", cs->client_id, cs->GetClientIP(), _settings_client.network.max_init_time); - cs->SendError(NETWORK_ERROR_TIMEOUT_COMPUTER); + cs->SendError(NetworkErrorCode::TimeoutComputer); continue; } break; @@ -1816,7 +1816,7 @@ void NetworkServer_Tick(bool send_frame) /* Downloading the map... this is the amount of time since starting the saving. */ if (lag > _settings_client.network.max_download_time) { IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because it took longer than {} ticks to download the map.", cs->client_id, cs->GetClientIP(), _settings_client.network.max_download_time); - cs->SendError(NETWORK_ERROR_TIMEOUT_MAP); + cs->SendError(NetworkErrorCode::TimeoutMap); continue; } break; @@ -1826,7 +1826,7 @@ void NetworkServer_Tick(bool send_frame) /* The map has been sent, so this is for loading the map and syncing up. */ if (lag > _settings_client.network.max_join_time) { IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because it took longer than {} ticks to join.", cs->client_id, cs->GetClientIP(), _settings_client.network.max_join_time); - cs->SendError(NETWORK_ERROR_TIMEOUT_JOIN); + cs->SendError(NetworkErrorCode::TimeoutJoin); continue; } break; @@ -1835,7 +1835,7 @@ void NetworkServer_Tick(bool send_frame) /* These don't block? */ if (lag > _settings_client.network.max_password_time) { IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because it took longer than {} ticks to enter the password.", cs->client_id, cs->GetClientIP(), _settings_client.network.max_password_time); - cs->SendError(NETWORK_ERROR_TIMEOUT_PASSWORD); + cs->SendError(NetworkErrorCode::TimeoutPassword); continue; } break; @@ -2079,7 +2079,7 @@ void NetworkServerSendRcon(ClientID client_id, TextColour colour_code, std::stri void NetworkServerKickClient(ClientID client_id, std::string_view reason) { if (client_id == CLIENT_ID_SERVER) return; - NetworkClientSocket::GetByClientID(client_id)->SendError(NETWORK_ERROR_KICKED, reason); + NetworkClientSocket::GetByClientID(client_id)->SendError(NetworkErrorCode::Kicked, reason); } /** diff --git a/src/network/network_type.h b/src/network/network_type.h index 3131b2663b..2621dbe32f 100644 --- a/src/network/network_type.h +++ b/src/network/network_type.h @@ -97,36 +97,34 @@ enum NetworkAction : uint8_t { * The error codes we send around in the protocols. * @warning The values of the enum items are part of the admin network API. Only append at the end. */ -enum NetworkErrorCode : uint8_t { - NETWORK_ERROR_GENERAL, // Try to use this one like never +enum class NetworkErrorCode : uint8_t { + General, ///< Fallback error code in case nothing matches. - /* Signals from clients */ - NETWORK_ERROR_DESYNC, - NETWORK_ERROR_SAVEGAME_FAILED, - NETWORK_ERROR_CONNECTION_LOST, - NETWORK_ERROR_ILLEGAL_PACKET, - NETWORK_ERROR_NEWGRF_MISMATCH, + Desync, ///< Client tells that they desynced. + SavegameFailed, ///< Client tells they could not load the savegame. + ConnectionLost, ///< Connection to the client was lost. + IllegalPacket, ///< A packet was received that has invalid content. + NewGRFMismatch, ///< Client does not have the right NewGRFs. - /* Signals from servers */ - NETWORK_ERROR_NOT_AUTHORIZED, - NETWORK_ERROR_NOT_EXPECTED, - NETWORK_ERROR_WRONG_REVISION, - NETWORK_ERROR_NAME_IN_USE, - NETWORK_ERROR_WRONG_PASSWORD, - NETWORK_ERROR_COMPANY_MISMATCH, // Happens in CLIENT_COMMAND - NETWORK_ERROR_KICKED, - NETWORK_ERROR_CHEATER, - NETWORK_ERROR_FULL, - NETWORK_ERROR_TOO_MANY_COMMANDS, - NETWORK_ERROR_TIMEOUT_PASSWORD, - NETWORK_ERROR_TIMEOUT_COMPUTER, - NETWORK_ERROR_TIMEOUT_MAP, - NETWORK_ERROR_TIMEOUT_JOIN, - NETWORK_ERROR_INVALID_CLIENT_NAME, - NETWORK_ERROR_NOT_ON_ALLOW_LIST, - NETWORK_ERROR_NO_AUTHENTICATION_METHOD_AVAILABLE, + NotAuthorized, ///< The client tried to do something there are not authorized to. + NotExpected, ///< The request/packet was not expected in the current state. + WrongRevision, ///< The client is using the wrong revision. + NameInUse, ///< The client has a duplicate name (and we couldn't make it unique). + WrongPassword, ///< The client entered a wrong password. + CompanyMismatch, ///< The client was impersonating another company. + Kicked, ///< The client got kicked. + Cheater, ///< The client is trying control companies in a way they are not supposed to. + ServerFull, ///< The server is full. + TooManyCommands, ///< The client has sent too many commands in a short time. + TimeoutPassword, ///< The client has timed out providing a password. + TimeoutComputer, ///< The client has timed out because the computer could not keep up with the server. + TimeoutMap, ///< The client has timed out because it took too long to download the map. + TimeoutJoin, ///< The client has timed out because getting up to speed with the server failed. + InvalidClientName, ///< The client tried to set an invalid name. + NotOnAllowList, ///< The client is not on the allow list. + NoAuthenticationMethodAvailable, ///< The client and server could not find a common authentication method. - NETWORK_ERROR_END, + /* When adding elements to this enumeration, update the mapping in GetLongNetworkErrorString and GetNetworkErrorMsg. */ }; /**