1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 19:13:07 +01:00

Refactor NetworkBase to use new JSON library

This commit is contained in:
Simon Jarrett
2020-08-12 01:02:31 +01:00
parent 324e94e6ce
commit f1bcf20050
3 changed files with 55 additions and 64 deletions

View File

@@ -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>(NetworkGroup::FromJson(jsonGroup));
group_list.push_back(std::move(newgroup));
for (auto& jsonGroup : jsonGroups)
{
group_list.emplace_back(std::make_unique<NetworkGroup>(NetworkGroup::FromJson(jsonGroup)));
}
}
json_t* jsonDefaultGroup = json_object_get(json, "default_group");
default_group = static_cast<uint8_t>(json_integer_value(jsonDefaultGroup));
default_group = Json::GetNumber<uint8_t>(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 */

View File

@@ -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);

View File

@@ -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 <string>
#include <vector>
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();