From 5f9cc86ad25c6c12d811532f42e3adc7d304aa0e Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Wed, 26 Feb 2025 12:33:19 +0100 Subject: [PATCH 1/8] xmake: add target extensions deps --- xmake.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/xmake.lua b/xmake.lua index 79ca7d5..504b478 100644 --- a/xmake.lua +++ b/xmake.lua @@ -54,6 +54,13 @@ target("SimpleProtocolLib") add_headerfiles("include/(sp/" .. folder .. "/**.h)") end + -- adding extensions + for name, module in table.orderpairs(modules) do + if module.Deps and has_config(module.Option) then + add_deps("SimpleProtocolLib-" .. name) + end + end + -- we don't want extensions remove_files("src/sp/extensions/**.cpp") set_group("Library") -- 2.49.1 From 68fcd514a3afd137e80ca76f2d706fc5023466b3 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Wed, 26 Feb 2025 12:34:58 +0100 Subject: [PATCH 2/8] xmake: rename targets --- xmake.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xmake.lua b/xmake.lua index 504b478..2012f06 100644 --- a/xmake.lua +++ b/xmake.lua @@ -29,7 +29,7 @@ end -- Add modules targets for name, module in table.orderpairs(modules) do if module.Deps and has_config(module.Option) then - target("SimpleProtocolLib-" .. name) + target("SimpleProtocol-" .. name) add_includedirs("include") for _, include in table.orderpairs(module.Includes) do add_headerfiles(include) @@ -45,7 +45,7 @@ for name, module in table.orderpairs(modules) do end end -target("SimpleProtocolLib") +target("SimpleProtocol") add_includedirs("include") add_files("src/sp/**.cpp") @@ -57,7 +57,7 @@ target("SimpleProtocolLib") -- adding extensions for name, module in table.orderpairs(modules) do if module.Deps and has_config(module.Option) then - add_deps("SimpleProtocolLib-" .. name) + add_deps("SimpleProtocol-" .. name) end end @@ -75,7 +75,7 @@ for _, file in ipairs(os.files("test/**.cpp")) do add_files(file) add_includedirs("include") - add_deps("SimpleProtocolLib") + add_deps("SimpleProtocol") add_tests("compile_and_run") end -- 2.49.1 From 6a52b7fe2a66e8872eb669b64caaad5a4a00fbb0 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Wed, 26 Feb 2025 15:09:23 +0100 Subject: [PATCH 3/8] fix compression --- include/sp/extensions/Compress.h | 9 +------- include/sp/io/IOInterfaceImpl.inl | 7 ++++-- src/sp/extensions/Compress.cpp | 36 +++++++++++++++---------------- test/test_file.cpp | 2 +- test/test_io.cpp | 2 +- 5 files changed, 25 insertions(+), 31 deletions(-) diff --git a/include/sp/extensions/Compress.h b/include/sp/extensions/Compress.h index c5383ac..17d36c5 100644 --- a/include/sp/extensions/Compress.h +++ b/include/sp/extensions/Compress.h @@ -16,14 +16,7 @@ namespace zlib { * \param buffer the data to compress * \return the compressed data */ -DataBuffer Compress(const DataBuffer& buffer); - -/** - * \brief Reads the packet lenght and uncompress it - * \param buffer the data to uncompress - * \return the uncompressed data - */ -DataBuffer Decompress(DataBuffer& buffer); +DataBuffer Compress(const DataBuffer& buffer, std::size_t a_CompressionThreshold = 64); /** * \brief Uncompress some data diff --git a/include/sp/io/IOInterfaceImpl.inl b/include/sp/io/IOInterfaceImpl.inl index 501c30a..be73ff0 100644 --- a/include/sp/io/IOInterfaceImpl.inl +++ b/include/sp/io/IOInterfaceImpl.inl @@ -1,6 +1,7 @@ #pragma once #include +#include namespace sp { namespace io { @@ -15,8 +16,8 @@ template void Stream::SendMessage(const MessageBase& a_Message) { // TODO: process compress + encryption DataBuffer data = a_Message.Write(); - DataBuffer dataSize; - m_Interface.Write(dataSize << sp::VarInt{data.GetSize()} << data); + DataBuffer compressed = zlib::Compress(data); + m_Interface.Write(compressed); } template @@ -60,6 +61,8 @@ void Stream::RecieveMessages() { // TODO: process compress + encryption + buffer = zlib::Decompress(buffer, lenghtValue); + VarInt packetType; buffer >> packetType; diff --git a/src/sp/extensions/Compress.cpp b/src/sp/extensions/Compress.cpp index 8995f3f..2af8ac0 100644 --- a/src/sp/extensions/Compress.cpp +++ b/src/sp/extensions/Compress.cpp @@ -4,8 +4,6 @@ #include #include -#define COMPRESSION_THRESHOLD 64 - namespace sp { namespace zlib { @@ -13,8 +11,8 @@ static DataBuffer Inflate(const std::uint8_t* source, std::size_t size, std::siz DataBuffer result; result.Resize(uncompressedSize); - uncompress(reinterpret_cast(result.data()), reinterpret_cast(&uncompressedSize), - reinterpret_cast(source), static_cast(size)); + uncompress(static_cast(result.data()), static_cast(&uncompressedSize), static_cast(source), + static_cast(size)); assert(result.GetSize() == uncompressedSize); return result; @@ -25,20 +23,19 @@ static DataBuffer Deflate(const std::uint8_t* source, std::size_t size) { uLongf compressedSize = size; result.Resize(size); // Resize for the compressed data to fit into - compress( - reinterpret_cast(result.data()), &compressedSize, reinterpret_cast(source), static_cast(size)); + compress(static_cast(result.data()), &compressedSize, static_cast(source), static_cast(size)); result.Resize(compressedSize); // Resize to cut useless data return result; } -DataBuffer Compress(const DataBuffer& buffer) { +DataBuffer Compress(const DataBuffer& buffer, std::size_t a_CompressionThreshold) { DataBuffer packet; - if (buffer.GetSize() < COMPRESSION_THRESHOLD) { + if (buffer.GetSize() < a_CompressionThreshold) { // Don't compress since it's a small packet VarInt compressedDataLength = 0; - std::uint64_t packetLength = compressedDataLength.GetSerializedLength() + buffer.GetSize(); + VarInt packetLength = compressedDataLength.GetSerializedLength() + buffer.GetSize(); packet << packetLength; packet << compressedDataLength; @@ -49,11 +46,19 @@ DataBuffer Compress(const DataBuffer& buffer) { DataBuffer compressedData = Deflate(buffer.data(), buffer.GetSize()); VarInt uncompressedDataLength = buffer.GetSize(); - std::uint64_t packetLength = uncompressedDataLength.GetSerializedLength() + compressedData.GetSize(); + VarInt packetLength = uncompressedDataLength.GetSerializedLength() + compressedData.GetSize(); packet << packetLength; - packet << uncompressedDataLength; - packet.WriteSome(compressedData.data(), compressedData.GetSize()); + + if (compressedData.GetSize() >= buffer.GetSize()) { + // the compression is overkill so we don't send the compressed buffer + packet << VarInt{0}; + packet << buffer; + } else { + packet << uncompressedDataLength; + packet << compressedData; + } + return packet; } @@ -75,12 +80,5 @@ DataBuffer Decompress(DataBuffer& buffer, std::uint64_t packetLength) { return Inflate(buffer.data() + buffer.GetReadOffset(), compressedLength, uncompressedLength.GetValue()); } -DataBuffer Decompress(DataBuffer& buffer) { - std::uint64_t packetLength; - buffer >> packetLength; - - return Decompress(buffer, packetLength); -} - } // namespace zlib } // namespace sp diff --git a/test/test_file.cpp b/test/test_file.cpp index f05d696..0d92188 100644 --- a/test/test_file.cpp +++ b/test/test_file.cpp @@ -28,7 +28,7 @@ int main() { stream.SendMessage(KeepAlivePacket{96}); stream.SendMessage(KeepAlivePacket{69}); - stream.SendMessage(DisconnectPacket{"This is in the file !"}); + stream.SendMessage(DisconnectPacket{"This is in the fiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiile !"}); stream.RecieveMessages(); diff --git a/test/test_io.cpp b/test/test_io.cpp index 8bb78ec..c8affb6 100644 --- a/test/test_io.cpp +++ b/test/test_io.cpp @@ -33,7 +33,7 @@ int main() { stream.SendMessage(KeepAlivePacket{69}); stream.RecieveMessages(); - stream.SendMessage(DisconnectPacket{"I don't know"}); + stream.SendMessage(DisconnectPacket{"A valid reason"}); stream.RecieveMessages(); return 0; -- 2.49.1 From f6620dc52233fe4f144d7e3245ad3af5522e185f Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Thu, 27 Feb 2025 21:45:09 +0100 Subject: [PATCH 4/8] compress refactor --- include/sp/extensions/Compress.h | 6 +++++ include/sp/io/IOInterface.h | 11 +++++++++ include/sp/io/IOInterfaceImpl.inl | 38 ++++++++++++++++++++++++------- src/sp/extensions/Compress.cpp | 10 +------- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/include/sp/extensions/Compress.h b/include/sp/extensions/Compress.h index 17d36c5..9c9b078 100644 --- a/include/sp/extensions/Compress.h +++ b/include/sp/extensions/Compress.h @@ -9,6 +9,12 @@ #include namespace sp { +namespace option { + +struct ZlibCompress {}; + +} // namespace option + namespace zlib { /** diff --git a/include/sp/io/IOInterface.h b/include/sp/io/IOInterface.h index 3ab050b..b0f73cf 100644 --- a/include/sp/io/IOInterface.h +++ b/include/sp/io/IOInterface.h @@ -13,6 +13,13 @@ class IOInterface { void Write(const DataBuffer& a_Data); }; +template +class MessageEncapsulator { + public: + static DataBuffer Encapsulate(const DataBuffer& a_Data); + static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length); +}; + template class Stream { protected: @@ -32,6 +39,10 @@ class Stream { MessageDispatcher& GetDispatcher() { return m_Dispatcher; } + + private: + static DataBuffer Encapsulate(const DataBuffer& a_Data); + static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length); }; } // namespace io diff --git a/include/sp/io/IOInterfaceImpl.inl b/include/sp/io/IOInterfaceImpl.inl index be73ff0..6e7d108 100644 --- a/include/sp/io/IOInterfaceImpl.inl +++ b/include/sp/io/IOInterfaceImpl.inl @@ -1,10 +1,22 @@ #pragma once -#include #include +#include namespace sp { namespace io { + +template <> +class MessageEncapsulator { + public: + static DataBuffer Encapsulate(const DataBuffer& a_Data) { + return zlib::Compress(a_Data); + } + static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length) { + return zlib::Decompress(a_Data, a_Length); + } +}; + template Stream::Stream(IOInterface&& a_Interface) : m_Interface(std::move(a_Interface)) {} @@ -14,15 +26,15 @@ Stream::Stream(Stream void Stream::SendMessage(const MessageBase& a_Message) { - // TODO: process compress + encryption DataBuffer data = a_Message.Write(); - DataBuffer compressed = zlib::Compress(data); - m_Interface.Write(compressed); + DataBuffer encapsulated = Encapsulate(data); + DataBuffer finalData; + finalData << VarInt{encapsulated.GetSize()} << encapsulated; + m_Interface.Write(finalData); } template void Stream::RecieveMessages() { - // TODO: process compress + encryption while (true) { // reading the first VarInt part byte by byte @@ -59,9 +71,7 @@ void Stream::RecieveMessages() { DataBuffer buffer; buffer = m_Interface.Read(lenghtValue); - // TODO: process compress + encryption - - buffer = zlib::Decompress(buffer, lenghtValue); + buffer = Decapsulate(buffer, lenghtValue); VarInt packetType; buffer >> packetType; @@ -78,5 +88,17 @@ void Stream::RecieveMessages() { } } +template +DataBuffer Stream::Encapsulate(const DataBuffer& a_Data) { + // TODO: process compress + encryption + return MessageEncapsulator::Encapsulate(a_Data); +} + +template +DataBuffer Stream::Decapsulate(DataBuffer& a_Data, std::size_t a_Length) { + // TODO: process compress + encryption + return MessageEncapsulator::Decapsulate(a_Data, a_Length); +} + } // namespace io } // namespace sp \ No newline at end of file diff --git a/src/sp/extensions/Compress.cpp b/src/sp/extensions/Compress.cpp index 2af8ac0..3a73f74 100644 --- a/src/sp/extensions/Compress.cpp +++ b/src/sp/extensions/Compress.cpp @@ -34,21 +34,13 @@ DataBuffer Compress(const DataBuffer& buffer, std::size_t a_CompressionThreshold if (buffer.GetSize() < a_CompressionThreshold) { // Don't compress since it's a small packet - VarInt compressedDataLength = 0; - VarInt packetLength = compressedDataLength.GetSerializedLength() + buffer.GetSize(); - - packet << packetLength; - packet << compressedDataLength; + packet << VarInt{0}; packet << buffer; return packet; } DataBuffer compressedData = Deflate(buffer.data(), buffer.GetSize()); - VarInt uncompressedDataLength = buffer.GetSize(); - VarInt packetLength = uncompressedDataLength.GetSerializedLength() + compressedData.GetSize(); - - packet << packetLength; if (compressedData.GetSize() >= buffer.GetSize()) { // the compression is overkill so we don't send the compressed buffer -- 2.49.1 From 9fa023f7164907e9cc863843a6dad9ec0aff5da4 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Thu, 27 Feb 2025 22:50:51 +0100 Subject: [PATCH 5/8] generic encapsulator --- include/sp/extensions/Compress.h | 20 ++++++++- include/sp/io/IOInterface.h | 16 +++---- include/sp/io/IOInterfaceImpl.inl | 69 ++++++++++++++++++++----------- src/sp/extensions/Compress.cpp | 13 ++++++ test/test_file.cpp | 16 ++++--- 5 files changed, 96 insertions(+), 38 deletions(-) diff --git a/include/sp/extensions/Compress.h b/include/sp/extensions/Compress.h index 9c9b078..1ff2545 100644 --- a/include/sp/extensions/Compress.h +++ b/include/sp/extensions/Compress.h @@ -11,10 +11,17 @@ namespace sp { namespace option { -struct ZlibCompress {}; +struct ZlibCompress { + bool m_Enabled = true; + std::size_t m_CompressionThreshold = 64; +}; } // namespace option +} // namespace sp +#include + +namespace sp { namespace zlib { /** @@ -33,4 +40,15 @@ DataBuffer Compress(const DataBuffer& buffer, std::size_t a_CompressionThreshold DataBuffer Decompress(DataBuffer& buffer, std::uint64_t packetLength); } // namespace zlib + +namespace io { + +template <> +class MessageEncapsulator { + public: + static DataBuffer Encapsulate(const DataBuffer& a_Data, const option::ZlibCompress& a_Option); + static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length, const option::ZlibCompress& a_Option); +}; + +} // namespace io } // namespace sp diff --git a/include/sp/io/IOInterface.h b/include/sp/io/IOInterface.h index b0f73cf..451bb8d 100644 --- a/include/sp/io/IOInterface.h +++ b/include/sp/io/IOInterface.h @@ -13,14 +13,14 @@ class IOInterface { void Write(const DataBuffer& a_Data); }; -template +template class MessageEncapsulator { public: - static DataBuffer Encapsulate(const DataBuffer& a_Data); - static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length); + static DataBuffer Encapsulate(const DataBuffer& a_Data, const TOption& a_Option); + static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length, const TOption& a_Option); }; -template +template class Stream { protected: MessageDispatcher m_Dispatcher; @@ -33,16 +33,16 @@ class Stream { Stream(IOInterface&& a_Interface); Stream(Stream&& a_Stream); - void RecieveMessages(); - void SendMessage(const MessageBase& a_Message); + void RecieveMessages(const TOptions&... a_Options); + void SendMessage(const MessageBase& a_Message, const TOptions&... a_Options); MessageDispatcher& GetDispatcher() { return m_Dispatcher; } private: - static DataBuffer Encapsulate(const DataBuffer& a_Data); - static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length); + static DataBuffer Encapsulate(const DataBuffer& a_Data, const TOptions&... a_Options); + static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length, const TOptions&... a_Options); }; } // namespace io diff --git a/include/sp/io/IOInterfaceImpl.inl b/include/sp/io/IOInterfaceImpl.inl index 6e7d108..1e8c266 100644 --- a/include/sp/io/IOInterfaceImpl.inl +++ b/include/sp/io/IOInterfaceImpl.inl @@ -4,39 +4,60 @@ #include namespace sp { -namespace io { + +namespace details { + +template +struct MessageEncapsulatorPack {}; template <> -class MessageEncapsulator { - public: +struct MessageEncapsulatorPack<> { static DataBuffer Encapsulate(const DataBuffer& a_Data) { - return zlib::Compress(a_Data); + return a_Data; } static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length) { - return zlib::Decompress(a_Data, a_Length); + return a_Data; } }; -template -Stream::Stream(IOInterface&& a_Interface) : m_Interface(std::move(a_Interface)) {} +template +struct MessageEncapsulatorPack { + static DataBuffer Encapsulate(const DataBuffer& a_Data, const TOption& a_Option, const TOptions&... a_Options) { + DataBuffer data = io::MessageEncapsulator::Encapsulate(a_Data, a_Option); + return MessageEncapsulatorPack::Encapsulate(data, a_Options...); + } + static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length, const TOption& a_Option, const TOptions&... a_Options) { + DataBuffer data = io::MessageEncapsulator::Decapsulate(a_Data, a_Length, a_Option); + return MessageEncapsulatorPack::Decapsulate(data, data.GetSize(), a_Options...); + } +}; -template -Stream::Stream(Stream&& a_Stream) : +} // namespace details + +namespace io { + +template +Stream::Stream(IOInterface&& a_Interface) : + m_Interface(std::move(a_Interface)) {} + +template +Stream::Stream( + Stream&& a_Stream) : m_Dispatcher(std::move(a_Stream.m_Dispatcher)), m_Interface(std::move(a_Stream.m_Interface)) {} -template -void Stream::SendMessage(const MessageBase& a_Message) { +template +void Stream::SendMessage( + const MessageBase& a_Message, const TOptions&... a_Options) { DataBuffer data = a_Message.Write(); - DataBuffer encapsulated = Encapsulate(data); + DataBuffer encapsulated = Encapsulate(data, a_Options...); DataBuffer finalData; finalData << VarInt{encapsulated.GetSize()} << encapsulated; m_Interface.Write(finalData); } -template -void Stream::RecieveMessages() { +template +void Stream::RecieveMessages(const TOptions&... a_Options) { while (true) { - // reading the first VarInt part byte by byte std::uint64_t lenghtValue = 0; unsigned int readPos = 0; @@ -71,7 +92,7 @@ void Stream::RecieveMessages() { DataBuffer buffer; buffer = m_Interface.Read(lenghtValue); - buffer = Decapsulate(buffer, lenghtValue); + buffer = Decapsulate(buffer, lenghtValue, a_Options...); VarInt packetType; buffer >> packetType; @@ -88,16 +109,16 @@ void Stream::RecieveMessages() { } } -template -DataBuffer Stream::Encapsulate(const DataBuffer& a_Data) { - // TODO: process compress + encryption - return MessageEncapsulator::Encapsulate(a_Data); +template +DataBuffer Stream::Encapsulate( + const DataBuffer& a_Data, const TOptions&... a_Options) { + return details::MessageEncapsulatorPack::Encapsulate(a_Data, a_Options...); } -template -DataBuffer Stream::Decapsulate(DataBuffer& a_Data, std::size_t a_Length) { - // TODO: process compress + encryption - return MessageEncapsulator::Decapsulate(a_Data, a_Length); +template +DataBuffer Stream::Decapsulate( + DataBuffer& a_Data, std::size_t a_Length, const TOptions&... a_Options) { + return details::MessageEncapsulatorPack::Decapsulate(a_Data, a_Length, a_Options...); } } // namespace io diff --git a/src/sp/extensions/Compress.cpp b/src/sp/extensions/Compress.cpp index 3a73f74..10babb9 100644 --- a/src/sp/extensions/Compress.cpp +++ b/src/sp/extensions/Compress.cpp @@ -73,4 +73,17 @@ DataBuffer Decompress(DataBuffer& buffer, std::uint64_t packetLength) { } } // namespace zlib + +namespace io { + +DataBuffer MessageEncapsulator::Encapsulate(const DataBuffer& a_Data, const option::ZlibCompress& a_Option) { + return a_Option.m_Enabled ? zlib::Compress(a_Data, a_Option.m_CompressionThreshold) : a_Data; +} + +DataBuffer MessageEncapsulator::Decapsulate( + DataBuffer& a_Data, std::size_t a_Length, const option::ZlibCompress& a_Option) { + return a_Option.m_Enabled ? zlib::Decompress(a_Data, a_Length) : a_Data; +} + +} // namespace io } // namespace sp diff --git a/test/test_file.cpp b/test/test_file.cpp index 0d92188..f33a183 100644 --- a/test/test_file.cpp +++ b/test/test_file.cpp @@ -17,7 +17,7 @@ class CustomPacketHandler : public sp::PacketHandler { } }; -using FileStream = sp::io::Stream; +using FileStream = sp::io::Stream; int main() { auto handler = std::make_shared(); @@ -26,11 +26,17 @@ int main() { stream.GetDispatcher().RegisterHandler(PacketId::Disconnect, handler); stream.GetDispatcher().RegisterHandler(PacketId::KeepAlive, handler); - stream.SendMessage(KeepAlivePacket{96}); - stream.SendMessage(KeepAlivePacket{69}); - stream.SendMessage(DisconnectPacket{"This is in the fiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiile !"}); + auto zlibOptions = sp::option::ZlibCompress{}; - stream.RecieveMessages(); + stream.SendMessage(KeepAlivePacket{96}, zlibOptions); + stream.SendMessage(KeepAlivePacket{69}, zlibOptions); + stream.SendMessage( + DisconnectPacket{ + "This is in the " + "fiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiile !"}, + zlibOptions); + + stream.RecieveMessages(zlibOptions); return 0; } \ No newline at end of file -- 2.49.1 From 254de7a9ee3f05d132b75275b67a74103e9c69f5 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sat, 1 Mar 2025 11:12:18 +0100 Subject: [PATCH 6/8] enhance io options --- include/sp/common/VarInt.h | 2 ++ include/sp/io/IOInterface.h | 13 ++++++++++--- include/sp/io/IOInterfaceImpl.inl | 17 ++++++++++------- src/sp/extensions/Compress.cpp | 5 +++-- test/test_file.cpp | 22 +++++++++++----------- 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/include/sp/common/VarInt.h b/include/sp/common/VarInt.h index 8da0069..4d9e601 100644 --- a/include/sp/common/VarInt.h +++ b/include/sp/common/VarInt.h @@ -21,6 +21,8 @@ class VarInt { std::uint64_t m_Value; public: + static const std::uint64_t MAX_VALUE = static_cast(-1) >> 8; + VarInt() : m_Value(0) {} /** * \brief Construct a variable integer from a value diff --git a/include/sp/io/IOInterface.h b/include/sp/io/IOInterface.h index 451bb8d..b1e4a77 100644 --- a/include/sp/io/IOInterface.h +++ b/include/sp/io/IOInterface.h @@ -25,16 +25,23 @@ class Stream { protected: MessageDispatcher m_Dispatcher; IOInterface m_Interface; + std::tuple m_Options; using MessageBase = typename MessageDispatcher::MessageBaseType; public: Stream() {} - Stream(IOInterface&& a_Interface); + Stream(IOInterface&& a_Interface, TOptions&&... a_Options); Stream(Stream&& a_Stream); - void RecieveMessages(const TOptions&... a_Options); - void SendMessage(const MessageBase& a_Message, const TOptions&... a_Options); + void RecieveMessages(); + void SendMessage(const MessageBase& a_Message); + + + template + TOption& GetOption() { + return std::get(m_Options); + } MessageDispatcher& GetDispatcher() { return m_Dispatcher; diff --git a/include/sp/io/IOInterfaceImpl.inl b/include/sp/io/IOInterfaceImpl.inl index 1e8c266..539cf20 100644 --- a/include/sp/io/IOInterfaceImpl.inl +++ b/include/sp/io/IOInterfaceImpl.inl @@ -37,8 +37,8 @@ struct MessageEncapsulatorPack { namespace io { template -Stream::Stream(IOInterface&& a_Interface) : - m_Interface(std::move(a_Interface)) {} +Stream::Stream(IOInterface&& a_Interface, TOptions&&... a_Options) : + m_Interface(std::move(a_Interface)), m_Options(std::make_tuple(std::move(a_Options)...)) {} template Stream::Stream( @@ -46,17 +46,18 @@ Stream::Stream( m_Dispatcher(std::move(a_Stream.m_Dispatcher)), m_Interface(std::move(a_Stream.m_Interface)) {} template -void Stream::SendMessage( - const MessageBase& a_Message, const TOptions&... a_Options) { +void Stream::SendMessage(const MessageBase& a_Message) { DataBuffer data = a_Message.Write(); - DataBuffer encapsulated = Encapsulate(data, a_Options...); + DataBuffer encapsulated = std::apply([&data](const auto&... a_Options) { + return Encapsulate(data, a_Options...); + }, m_Options); DataBuffer finalData; finalData << VarInt{encapsulated.GetSize()} << encapsulated; m_Interface.Write(finalData); } template -void Stream::RecieveMessages(const TOptions&... a_Options) { +void Stream::RecieveMessages() { while (true) { // reading the first VarInt part byte by byte std::uint64_t lenghtValue = 0; @@ -92,7 +93,9 @@ void Stream::RecieveMessa DataBuffer buffer; buffer = m_Interface.Read(lenghtValue); - buffer = Decapsulate(buffer, lenghtValue, a_Options...); + buffer = std::apply([&buffer, lenghtValue](const auto&... a_Options) { + return Decapsulate(buffer, lenghtValue, a_Options...); + }, m_Options); VarInt packetType; buffer >> packetType; diff --git a/src/sp/extensions/Compress.cpp b/src/sp/extensions/Compress.cpp index 10babb9..e93c3f1 100644 --- a/src/sp/extensions/Compress.cpp +++ b/src/sp/extensions/Compress.cpp @@ -77,12 +77,13 @@ DataBuffer Decompress(DataBuffer& buffer, std::uint64_t packetLength) { namespace io { DataBuffer MessageEncapsulator::Encapsulate(const DataBuffer& a_Data, const option::ZlibCompress& a_Option) { - return a_Option.m_Enabled ? zlib::Compress(a_Data, a_Option.m_CompressionThreshold) : a_Data; + static constexpr std::size_t MAX_COMPRESS_THRESHOLD = VarInt::MAX_VALUE; + return zlib::Compress(a_Data, a_Option.m_Enabled ? a_Option.m_CompressionThreshold : MAX_COMPRESS_THRESHOLD); } DataBuffer MessageEncapsulator::Decapsulate( DataBuffer& a_Data, std::size_t a_Length, const option::ZlibCompress& a_Option) { - return a_Option.m_Enabled ? zlib::Decompress(a_Data, a_Length) : a_Data; + return zlib::Decompress(a_Data, a_Length); } } // namespace io diff --git a/test/test_file.cpp b/test/test_file.cpp index f33a183..2a89a3c 100644 --- a/test/test_file.cpp +++ b/test/test_file.cpp @@ -22,21 +22,21 @@ using FileStream = sp::io::Stream(); - FileStream stream(sp::io::File{"test.txt", sp::io::FileTag::In | sp::io::FileTag::Out}); + FileStream stream(sp::io::File{"test.txt", sp::io::FileTag::In | sp::io::FileTag::Out}, {}); stream.GetDispatcher().RegisterHandler(PacketId::Disconnect, handler); stream.GetDispatcher().RegisterHandler(PacketId::KeepAlive, handler); - auto zlibOptions = sp::option::ZlibCompress{}; + stream.SendMessage(KeepAlivePacket{96}); + stream.SendMessage(KeepAlivePacket{69}); + stream.SendMessage(DisconnectPacket{ + "This is in the " + "fiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiile !"}); + stream.GetOption().m_Enabled = false; + stream.SendMessage(DisconnectPacket{ + "This is in the " + "fiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiile !"}); - stream.SendMessage(KeepAlivePacket{96}, zlibOptions); - stream.SendMessage(KeepAlivePacket{69}, zlibOptions); - stream.SendMessage( - DisconnectPacket{ - "This is in the " - "fiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiile !"}, - zlibOptions); - - stream.RecieveMessages(zlibOptions); + stream.RecieveMessages(); return 0; } \ No newline at end of file -- 2.49.1 From e8441205a421f12dfa1896a0e7010e6d877ed78f Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sat, 1 Mar 2025 19:11:30 +0100 Subject: [PATCH 7/8] emplace (was insert) --- include/sp/common/DataBuffer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/sp/common/DataBuffer.h b/include/sp/common/DataBuffer.h index c387eb9..d9cf312 100644 --- a/include/sp/common/DataBuffer.h +++ b/include/sp/common/DataBuffer.h @@ -166,7 +166,7 @@ class DataBuffer { K newKey; V newValue; *this >> newKey >> newValue; - data.insert({newKey, newValue}); + data.emplace(newKey, newValue); } return *this; } -- 2.49.1 From 5a3197d3ded3f826d0844c353692e8e1f4d1a1f8 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sat, 1 Mar 2025 19:19:27 +0100 Subject: [PATCH 8/8] change decapsulate signature --- include/sp/extensions/Compress.h | 2 +- include/sp/io/IOInterface.h | 4 ++-- include/sp/io/IOInterfaceImpl.inl | 14 +++++++------- src/sp/extensions/Compress.cpp | 5 ++--- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/include/sp/extensions/Compress.h b/include/sp/extensions/Compress.h index 1ff2545..b3b06e3 100644 --- a/include/sp/extensions/Compress.h +++ b/include/sp/extensions/Compress.h @@ -47,7 +47,7 @@ template <> class MessageEncapsulator { public: static DataBuffer Encapsulate(const DataBuffer& a_Data, const option::ZlibCompress& a_Option); - static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length, const option::ZlibCompress& a_Option); + static DataBuffer Decapsulate(DataBuffer& a_Data, const option::ZlibCompress& a_Option); }; } // namespace io diff --git a/include/sp/io/IOInterface.h b/include/sp/io/IOInterface.h index b1e4a77..aca8cbd 100644 --- a/include/sp/io/IOInterface.h +++ b/include/sp/io/IOInterface.h @@ -17,7 +17,7 @@ template class MessageEncapsulator { public: static DataBuffer Encapsulate(const DataBuffer& a_Data, const TOption& a_Option); - static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length, const TOption& a_Option); + static DataBuffer Decapsulate(DataBuffer& a_Data, const TOption& a_Option); }; template @@ -49,7 +49,7 @@ class Stream { private: static DataBuffer Encapsulate(const DataBuffer& a_Data, const TOptions&... a_Options); - static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length, const TOptions&... a_Options); + static DataBuffer Decapsulate(DataBuffer& a_Data, const TOptions&... a_Options); }; } // namespace io diff --git a/include/sp/io/IOInterfaceImpl.inl b/include/sp/io/IOInterfaceImpl.inl index 539cf20..5aabee2 100644 --- a/include/sp/io/IOInterfaceImpl.inl +++ b/include/sp/io/IOInterfaceImpl.inl @@ -15,7 +15,7 @@ struct MessageEncapsulatorPack<> { static DataBuffer Encapsulate(const DataBuffer& a_Data) { return a_Data; } - static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length) { + static DataBuffer Decapsulate(DataBuffer& a_Data) { return a_Data; } }; @@ -26,9 +26,9 @@ struct MessageEncapsulatorPack { DataBuffer data = io::MessageEncapsulator::Encapsulate(a_Data, a_Option); return MessageEncapsulatorPack::Encapsulate(data, a_Options...); } - static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length, const TOption& a_Option, const TOptions&... a_Options) { - DataBuffer data = io::MessageEncapsulator::Decapsulate(a_Data, a_Length, a_Option); - return MessageEncapsulatorPack::Decapsulate(data, data.GetSize(), a_Options...); + static DataBuffer Decapsulate(DataBuffer& a_Data, const TOption& a_Option, const TOptions&... a_Options) { + DataBuffer data = io::MessageEncapsulator::Decapsulate(a_Data, a_Option); + return MessageEncapsulatorPack::Decapsulate(data, a_Options...); } }; @@ -94,7 +94,7 @@ void Stream::RecieveMessa buffer = m_Interface.Read(lenghtValue); buffer = std::apply([&buffer, lenghtValue](const auto&... a_Options) { - return Decapsulate(buffer, lenghtValue, a_Options...); + return Decapsulate(buffer, a_Options...); }, m_Options); VarInt packetType; @@ -120,8 +120,8 @@ DataBuffer Stream::Encaps template DataBuffer Stream::Decapsulate( - DataBuffer& a_Data, std::size_t a_Length, const TOptions&... a_Options) { - return details::MessageEncapsulatorPack::Decapsulate(a_Data, a_Length, a_Options...); + DataBuffer& a_Data, const TOptions&... a_Options) { + return details::MessageEncapsulatorPack::Decapsulate(a_Data, a_Options...); } } // namespace io diff --git a/src/sp/extensions/Compress.cpp b/src/sp/extensions/Compress.cpp index e93c3f1..7d50fd5 100644 --- a/src/sp/extensions/Compress.cpp +++ b/src/sp/extensions/Compress.cpp @@ -81,9 +81,8 @@ DataBuffer MessageEncapsulator::Encapsulate(const DataBuff return zlib::Compress(a_Data, a_Option.m_Enabled ? a_Option.m_CompressionThreshold : MAX_COMPRESS_THRESHOLD); } -DataBuffer MessageEncapsulator::Decapsulate( - DataBuffer& a_Data, std::size_t a_Length, const option::ZlibCompress& a_Option) { - return zlib::Decompress(a_Data, a_Length); +DataBuffer MessageEncapsulator::Decapsulate(DataBuffer& a_Data, const option::ZlibCompress& a_Option) { + return zlib::Decompress(a_Data, a_Data.GetSize()); } } // namespace io -- 2.49.1