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