1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-21 14:02:59 +01:00

Part of #11159: save_for_network returns unique_ptr (#12163)

This commit is contained in:
frutiemax
2020-08-22 17:56:34 -04:00
committed by GitHub
parent 2660df85ed
commit 4165d64e60
2 changed files with 16 additions and 36 deletions

View File

@@ -1389,9 +1389,8 @@ void NetworkBase::Server_Send_MAP(NetworkConnection* connection)
objects = objManager.GetPackableObjects();
}
size_t out_size;
uint8_t* header = save_for_network(out_size, objects);
if (header == nullptr)
auto header = save_for_network(objects);
if (header.empty())
{
if (connection)
{
@@ -1401,11 +1400,11 @@ void NetworkBase::Server_Send_MAP(NetworkConnection* connection)
return;
}
size_t chunksize = CHUNK_SIZE;
for (size_t i = 0; i < out_size; i += chunksize)
for (size_t i = 0; i < header.size(); i += chunksize)
{
size_t datasize = std::min(chunksize, out_size - i);
size_t datasize = std::min(chunksize, header.size() - i);
NetworkPacket packet(NetworkCommand::Map);
packet << static_cast<uint32_t>(out_size) << static_cast<uint32_t>(i);
packet << static_cast<uint32_t>(header.size()) << static_cast<uint32_t>(i);
packet.Write(&header[i], datasize);
if (connection)
{
@@ -1416,13 +1415,11 @@ void NetworkBase::Server_Send_MAP(NetworkConnection* connection)
SendPacketToClients(packet);
}
}
free(header);
}
uint8_t* NetworkBase::save_for_network(size_t& out_size, const std::vector<const ObjectRepositoryItem*>& objects) const
std::vector<uint8_t> NetworkBase::save_for_network(const std::vector<const ObjectRepositoryItem*>& objects) const
{
uint8_t* header = nullptr;
out_size = 0;
std::vector<uint8_t> header;
bool RLEState = gUseRLE;
gUseRLE = false;
@@ -1430,7 +1427,7 @@ uint8_t* NetworkBase::save_for_network(size_t& out_size, const std::vector<const
if (!SaveMap(&ms, objects))
{
log_warning("Failed to export map.");
return nullptr;
return header;
}
gUseRLE = RLEState;
@@ -1440,34 +1437,17 @@ uint8_t* NetworkBase::save_for_network(size_t& out_size, const std::vector<const
auto compressed = util_zlib_deflate(static_cast<const uint8_t*>(data), size);
if (compressed != std::nullopt)
{
out_size = compressed->size();
header = reinterpret_cast<uint8_t*>(_strdup("open2_sv6_zlib"));
size_t header_len = strlen(reinterpret_cast<char*>(header)) + 1; // account for null terminator
header = static_cast<uint8_t*>(realloc(header, header_len + out_size));
if (header == nullptr)
{
log_error("Failed to allocate %u bytes.", header_len + out_size);
}
else
{
std::memcpy(&header[header_len], compressed->data(), out_size);
out_size += header_len;
log_verbose("Sending map of size %u bytes, compressed to %u bytes", size, out_size);
}
std::string headerString = "open2_sv6_zlib";
header.resize(headerString.size() + 1 + compressed->size());
std::memcpy(&header[0], headerString.c_str(), headerString.size() + 1);
std::memcpy(&header[headerString.size() + 1], compressed->data(), compressed->size());
log_verbose("Sending map of size %u bytes, compressed to %u bytes", size, headerString.size() + 1 + compressed->size());
}
else
{
log_warning("Failed to compress the data, falling back to non-compressed sv6.");
header = static_cast<uint8_t*>(malloc(size));
if (header == nullptr)
{
log_error("Failed to allocate %u bytes.", size);
}
else
{
out_size = size;
std::memcpy(header, data, size);
}
header.resize(size);
std::memcpy(header.data(), data, size);
}
return header;
}

View File

@@ -69,7 +69,7 @@ public: // Server
void UpdateServer();
void ServerClientDisconnected(std::unique_ptr<NetworkConnection>& connection);
bool SaveMap(OpenRCT2::IStream* stream, const std::vector<const ObjectRepositoryItem*>& objects) const;
uint8_t* save_for_network(size_t& out_size, const std::vector<const ObjectRepositoryItem*>& objects) const;
std::vector<uint8_t> save_for_network(const std::vector<const ObjectRepositoryItem*>& objects) const;
std::string MakePlayerNameUnique(const std::string& name);
// Packet dispatchers.