diff --git a/src/openrct2/interface/Chat.cpp b/src/openrct2/interface/Chat.cpp index 820352ccbe..27e52fae64 100644 --- a/src/openrct2/interface/Chat.cpp +++ b/src/openrct2/interface/Chat.cpp @@ -207,7 +207,7 @@ void chat_draw(rct_drawpixelinfo* dpi, uint8_t chatBackgroundColor) } } -void chat_history_add(const char* src) +void chat_history_add(std::string_view s) { // Format a timestamp time_t timer{}; @@ -217,7 +217,7 @@ void chat_history_add(const char* src) strcatftime(timeBuffer, sizeof(timeBuffer), "[%H:%M] ", tmInfo); std::string buffer = timeBuffer; - buffer += src; + buffer += s; // Add to history list int32_t index = _chatHistoryIndex % CHAT_HISTORY_SIZE; @@ -227,7 +227,7 @@ void chat_history_add(const char* src) _chatHistoryIndex++; // Log to file (src only as logging does its own timestamp) - network_append_chat_log(src); + network_append_chat_log(s); Mixer_Play_Effect(OpenRCT2::Audio::SoundId::NewsItem, 0, MIXER_VOLUME_MAX, 0.5f, 1.5f, true); } diff --git a/src/openrct2/interface/Chat.h b/src/openrct2/interface/Chat.h index a51cba25a8..40db7583b9 100644 --- a/src/openrct2/interface/Chat.h +++ b/src/openrct2/interface/Chat.h @@ -11,6 +11,8 @@ #include "../common.h" +#include + #define CHAT_HISTORY_SIZE 10 #define CHAT_INPUT_SIZE 1024 #define CHAT_MAX_MESSAGE_LENGTH 200 @@ -37,7 +39,7 @@ void chat_init(); void chat_update(); void chat_draw(rct_drawpixelinfo* dpi, uint8_t chatBackgroundColour); -void chat_history_add(const char* src); +void chat_history_add(std::string_view s); void chat_input(ChatInput input); int32_t chat_string_wrapped_get_height(void* args, int32_t width); diff --git a/src/openrct2/localisation/Formatting.cpp b/src/openrct2/localisation/Formatting.cpp index 464185b2f5..a3a6289311 100644 --- a/src/openrct2/localisation/Formatting.cpp +++ b/src/openrct2/localisation/Formatting.cpp @@ -619,6 +619,7 @@ namespace OpenRCT2 template void FormatArgument(FormatBuffer&, FormatToken, uint32_t); template void FormatArgument(FormatBuffer&, FormatToken, uint64_t); template void FormatArgument(FormatBuffer&, FormatToken, const char*); + template void FormatArgument(FormatBuffer&, FormatToken, std::string_view); bool IsRealNameStringId(rct_string_id id) { diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 581b125e5f..e88238c4cd 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -19,6 +19,7 @@ #include "../actions/PeepPickupAction.h" #include "../core/Guard.hpp" #include "../core/Json.hpp" +#include "../localisation/Formatting.h" #include "../platform/Platform2.h" #include "../scripting/ScriptEngine.h" #include "../ui/UiContext.h" @@ -1064,7 +1065,7 @@ std::string NetworkBase::BeginLog(const std::string& directory, const std::strin return Path::Combine(directory, midName, filename); } -void NetworkBase::AppendLog(std::ostream& fs, const std::string& s) +void NetworkBase::AppendLog(std::ostream& fs, std::string_view s) { if (fs.fail()) { @@ -1079,7 +1080,7 @@ void NetworkBase::AppendLog(std::ostream& fs, const std::string& s) auto tmInfo = localtime(&timer); if (strftime(buffer, sizeof(buffer), "[%Y/%m/%d %H:%M:%S] ", tmInfo) != 0) { - String::Append(buffer, sizeof(buffer), s.c_str()); + String::Append(buffer, sizeof(buffer), std::string(s).c_str()); String::Append(buffer, sizeof(buffer), PLATFORM_NEWLINE); fs.write(buffer, strlen(buffer)); @@ -1105,7 +1106,7 @@ void NetworkBase::BeginChatLog() # endif } -void NetworkBase::AppendChatLog(const std::string& s) +void NetworkBase::AppendChatLog(std::string_view s) { if (gConfigNetwork.log_chat && _chat_log_fs.is_open()) { @@ -2230,8 +2231,9 @@ void NetworkBase::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacke break; case NetworkAuth::BadVersion: { - const char* version = packet.ReadString(); - connection.SetLastDisconnectReason(STR_MULTIPLAYER_INCORRECT_SOFTWARE_VERSION, &version); + auto version = std::string(packet.ReadString()); + auto versionp = version.c_str(); + connection.SetLastDisconnectReason(STR_MULTIPLAYER_INCORRECT_SOFTWARE_VERSION, &versionp); connection.Disconnect(); break; } @@ -2261,9 +2263,9 @@ void NetworkBase::Client_Handle_AUTH(NetworkConnection& connection, NetworkPacke } } -void NetworkBase::Server_Client_Joined(const char* name, const std::string& keyhash, NetworkConnection& connection) +void NetworkBase::Server_Client_Joined(std::string_view name, const std::string& keyhash, NetworkConnection& connection) { - auto player = AddPlayer(name, keyhash); + auto player = AddPlayer(std::string(name), keyhash); connection.Player = player; if (player != nullptr) { @@ -2510,15 +2512,14 @@ void NetworkBase::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacke { if (connection.AuthStatus != NetworkAuth::Ok) { - const char* hostName = connection.Socket->GetHostName(); - - const char* gameversion = packet.ReadString(); - const char* name = packet.ReadString(); - const char* password = packet.ReadString(); - const char* pubkey = packet.ReadString(); + auto* hostName = connection.Socket->GetHostName(); + auto gameversion = packet.ReadString(); + auto name = packet.ReadString(); + auto password = packet.ReadString(); + auto pubkey = packet.ReadString(); uint32_t sigsize; packet >> sigsize; - if (pubkey == nullptr) + if (pubkey.empty()) { connection.AuthStatus = NetworkAuth::VerificationFailure; } @@ -2537,7 +2538,7 @@ void NetworkBase::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacke std::memcpy(signature.data(), signatureData, sigsize); - auto ms = MemoryStream(pubkey, strlen(pubkey)); + auto ms = MemoryStream(pubkey.data(), pubkey.size()); if (!connection.Key.LoadPublic(&ms)) { throw std::runtime_error("Failed to load public key."); @@ -2577,24 +2578,24 @@ void NetworkBase::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacke const NetworkGroup* group = GetGroupByID(GetGroupIDByHash(connection.Key.PublicKeyHash())); passwordless = group->CanPerformCommand(GameCommand::PasswordlessLogin); } - if (!gameversion || network_get_version() != gameversion) + if (gameversion != network_get_version()) { connection.AuthStatus = NetworkAuth::BadVersion; log_info("Connection %s: Bad version.", hostName); } - else if (!name) + else if (name.empty()) { connection.AuthStatus = NetworkAuth::BadName; log_info("Connection %s: Bad name.", connection.Socket->GetHostName()); } else if (!passwordless) { - if ((!password || strlen(password) == 0) && !_password.empty()) + if (password.empty() && !_password.empty()) { connection.AuthStatus = NetworkAuth::RequirePassword; log_info("Connection %s: Requires password.", hostName); } - else if (password && _password != password) + else if (!password.empty() && _password != password) { connection.AuthStatus = NetworkAuth::BadPassword; log_info("Connection %s: Bad password.", hostName); @@ -2830,10 +2831,10 @@ bool NetworkBase::SaveMap(IStream* stream, const std::vectorId, text)) @@ -3025,8 +3026,8 @@ void NetworkBase::Client_Handle_TICK([[maybe_unused]] NetworkConnection& connect if (flags & NETWORK_TICK_FLAG_CHECKSUMS) { - const char* text = packet.ReadString(); - if (text != nullptr) + auto text = packet.ReadString(); + if (!text.empty()) { tickData.spriteHash = text; } @@ -3110,12 +3111,10 @@ void NetworkBase::Client_Handle_PINGLIST([[maybe_unused]] NetworkConnection& con void NetworkBase::Client_Handle_SETDISCONNECTMSG(NetworkConnection& connection, NetworkPacket& packet) { - static std::string msg; - const char* disconnectmsg = packet.ReadString(); - if (disconnectmsg) + auto disconnectmsg = packet.ReadString(); + if (!disconnectmsg.empty()) { - msg = disconnectmsg; - connection.SetLastDisconnectReason(msg.c_str()); + connection.SetLastDisconnectReason(disconnectmsg); } } @@ -3147,32 +3146,31 @@ void NetworkBase::Client_Handle_GROUPLIST([[maybe_unused]] NetworkConnection& co void NetworkBase::Client_Handle_EVENT([[maybe_unused]] NetworkConnection& connection, NetworkPacket& packet) { - char text[256]; uint16_t eventType; packet >> eventType; switch (eventType) { case SERVER_EVENT_PLAYER_JOINED: { - const char* playerName = packet.ReadString(); - format_string(text, 256, STR_MULTIPLAYER_PLAYER_HAS_JOINED_THE_GAME, &playerName); - chat_history_add(text); + auto playerName = packet.ReadString(); + auto message = FormatStringId(STR_MULTIPLAYER_PLAYER_HAS_JOINED_THE_GAME, playerName); + chat_history_add(message.c_str()); break; } case SERVER_EVENT_PLAYER_DISCONNECTED: { - const char* playerName = packet.ReadString(); - const char* reason = packet.ReadString(); - const char* args[] = { playerName, reason }; - if (str_is_null_or_empty(reason)) + auto playerName = packet.ReadString(); + auto reason = packet.ReadString(); + std::string message; + if (reason.empty()) { - format_string(text, 256, STR_MULTIPLAYER_PLAYER_HAS_DISCONNECTED_NO_REASON, args); + message = FormatStringId(STR_MULTIPLAYER_PLAYER_HAS_DISCONNECTED_NO_REASON, playerName); } else { - format_string(text, 256, STR_MULTIPLAYER_PLAYER_HAS_DISCONNECTED_WITH_REASON, args); + message = FormatStringId(STR_MULTIPLAYER_PLAYER_HAS_DISCONNECTED_WITH_REASON, playerName, reason); } - chat_history_add(text); + chat_history_add(message.c_str()); break; } } @@ -3187,7 +3185,7 @@ void NetworkBase::Client_Send_GAMEINFO() void NetworkBase::Client_Handle_GAMEINFO([[maybe_unused]] NetworkConnection& connection, NetworkPacket& packet) { - const char* jsonString = packet.ReadString(); + auto jsonString = packet.ReadString(); packet >> _serverState.gamestateSnapshotsEnabled; json_t jsonData = Json::FromString(jsonString); @@ -3915,7 +3913,7 @@ void network_set_password(const char* password) network.SetPassword(password); } -void network_append_chat_log(const utf8* text) +void network_append_chat_log(std::string_view text) { auto& network = OpenRCT2::GetContext()->GetNetwork(); network.AppendChatLog(text); @@ -4216,7 +4214,7 @@ int32_t network_get_current_player_group_index() { return 0; } -void network_append_chat_log(const utf8* text) +void network_append_chat_log(std::string_view) { } void network_append_server_log(const utf8* text) diff --git a/src/openrct2/network/NetworkBase.h b/src/openrct2/network/NetworkBase.h index 73f31cf726..95d6dc8db2 100644 --- a/src/openrct2/network/NetworkBase.h +++ b/src/openrct2/network/NetworkBase.h @@ -43,9 +43,9 @@ public: // Common void SetPassword(const char* password); uint8_t GetDefaultGroup(); std::string BeginLog(const std::string& directory, const std::string& midName, const std::string& filenameFormat); - void AppendLog(std::ostream& fs, const std::string& s); + void AppendLog(std::ostream& fs, std::string_view s); void BeginChatLog(); - void AppendChatLog(const std::string& s); + void AppendChatLog(std::string_view text); void CloseChatLog(); NetworkStats_t GetStats() const; json_t GetServerInfoAsJson() const; @@ -102,7 +102,7 @@ public: // Server void Server_Handle_REQUEST_GAMESTATE(NetworkConnection& connection, NetworkPacket& packet); void Server_Handle_HEARTBEAT(NetworkConnection& connection, NetworkPacket& packet); void Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet); - void Server_Client_Joined(const char* name, const std::string& keyhash, NetworkConnection& connection); + void Server_Client_Joined(std::string_view name, const std::string& keyhash, NetworkConnection& connection); void Server_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet); void Server_Handle_GAME_ACTION(NetworkConnection& connection, NetworkPacket& packet); void Server_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); diff --git a/src/openrct2/network/NetworkConnection.cpp b/src/openrct2/network/NetworkConnection.cpp index 14039d7888..6419ae95a6 100644 --- a/src/openrct2/network/NetworkConnection.cpp +++ b/src/openrct2/network/NetworkConnection.cpp @@ -27,7 +27,6 @@ NetworkConnection::NetworkConnection() NetworkConnection::~NetworkConnection() { - delete[] _lastDisconnectReason; } NetworkReadPacket NetworkConnection::ReadPacket() @@ -192,23 +191,12 @@ bool NetworkConnection::ReceivedPacketRecently() const utf8* NetworkConnection::GetLastDisconnectReason() const { - return this->_lastDisconnectReason; + return this->_lastDisconnectReason.c_str(); } -void NetworkConnection::SetLastDisconnectReason(const utf8* src) +void NetworkConnection::SetLastDisconnectReason(std::string_view src) { - if (src == nullptr) - { - delete[] _lastDisconnectReason; - _lastDisconnectReason = nullptr; - return; - } - - if (_lastDisconnectReason == nullptr) - { - _lastDisconnectReason = new utf8[NETWORK_DISCONNECT_REASON_BUFFER_SIZE]; - } - String::Set(_lastDisconnectReason, NETWORK_DISCONNECT_REASON_BUFFER_SIZE, src); + _lastDisconnectReason = src; } void NetworkConnection::SetLastDisconnectReason(const rct_string_id string_id, void* args) diff --git a/src/openrct2/network/NetworkConnection.h b/src/openrct2/network/NetworkConnection.h index d5a94d5056..66bc5bb480 100644 --- a/src/openrct2/network/NetworkConnection.h +++ b/src/openrct2/network/NetworkConnection.h @@ -18,6 +18,7 @@ # include # include +# include # include class NetworkPlayer; @@ -58,13 +59,13 @@ public: bool ReceivedPacketRecently(); const utf8* GetLastDisconnectReason() const; - void SetLastDisconnectReason(const utf8* src); + void SetLastDisconnectReason(std::string_view src); void SetLastDisconnectReason(const rct_string_id string_id, void* args = nullptr); private: std::deque _outboundPackets; uint32_t _lastPacketTime = 0; - utf8* _lastDisconnectReason = nullptr; + std::string _lastDisconnectReason; void RecordPacketStats(const NetworkPacket& packet, bool sending); bool SendPacket(NetworkPacket& packet); diff --git a/src/openrct2/network/NetworkGroup.cpp b/src/openrct2/network/NetworkGroup.cpp index 50b7eb343e..a95d7c5098 100644 --- a/src/openrct2/network/NetworkGroup.cpp +++ b/src/openrct2/network/NetworkGroup.cpp @@ -69,7 +69,7 @@ const std::string& NetworkGroup::GetName() const return _name; } -void NetworkGroup::SetName(std::string name) +void NetworkGroup::SetName(std::string_view name) { _name = name; } diff --git a/src/openrct2/network/NetworkGroup.h b/src/openrct2/network/NetworkGroup.h index 0083a2406e..1038f163b7 100644 --- a/src/openrct2/network/NetworkGroup.h +++ b/src/openrct2/network/NetworkGroup.h @@ -15,6 +15,7 @@ #include #include +#include enum class NetworkPermission : uint32_t; @@ -34,7 +35,7 @@ public: static NetworkGroup FromJson(json_t& json); const std::string& GetName() const; - void SetName(std::string name); + void SetName(std::string_view name); void Read(NetworkPacket& packet); void Write(NetworkPacket& packet); diff --git a/src/openrct2/network/NetworkPacket.cpp b/src/openrct2/network/NetworkPacket.cpp index 078fd7eab6..44ed917bf4 100644 --- a/src/openrct2/network/NetworkPacket.cpp +++ b/src/openrct2/network/NetworkPacket.cpp @@ -66,9 +66,10 @@ void NetworkPacket::Write(const void* bytes, size_t size) Data.insert(Data.end(), src, src + size); } -void NetworkPacket::WriteString(const utf8* string) +void NetworkPacket::WriteString(std::string_view s) { - Write(reinterpret_cast(string), strlen(string) + 1); + Write(s.data(), s.size()); + Data.push_back(0); } const uint8_t* NetworkPacket::Read(size_t size) @@ -83,10 +84,10 @@ const uint8_t* NetworkPacket::Read(size_t size) return data; } -const utf8* NetworkPacket::ReadString() +std::string_view NetworkPacket::ReadString() { if (BytesRead >= Data.size()) - return nullptr; + return {}; const char* str = reinterpret_cast(Data.data() + BytesRead); @@ -98,12 +99,12 @@ const utf8* NetworkPacket::ReadString() } if (str[stringLen] != '\0') - return nullptr; + return {}; // Skip null terminator. BytesRead++; - return str; + return std::string_view(str, stringLen); } #endif diff --git a/src/openrct2/network/NetworkPacket.h b/src/openrct2/network/NetworkPacket.h index ffa464333a..be4c0fd3ae 100644 --- a/src/openrct2/network/NetworkPacket.h +++ b/src/openrct2/network/NetworkPacket.h @@ -39,10 +39,10 @@ struct NetworkPacket final bool CommandRequiresAuth(); const uint8_t* Read(size_t size); - const utf8* ReadString(); + std::string_view ReadString(); void Write(const void* bytes, size_t size); - void WriteString(const utf8* string); + void WriteString(std::string_view s); template NetworkPacket& operator>>(T& value) { diff --git a/src/openrct2/network/NetworkPlayer.cpp b/src/openrct2/network/NetworkPlayer.cpp index 09cdd51ee6..9492216eb8 100644 --- a/src/openrct2/network/NetworkPlayer.cpp +++ b/src/openrct2/network/NetworkPlayer.cpp @@ -15,7 +15,7 @@ # include "../localisation/Localisation.h" # include "NetworkPacket.h" -void NetworkPlayer::SetName(const std::string& name) +void NetworkPlayer::SetName(std::string_view name) { // 36 == 31 + strlen(" #255"); Name = name.substr(0, 36); @@ -23,7 +23,7 @@ void NetworkPlayer::SetName(const std::string& name) void NetworkPlayer::Read(NetworkPacket& packet) { - const utf8* name = packet.ReadString(); + auto name = packet.ReadString(); SetName(name); packet >> Id >> Flags >> Group >> LastAction >> LastActionCoord.x >> LastActionCoord.y >> LastActionCoord.z >> MoneySpent >> CommandsRan; diff --git a/src/openrct2/network/NetworkPlayer.h b/src/openrct2/network/NetworkPlayer.h index c589900b56..f68afa95e1 100644 --- a/src/openrct2/network/NetworkPlayer.h +++ b/src/openrct2/network/NetworkPlayer.h @@ -15,6 +15,7 @@ #include "../world/Map.h" #include +#include #include struct NetworkPacket; @@ -40,7 +41,7 @@ public: std::unordered_map CooldownTime; NetworkPlayer() = default; - void SetName(const std::string& name); + void SetName(std::string_view name); void Read(NetworkPacket& packet); void Write(NetworkPacket& packet); diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 310a04b339..3bde48a7ee 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -22,6 +22,7 @@ #include #include +#include #include struct GameAction; @@ -98,7 +99,7 @@ void network_send_password(const std::string& password); void network_set_password(const char* password); -void network_append_chat_log(const utf8* text); +void network_append_chat_log(std::string_view text); void network_append_server_log(const utf8* text); [[nodiscard]] const utf8* network_get_server_name(); [[nodiscard]] const utf8* network_get_server_description();