#pragma once #include #include namespace sp { template DataBuffer MessageStream::ReadAndDecapsulate() { VarInt messageLength; messageLength.Read([this](std::uint8_t& data) { DataBuffer buffer = m_Stream->Read(1); data = *buffer.data(); }); std::size_t amount = messageLength.GetValue(); DataBuffer buffer = m_Stream->Read(amount); for (auto& enc : m_Encapsulators) { buffer = enc->Decapsulate(buffer); } return buffer; } template std::unique_ptr MessageStream::MakeMessage(DataBuffer& buffer, MessageIdType a_Id) { static const TMessageFactory FACTORY; auto message = FACTORY.CreateMessage(a_Id); message->Read(buffer); return message; } template std::unique_ptr MessageStream::ReadMessage(MessageIdType a_Id) { DataBuffer buffer = ReadAndDecapsulate(); return MakeMessage(buffer, a_Id); } template std::unique_ptr MessageStream::ReadMessage() { DataBuffer buffer = ReadAndDecapsulate(); VarInt messageId; buffer >> messageId; return MakeMessage(buffer, MessageIdType(messageId.GetValue())); } template void MessageStream::WriteMessage(const MessageBaseType& a_Message, bool a_WriteId) { DataBuffer buffer; if (a_WriteId) buffer << VarInt{static_cast(a_Message.GetId())}; buffer << a_Message.Write(); for (auto& enc : m_Encapsulators) { buffer = enc->Encapsulate(buffer); } DataBuffer header; header << VarInt{buffer.GetSize()}; m_Stream->Write(header); m_Stream->Write(buffer); } } // namespace sp