From f1bcf200505816e20da7f465ca9896cdc2668fcd Mon Sep 17 00:00:00 2001 From: Simon Jarrett Date: Wed, 12 Aug 2020 01:02:31 +0100 Subject: [PATCH] Refactor NetworkBase to use new JSON library --- src/openrct2/network/NetworkBase.cpp | 112 ++++++++++++--------------- src/openrct2/network/NetworkBase.h | 3 +- src/openrct2/network/network.h | 4 +- 3 files changed, 55 insertions(+), 64 deletions(-) diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 5798ff4a51..2d41c29de2 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -960,24 +960,23 @@ void NetworkBase::SaveGroups() platform_get_user_directory(path, nullptr, sizeof(path)); safe_strcat_path(path, "groups.json", sizeof(path)); - json_t* jsonGroupsCfg = json_object(); - json_t* jsonGroups = json_array(); + json_t jsonGroups = json_t::array(); for (auto& group : group_list) { - json_array_append_new(jsonGroups, group->ToJson()); + jsonGroups.push_back(group->ToJson()); } - json_object_set_new(jsonGroupsCfg, "default_group", json_integer(default_group)); - json_object_set_new(jsonGroupsCfg, "groups", jsonGroups); + json_t jsonGroupsCfg = { + { "default_group", default_group }, + { "groups", jsonGroups }, + }; try { - Json::WriteToFile(path, jsonGroupsCfg, JSON_INDENT(4) | JSON_PRESERVE_ORDER); + Json::WriteToFile(path, jsonGroupsCfg); } catch (const std::exception& ex) { log_error("Unable to save %s: %s", path, ex.what()); } - - json_decref(jsonGroupsCfg); } } @@ -1023,12 +1022,12 @@ void NetworkBase::LoadGroups() platform_get_user_directory(path, nullptr, sizeof(path)); safe_strcat_path(path, "groups.json", sizeof(path)); - json_t* json = nullptr; + json_t jsonGroupConfig; if (Platform::FileExists(path)) { try { - json = Json::ReadFromFile(path); + jsonGroupConfig = Json::ReadFromFile(path); } catch (const std::exception& e) { @@ -1036,28 +1035,26 @@ void NetworkBase::LoadGroups() } } - if (json == nullptr) + if (!jsonGroupConfig.is_object()) { SetupDefaultGroups(); } else { - json_t* json_groups = json_object_get(json, "groups"); - size_t groupCount = json_array_size(json_groups); - for (size_t i = 0; i < groupCount; i++) + json_t jsonGroups = jsonGroupConfig["groups"]; + if (jsonGroups.is_array()) { - json_t* jsonGroup = json_array_get(json_groups, i); - - auto newgroup = std::make_unique(NetworkGroup::FromJson(jsonGroup)); - group_list.push_back(std::move(newgroup)); + for (auto& jsonGroup : jsonGroups) + { + group_list.emplace_back(std::make_unique(NetworkGroup::FromJson(jsonGroup))); + } } - json_t* jsonDefaultGroup = json_object_get(json, "default_group"); - default_group = static_cast(json_integer_value(jsonDefaultGroup)); + + default_group = Json::GetNumber(jsonGroupConfig["default_group"]); if (GetGroupByID(default_group) == nullptr) { default_group = 0; } - json_decref(json); } // Host group should always contain all permissions. @@ -1594,37 +1591,35 @@ void NetworkBase::Server_Send_SETDISCONNECTMSG(NetworkConnection& connection, co connection.QueuePacket(std::move(packet)); } -json_t* NetworkBase::GetServerInfoAsJson() const +json_t NetworkBase::GetServerInfoAsJson() const { - json_t* obj = json_object(); - json_object_set_new(obj, "name", json_string(gConfigNetwork.server_name.c_str())); - json_object_set_new(obj, "requiresPassword", json_boolean(_password.size() > 0)); - json_object_set_new(obj, "version", json_string(network_get_version().c_str())); - json_object_set_new(obj, "players", json_integer(player_list.size())); - json_object_set_new(obj, "maxPlayers", json_integer(gConfigNetwork.maxplayers)); - json_object_set_new(obj, "description", json_string(gConfigNetwork.server_description.c_str())); - json_object_set_new(obj, "greeting", json_string(gConfigNetwork.server_greeting.c_str())); - json_object_set_new(obj, "dedicated", json_boolean(gOpenRCT2Headless)); - return obj; + json_t jsonObj = { + { "name", gConfigNetwork.server_name }, { "requiresPassword", _password.size() > 0 }, + { "version", network_get_version() }, { "players", player_list.size() }, + { "maxPlayers", gConfigNetwork.maxplayers }, { "description", gConfigNetwork.server_description }, + { "greeting", gConfigNetwork.server_greeting }, { "dedicated", gOpenRCT2Headless }, + }; + return jsonObj; } void NetworkBase::Server_Send_GAMEINFO(NetworkConnection& connection) { NetworkPacket packet(NetworkCommand::GameInfo); # ifndef DISABLE_HTTP - json_t* obj = GetServerInfoAsJson(); + json_t jsonObj = GetServerInfoAsJson(); // Provider details - json_t* jsonProvider = json_object(); - json_object_set_new(jsonProvider, "name", json_string(gConfigNetwork.provider_name.c_str())); - json_object_set_new(jsonProvider, "email", json_string(gConfigNetwork.provider_email.c_str())); - json_object_set_new(jsonProvider, "website", json_string(gConfigNetwork.provider_website.c_str())); - json_object_set_new(obj, "provider", jsonProvider); + json_t jsonProvider = { + { "name", gConfigNetwork.provider_name }, + { "email", gConfigNetwork.provider_email }, + { "website", gConfigNetwork.provider_website }, + }; - packet.WriteString(json_dumps(obj, 0)); + jsonObj["provider"] = jsonProvider; + + packet.WriteString(jsonObj.dump().c_str()); packet << _serverState.gamestateSnapshotsEnabled; - json_decref(obj); # endif connection.QueuePacket(std::move(packet)); } @@ -3178,32 +3173,27 @@ void NetworkBase::Client_Send_GAMEINFO() _serverConnection->QueuePacket(std::move(packet)); } -static std::string json_stdstring_value(const json_t* string) -{ - const char* cstr = json_string_value(string); - return cstr == nullptr ? std::string() : std::string(cstr); -} - void NetworkBase::Client_Handle_GAMEINFO([[maybe_unused]] NetworkConnection& connection, NetworkPacket& packet) { const char* jsonString = packet.ReadString(); packet >> _serverState.gamestateSnapshotsEnabled; - json_error_t error; - json_t* root = json_loads(jsonString, 0, &error); + json_t jsonData = Json::FromString(jsonString); - ServerName = json_stdstring_value(json_object_get(root, "name")); - ServerDescription = json_stdstring_value(json_object_get(root, "description")); - ServerGreeting = json_stdstring_value(json_object_get(root, "greeting")); - - json_t* jsonProvider = json_object_get(root, "provider"); - if (jsonProvider != nullptr) + if (jsonData.is_object()) { - ServerProviderName = json_stdstring_value(json_object_get(jsonProvider, "name")); - ServerProviderEmail = json_stdstring_value(json_object_get(jsonProvider, "email")); - ServerProviderWebsite = json_stdstring_value(json_object_get(jsonProvider, "website")); + ServerName = Json::GetString(jsonData["name"]); + ServerDescription = Json::GetString(jsonData["description"]); + ServerGreeting = Json::GetString(jsonData["greeting"]); + + json_t jsonProvider = jsonData["provider"]; + if (jsonProvider.is_object()) + { + ServerProviderName = Json::GetString(jsonProvider["name"]); + ServerProviderEmail = Json::GetString(jsonProvider["email"]); + ServerProviderWebsite = Json::GetString(jsonProvider["website"]); + } } - json_decref(root); network_chat_show_server_greeting(); } @@ -3977,7 +3967,7 @@ bool network_gamestate_snapshots_enabled() return network_get_server_state().gamestateSnapshotsEnabled; } -json_t* network_get_server_info_as_json() +json_t network_get_server_info_as_json() { return gNetwork.GetServerInfoAsJson(); } @@ -4242,8 +4232,8 @@ NetworkServerState_t network_get_server_state() { return NetworkServerState_t{}; } -json_t* network_get_server_info_as_json() +json_t network_get_server_info_as_json() { - return nullptr; + return {}; } #endif /* DISABLE_NETWORK */ diff --git a/src/openrct2/network/NetworkBase.h b/src/openrct2/network/NetworkBase.h index 09816cd485..113e9f0056 100644 --- a/src/openrct2/network/NetworkBase.h +++ b/src/openrct2/network/NetworkBase.h @@ -1,6 +1,7 @@ #pragma once #include "../actions/GameAction.h" +#include "../core/Json.hpp" #include "NetworkConnection.h" #include "NetworkGroup.h" #include "NetworkPlayer.h" @@ -42,7 +43,7 @@ public: // Common void AppendChatLog(const std::string& s); void CloseChatLog(); NetworkStats_t GetStats() const; - json_t* GetServerInfoAsJson() const; + json_t GetServerInfoAsJson() const; bool ProcessConnection(NetworkConnection& connection); void CloseConnection(); NetworkPlayer* AddPlayer(const std::string& name, const std::string& keyhash); diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 9fea9d4b1c..fbfa0dc24f 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -15,6 +15,7 @@ #define MAX_SERVER_DESCRIPTION_LENGTH 256 #include "../common.h" +#include "../core/Json.hpp" #include "../localisation/StringIds.h" #include "NetworkTypes.h" @@ -22,7 +23,6 @@ #include #include -struct json_t; struct GameAction; struct Peep; struct CoordsXYZ; @@ -117,4 +117,4 @@ std::string network_get_version(); NetworkStats_t network_get_stats(); NetworkServerState_t network_get_server_state(); -json_t* network_get_server_info_as_json(); +json_t network_get_server_info_as_json();