steam-min-cpp
Loading...
Searching...
No Matches
clientmsg.hpp
1// GPT
2#pragma once
3#include <steamclient/types/msgbase.hpp>
4#include <steamclient/types/packetbase.hpp>
5#include <steamclient/utilities/stream.hpp>
6
7
8namespace Steam::Messaging::ClientMessages {
9template <typename TBody>
10class Msg
11 : public Steam::Messaging::Messages::MsgBaseHdr<Steam::Internal::MsgHdr> {
12 static_assert(
13 std::is_base_of<Steam::Internal::ISteamSerializableMessage, TBody>::value,
14 "TBody must implement ISteamSerializableMessage");
15
16 public:
17 TBody Body;
18 explicit Msg(int payloadReserve = 0) {
19 Payload().reserve(payloadReserve);
20
21 Header.SetEMsg(Body.GetEMsg());
22 }
23
24 Msg(const Msg<TBody>& other, int payloadReserve = 0) : Msg(payloadReserve) {
25 Header.targetJobID = other.Header.sourceJobID;
26 }
27
28 explicit Msg(const Steam::Messaging::Packets::IPacketMsg& packet) {
30 dynamic_cast<const Steam::Messaging::Packets::PacketMsg*>(&packet);
31 if (!packetMsg)
32 throw std::runtime_error("Msg<TBody> used for wrong packet type");
33
34 Header = packetMsg->header;
35
36 const std::vector<byte>& data = packetMsg->GetData();
37 size_t offset = packetMsg->bodyOffset;
38
39 Steam::Utils::Stream stream(data, offset);
40
41 Body.Deserialize(stream);
42
43 if (offset < data.size()) {
44 Payload().insert(Payload().end(), data.begin() + offset, data.end());
45 }
46 }
47
48 public:
49 bool IsProto() const override { return false; }
50
51 Steam::Internal::Enums::EMsg MsgType() const override { return Header.Msg; }
52
53 std::vector<byte> Serialize() const override {
54 Steam::Utils::Stream stream;
55
56 Header.Serialize(stream);
57 Body.Serialize(stream);
58 stream.Write(Payload().data(), Payload().size());
59
60 return stream.MoveBuffer();
61 }
62};
63
64class MsgProtoHdr : public Steam::Messaging::Messages::MsgBaseHdr<
65 Steam::Internal::MsgHdrProtoBuf> {
66 public:
67 explicit MsgProtoHdr(int payloadReserve = 0) {
68 Payload().reserve(payloadReserve);
69 }
70
71 explicit MsgProtoHdr(Steam::Internal::Enums::EMsg eMsg,
72 int payloadReserve = 64) {
73 Payload().reserve(payloadReserve);
74 Header.SetEMsg(eMsg);
75 }
76
77 explicit MsgProtoHdr(const Steam::Messaging::Packets::IPacketMsg& packet) {
78 const auto* packetMsg =
80 &packet);
81
82 if (!packetMsg)
83 throw std::runtime_error("MsgProto used for non-protobuf packet");
84
85 Header = packetMsg->header;
86 }
87
88 public:
89 bool IsProto() const override { return true; }
90
91 Steam::Internal::Enums::EMsg MsgType() const override { return Header.Msg; }
92
93 std::vector<byte> Serialize() const override {
94 throw std::runtime_error(
95 "MsgProtoHdr is read-only. Use MsgProto<TBody> to serialize.");
96 }
97};
98
99template <typename TBody>
100class MsgProto : public MsgProtoHdr {
101 public:
102 TBody Body;
103
104 public:
105 explicit MsgProto(Steam::Internal::Enums::EMsg eMsg, int payloadReserve = 0)
106 : MsgProtoHdr(payloadReserve) {
107 Header.SetEMsg(eMsg);
108 }
109
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());
116 }
117
118 explicit MsgProto(const Steam::Messaging::Packets::IPacketMsg& packet)
119 : MsgProto(packet.MsgType()) {
120 const auto* packetMsg =
122 &packet);
123
124 if (!packetMsg)
125 throw std::runtime_error("MsgProto<TBody> used for non-protobuf packet");
126
127 Header = packetMsg->header;
128
129 const std::vector<byte>& data = packetMsg->GetData();
130 size_t offset = packetMsg->bodyOffset;
131
132 Steam::Utils::Stream stream(data, offset);
133
134 Body.ParseFromArray(data.data() + offset, data.size() - offset);
135
136 if (offset < data.size()) {
137 Payload().insert(Payload().end(), data.begin() + offset, data.end());
138 }
139 }
140
141 public:
142 std::vector<byte> Serialize() const override {
143 Steam::Utils::Stream stream;
144
145 Header.Serialize(stream);
146
147 std::string data;
148 if (!Body.SerializeToString(&data))
149 throw std::runtime_error("Failed to serialize protobuf body");
150
151 stream.Write(data.data(), data.size());
152 stream.Write(Payload().data(), Payload().size());
153
154 return stream.MoveBuffer();
155 }
156
157 void SetSourceJobID(uint64_t id) { Header.proto.set_jobid_source(id); }
158
159 void SetTargetJobID(uint64_t id) { Header.proto.set_jobid_target(id); }
160};
161} // namespace Steam::Messaging::ClientMessages
Definition packetbase.hpp:11
Definition packetbase.hpp:67