13 std::is_base_of<Steam::Internal::ISteamSerializableMessage, TBody>::value,
14 "TBody must implement ISteamSerializableMessage");
18 explicit Msg(
int payloadReserve = 0) {
19 Payload().reserve(payloadReserve);
21 Header.SetEMsg(Body.GetEMsg());
24 Msg(
const Msg<TBody>& other,
int payloadReserve = 0) : Msg(payloadReserve) {
25 Header.targetJobID = other.Header.sourceJobID;
32 throw std::runtime_error(
"Msg<TBody> used for wrong packet type");
34 Header = packetMsg->header;
36 const std::vector<byte>& data = packetMsg->GetData();
37 size_t offset = packetMsg->bodyOffset;
39 Steam::Utils::Stream stream(data, offset);
41 Body.Deserialize(stream);
43 if (offset < data.size()) {
44 Payload().insert(Payload().end(), data.begin() + offset, data.end());
49 bool IsProto()
const override {
return false; }
51 Steam::Internal::Enums::EMsg MsgType()
const override {
return Header.Msg; }
53 std::vector<byte> Serialize()
const override {
54 Steam::Utils::Stream stream;
56 Header.Serialize(stream);
57 Body.Serialize(stream);
58 stream.Write(Payload().data(), Payload().size());
60 return stream.MoveBuffer();
65 Steam::Internal::MsgHdrProtoBuf> {
67 explicit MsgProtoHdr(
int payloadReserve = 0) {
68 Payload().reserve(payloadReserve);
71 explicit MsgProtoHdr(Steam::Internal::Enums::EMsg eMsg,
72 int payloadReserve = 64) {
73 Payload().reserve(payloadReserve);
78 const auto* packetMsg =
83 throw std::runtime_error(
"MsgProto used for non-protobuf packet");
85 Header = packetMsg->header;
89 bool IsProto()
const override {
return true; }
91 Steam::Internal::Enums::EMsg MsgType()
const override {
return Header.Msg; }
93 std::vector<byte> Serialize()
const override {
94 throw std::runtime_error(
95 "MsgProtoHdr is read-only. Use MsgProto<TBody> to serialize.");
100class MsgProto :
public MsgProtoHdr {
105 explicit MsgProto(Steam::Internal::Enums::EMsg eMsg,
int payloadReserve = 0)
106 : MsgProtoHdr(payloadReserve) {
107 Header.SetEMsg(eMsg);
110 MsgProto(Steam::Internal::Enums::EMsg eMsg,
112 Steam::Internal::MsgHdrProtoBuf>& msg,
113 int payloadReserve = 0)
114 : MsgProto(eMsg, payloadReserve) {
115 Header.proto.set_jobid_target(msg.Header.proto.jobid_source());
119 : MsgProto(packet.MsgType()) {
120 const auto* packetMsg =
125 throw std::runtime_error(
"MsgProto<TBody> used for non-protobuf packet");
127 Header = packetMsg->header;
129 const std::vector<byte>& data = packetMsg->GetData();
130 size_t offset = packetMsg->bodyOffset;
132 Steam::Utils::Stream stream(data, offset);
134 Body.ParseFromArray(data.data() + offset, data.size() - offset);
136 if (offset < data.size()) {
137 Payload().insert(Payload().end(), data.begin() + offset, data.end());
142 std::vector<byte> Serialize()
const override {
143 Steam::Utils::Stream stream;
145 Header.Serialize(stream);
148 if (!Body.SerializeToString(&data))
149 throw std::runtime_error(
"Failed to serialize protobuf body");
151 stream.Write(data.data(), data.size());
152 stream.Write(Payload().data(), Payload().size());
154 return stream.MoveBuffer();
157 void SetSourceJobID(uint64_t
id) { Header.proto.set_jobid_source(
id); }
159 void SetTargetJobID(uint64_t
id) { Header.proto.set_jobid_target(
id); }