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