18 std::vector<uint8_t> payload;
22 MsgBase(
size_t reserve = 0) { payload.reserve(reserve); }
25 std::vector<uint8_t>& Payload() {
return payload; }
26 const std::vector<uint8_t>& Payload()
const {
return payload; }
29 void WriteByte(uint8_t b) { payload.push_back(b); }
30 void WriteBytes(
const std::vector<uint8_t>& data) {
31 payload.insert(payload.end(), data.begin(), data.end());
34 void WriteValue(
const T& value) {
35 const uint8_t* ptr =
reinterpret_cast<const uint8_t*
>(&value);
36 payload.insert(payload.end(), ptr, ptr +
sizeof(T));
38 void WriteString(
const std::string& str) {
39 payload.insert(payload.end(), str.begin(), str.end());
41 void WriteNullTermString(
const std::string& str) {
48 if (readPos >= payload.size())
throw std::out_of_range(
"Read past end");
49 return payload[readPos++];
53 if (readPos +
sizeof(T) > payload.size())
54 throw std::out_of_range(
"Read past end");
56 std::memcpy(&val, payload.data() + readPos,
sizeof(T));
60 std::string ReadNullTermString() {
61 size_t start = readPos;
62 while (readPos < payload.size() && payload[readPos] != 0) readPos++;
63 std::string result(payload.begin() + start, payload.begin() + readPos);
64 if (readPos < payload.size()) readPos++;
68 void Seek(
size_t pos) { readPos = pos; }
69 size_t Tell()
const {
return readPos; }
74class MsgBaseHdr :
public MsgBase {
78 virtual bool IsProto()
const = 0;
79 virtual Steam::Internal::Enums::EMsg MsgType()
const = 0;
81 std::optional<Steam::Internal::SteamID> steam_id;
83 uint64_t targetJobID = 0;
84 uint64_t sourceJobID = 0;
86 MsgBaseHdr(
size_t reserve = 0) : MsgBase(reserve), Header() {}
88 virtual std::vector<uint8_t> Serialize()
const {
89 Steam::Utils::Stream stream;
90 Header.Serialize(stream);
91 stream.Write(payload);
92 return stream.MoveBuffer();
95 virtual ~MsgBaseHdr() =
default;