diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index 1752fee3fc..9e03a7be8d 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -519,7 +519,7 @@ public: NetworkRecvStatus ReceivePackets(); - const char *ReceiveCommand(Packet &p, CommandPacket &cp); + std::optional ReceiveCommand(Packet &p, CommandPacket &cp); void SendCommand(Packet &p, const CommandPacket &cp); bool IsPendingDeletion() const { return this->is_pending_deletion; } diff --git a/src/network/network_admin.h b/src/network/network_admin.h index 808852a393..4133aa4a33 100644 --- a/src/network/network_admin.h +++ b/src/network/network_admin.h @@ -85,7 +85,7 @@ public: * Get the name used by the listener. * @return the name to show in debug logs and the like. */ - static const char *GetName() + static std::string_view GetName() { return "admin"; } diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 38a5cc26cb..d27abd6ddf 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -915,14 +915,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET; CommandPacket cp; - const char *err = this->ReceiveCommand(p, cp); + auto err = this->ReceiveCommand(p, cp); cp.frame = p.Recv_uint32(); cp.my_cmd = p.Recv_bool(); Debug(net, 9, "Client::Receive_SERVER_COMMAND(): cmd={}, frame={}", cp.cmd, cp.frame); - if (err != nullptr) { - IConsolePrint(CC_WARNING, "Dropping server connection due to {}.", err); + if (err.has_value()) { + IConsolePrint(CC_WARNING, "Dropping server connection due to {}.", *err); return NETWORK_RECV_STATUS_MALFORMED_PACKET; } diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index 092ac1811f..09015783ea 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -358,22 +358,22 @@ void NetworkDistributeCommands() * Receives a command from the network. * @param p the packet to read from. * @param cp the struct to write the data to. - * @return an error message. When nullptr there has been no error. + * @return An error message, or std::nullopt there has been no error. */ -const char *NetworkGameSocketHandler::ReceiveCommand(Packet &p, CommandPacket &cp) +std::optional NetworkGameSocketHandler::ReceiveCommand(Packet &p, CommandPacket &cp) { cp.company = (CompanyID)p.Recv_uint8(); cp.cmd = static_cast(p.Recv_uint16()); - if (!IsValidCommand(cp.cmd)) return "invalid command"; + if (!IsValidCommand(cp.cmd)) return "invalid command"; if (GetCommandFlags(cp.cmd).Test(CommandFlag::Offline)) return "single-player only command"; cp.err_msg = p.Recv_uint16(); cp.data = _cmd_dispatch[cp.cmd].Sanitize(p.Recv_buffer()); uint8_t callback = p.Recv_uint8(); - if (callback >= _callback_table.size() || _cmd_dispatch[cp.cmd].Unpack[callback] == nullptr) return "invalid callback"; + if (callback >= _callback_table.size() || _cmd_dispatch[cp.cmd].Unpack[callback] == nullptr) return "invalid callback"; cp.callback = _callback_table[callback]; - return nullptr; + return std::nullopt; } /** diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index c9de31045d..6e9459c646 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1066,18 +1066,17 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet Debug(net, 9, "client[{}] Receive_CLIENT_COMMAND()", this->client_id); CommandPacket cp; - const char *err = this->ReceiveCommand(p, cp); + auto err = this->ReceiveCommand(p, cp); if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT; NetworkClientInfo *ci = this->GetInfo(); - if (err != nullptr) { - IConsolePrint(CC_WARNING, "Dropping client #{} (IP: {}) due to {}.", ci->client_id, this->GetClientIP(), err); + 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); } - 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); @@ -1925,7 +1924,7 @@ std::string_view ServerNetworkGameSocketHandler::GetClientIP() /** Show the status message of all clients on the console. */ void NetworkServerShowStatusToConsole() { - static const char * const stat_str[] = { + static const std::string_view stat_str[] = { "inactive", "authorizing", "identifying client", @@ -1943,9 +1942,8 @@ void NetworkServerShowStatusToConsole() NetworkClientInfo *ci = cs->GetInfo(); if (ci == nullptr) continue; uint lag = NetworkCalculateLag(cs); - const char *status; - status = (cs->status < (ptrdiff_t)lengthof(stat_str) ? stat_str[cs->status] : "unknown"); + std::string_view status = (cs->status < (ptrdiff_t)lengthof(stat_str) ? stat_str[cs->status] : "unknown"); IConsolePrint(CC_INFO, "Client #{} name: '{}' status: '{}' frame-lag: {} company: {} IP: {}", cs->client_id, ci->client_name, status, lag, ci->client_playas + (Company::IsValidID(ci->client_playas) ? 1 : 0), diff --git a/src/network/network_server.h b/src/network/network_server.h index caef5b53bf..7a4528dc30 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -110,7 +110,7 @@ public: * Get the name used by the listener. * @return the name to show in debug logs and the like. */ - static const char *GetName() + static std::string_view GetName() { return "server"; }