mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 19:03:43 +00:00
Sd0 gets a default constructor and Sd0::Compress(data), the raw sd0 bytes of some data (what the client reads for UGC files it downloads without 3D services). FromData compresses into a heap buffer big enough for a chunk that grows when deflated (it used a 256 KiB stack buffer, so random data failed and workers carried a large stack frame), and drops a half-written result. Tests: chunks as the 1.10.64 client inflates them, incompressible data, empty. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
1.6 KiB
C++
52 lines
1.6 KiB
C++
// Darkflame Universe
|
|
// Copyright 2025
|
|
|
|
#ifndef SD0_H
|
|
#define SD0_H
|
|
|
|
#include <fstream>
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <vector>
|
|
|
|
// Sd0 is comprised of multiple zlib compressed buffers stored in a row.
|
|
// The format starts with a SD0 header (see SD0_HEADER) followed by the size of a zlib buffer, and then the zlib buffer itself.
|
|
// This repeats until end of file
|
|
class Sd0 {
|
|
public:
|
|
using BinaryBuffer = std::vector<uint8_t>;
|
|
|
|
static inline const char* SD0_HEADER = "sd0\x01\xff";
|
|
|
|
/**
|
|
* @brief Max size of an inflated sd0 zlib chunk
|
|
*/
|
|
static constexpr inline size_t MAX_UNCOMPRESSED_CHUNK_SIZE = 1024 * 256;
|
|
|
|
// Empty, for FromData
|
|
Sd0() = default;
|
|
|
|
// Read the input buffer into an internal chunk stream to be used later
|
|
Sd0(std::istream& buffer);
|
|
|
|
// `data` compressed into an sd0 buffer, returned in its raw compressed form (what the client reads, e.g. the UGC
|
|
// files it downloads without 3D services); only the header when `data` is empty, empty when it can't be compressed
|
|
[[nodiscard]] static std::string Compress(std::string_view data);
|
|
|
|
// Uncompresses the entire Sd0 buffer and returns it as a string
|
|
[[nodiscard]] std::string GetAsStringUncompressed() const;
|
|
|
|
// Gets the Sd0 buffer as a stream in its raw compressed form
|
|
[[nodiscard]] std::stringstream GetAsStream() const;
|
|
|
|
// Gets the Sd0 buffer as a vector in its raw compressed form
|
|
[[nodiscard]] const std::vector<BinaryBuffer>& GetAsVector() const;
|
|
|
|
// Compress data into a Sd0 buffer
|
|
void FromData(const uint8_t* data, size_t bufferSize);
|
|
private:
|
|
std::vector<BinaryBuffer> m_Chunks{};
|
|
};
|
|
|
|
#endif //!SD0_H
|