Botcraft 1.21.4
Loading...
Searching...
No Matches
DNSMessage.hpp
Go to the documentation of this file.
1#pragma once
2
4
7
8using namespace ProtocolCraft;
9
10namespace Botcraft
11{
12 class DNSMessage : public NetworkType
13 {
14 public:
15 const std::vector<unsigned char>& GetIdentification() const
16 {
17 return identification;
18 }
19
20 char GetFlagQR() const
21 {
22 return qr;
23 }
24
25 char GetFlagOPCode() const
26 {
27 return opcode;
28 }
29
30 char GetFlagAA() const
31 {
32 return aa;
33 }
34
35 char GetFlagTC() const
36 {
37 return tc;
38 }
39
40 char GetFlagRD() const
41 {
42 return rd;
43 }
44
45 char GetFlagRA() const
46 {
47 return ra;
48 }
49
50 char GetFlagZ() const
51 {
52 return z;
53 }
54
55 char GetFlagRCode() const
56 {
57 return rcode;
58 }
59
60 short GetNumberQuestion() const
61 {
62 return number_question;
63 }
64
65 short GetNumberAnswer() const
66 {
67 return number_answer;
68 }
69
70 short GetNumberAuthority() const
71 {
72 return number_authority;
73 }
74
76 {
78 }
79
80 const std::vector<DNSQuestion>& GetQuestions() const
81 {
82 return questions;
83 }
84
85 const std::vector<DNSResourceRecord>& GetAnswers() const
86 {
87 return answers;
88 }
89
90 const std::vector<DNSResourceRecord>& GetAuthorities() const
91 {
92 return authorities;
93 }
94
95 const std::vector<DNSResourceRecord>& GetAdditionals() const
96 {
97 return additionals;
98 }
99
100
101 void SetIdentification(const std::vector<unsigned char>& identification_)
102 {
103 identification = identification_;
104 }
105
106 void SetFlagQR(const char qr_)
107 {
108 qr = qr_;
109 }
110
111 void SetFlagOPCode(const char opcode_)
112 {
113 opcode = opcode_;
114 }
115
116 void SetFlagAA(const char aa_)
117 {
118 aa = aa_;
119 }
120
121 void SetFlagTC(const char tc_)
122 {
123 tc = tc_;
124 }
125
126 void SetFlagRD(const char rd_)
127 {
128 rd = rd_;
129 }
130
131 void SetFlagRA(const char ra_)
132 {
133 ra = ra_;
134 }
135
136 void SetFlagZ(const char z_)
137 {
138 z = z_;
139 }
140
141 void SetFlagRCode(const char rcode_)
142 {
143 rcode = rcode_;
144 }
145
146 void SetNumberQuestion(const short number_question_)
147 {
148 number_question = number_question_;
149 }
150
151 void SetNumberAnswer(const short number_answer_)
152 {
153 number_answer = number_answer_;
154 }
155
156 void SetNumberAuthority(const short number_authority_)
157 {
158 number_authority = number_authority_;
159 }
160
161 void SetNumberAdditionalRR(const short number_additional_rr_)
162 {
163 number_additional_rr = number_additional_rr_;
164 }
165
166 void SetQuestions(const std::vector<DNSQuestion>& questions_)
167 {
168 questions = questions_;
169 }
170
171 void SetAnswers(const std::vector<DNSResourceRecord>& answers_)
172 {
173 answers = answers_;
174 }
175
176 void SetAuthorities(const std::vector<DNSResourceRecord>& authorities_)
177 {
178 authorities = authorities_;
179 }
180
181 void SetAdditionals(const std::vector<DNSResourceRecord>& additionals_)
182 {
183 additionals = additionals_;
184 }
185
186 protected:
187 virtual void ReadImpl(ReadIterator& iter, size_t& length) override
188 {
189 identification = ReadByteArray(iter, length, 2);
190 char flags0 = ReadData<char>(iter, length);
191 qr = (flags0 >> 7) & 0x01;
192 opcode = (flags0 >> 3) & 0x0F;
193 aa = (flags0 >> 2) & 0x01;
194 tc = (flags0 >> 1) & 0x01;
195 rd = flags0 & 0x01;
196
197 char flags1 = ReadData<char>(iter, length);
198 ra = (flags1 >> 7) & 0x01;
199 z = (flags1 >> 4) & 0x07;
200 rcode = flags1 & 0x0F;
201
202 number_question = ReadData<short>(iter, length);
203 number_answer = ReadData<short>(iter, length);
204 number_authority = ReadData<short>(iter, length);
205 number_additional_rr = ReadData<short>(iter, length);
206
207 questions = std::vector<DNSQuestion>(number_question);
208 for (int i = 0; i < number_question; ++i)
209 {
210 questions[i].Read(iter, length);
211 }
212
213 answers = std::vector<DNSResourceRecord>(number_answer);
214 for (int i = 0; i < number_answer; ++i)
215 {
216 answers[i].Read(iter, length);
217 }
218
219 authorities = std::vector<DNSResourceRecord>(number_authority);
220 for (int i = 0; i < number_authority; ++i)
221 {
222 authorities[i].Read(iter, length);
223 }
224
225 additionals = std::vector<DNSResourceRecord>(number_additional_rr);
226 for (int i = 0; i < number_additional_rr; ++i)
227 {
228 additionals[i].Read(iter, length);
229 }
230
231 }
232
233 virtual void WriteImpl(WriteContainer& container) const override
234 {
235 WriteByteArray(identification, container);
236
237 char flags0 = (qr << 7) | (opcode << 3) | (aa << 2) | (tc << 1) | rd;
238 WriteData<char>(flags0, container);
239
240 char flags1 = (ra << 7) | (z << 4) | opcode;
241 WriteData<char>(flags1, container);
242
243 WriteData<short>(number_question, container);
244 WriteData<short>(number_answer, container);
245 WriteData<short>(number_authority, container);
246 WriteData<short>(number_additional_rr, container);
247
248 for (int i = 0; i < questions.size(); ++i)
249 {
250 questions[i].Write(container);
251 }
252
253 for (int i = 0; i < answers.size(); ++i)
254 {
255 answers[i].Write(container);
256 }
257
258 for (int i = 0; i < authorities.size(); ++i)
259 {
260 authorities[i].Write(container);
261 }
262
263 for (int i = 0; i < additionals.size(); ++i)
264 {
265 additionals[i].Write(container);
266 }
267 }
268
269 virtual Json::Value SerializeImpl() const override
270 {
271 Json::Value output;
272
273 output["qr"] = qr;
274 output["opcode"] = opcode;
275 output["aa"] = aa;
276 output["tc"] = tc;
277 output["rd"] = rd;
278 output["ra"] = ra;
279 output["z"] = z;
280 output["rcode"] = rcode;
281 output["number_question"] = number_question;
282 output["number_answer"] = number_answer;
283 output["number_authority"] = number_authority;
284 output["number_additional_rr"] = number_additional_rr;
285
286 output["questions"] = Json::Array();
287 for (int i = 0; i < number_question; ++i)
288 {
289 output["questions"].push_back(questions[i].Serialize());
290 }
291
292 output["answers"] = Json::Array();
293 for (int i = 0; i < number_answer; ++i)
294 {
295 output["answers"].push_back(answers[i].Serialize());
296 }
297
298 output["authorities"] = Json::Array();
299 for (int i = 0; i < number_authority; ++i)
300 {
301 output["authorities"].push_back(authorities[i].Serialize());
302 }
303
304 output["additionals"] = Json::Array();
305 for (int i = 0; i < number_additional_rr; ++i)
306 {
307 output["additionals"].push_back(additionals[i].Serialize());
308 }
309
310 return output;
311 }
312
313 private:
314 std::vector<unsigned char> identification;
315
316 // Flags
317 char qr;
318 char opcode;
319 char aa;
320 char tc;
321 char rd;
322 char ra;
323 char z;
324 char rcode;
325
326
331
332 std::vector<DNSQuestion> questions;
333 std::vector<DNSResourceRecord> answers;
334 std::vector<DNSResourceRecord> authorities;
335 std::vector<DNSResourceRecord> additionals;
336
337 };
338}
char GetFlagOPCode() const
void SetAdditionals(const std::vector< DNSResourceRecord > &additionals_)
void SetIdentification(const std::vector< unsigned char > &identification_)
short GetNumberAdditionalRR() const
const std::vector< DNSResourceRecord > & GetAuthorities() const
const std::vector< unsigned char > & GetIdentification() const
const std::vector< DNSQuestion > & GetQuestions() const
void SetAnswers(const std::vector< DNSResourceRecord > &answers_)
void SetAuthorities(const std::vector< DNSResourceRecord > &authorities_)
void SetFlagOPCode(const char opcode_)
void SetQuestions(const std::vector< DNSQuestion > &questions_)
void SetFlagRA(const char ra_)
void SetFlagQR(const char qr_)
void SetFlagRCode(const char rcode_)
std::vector< DNSQuestion > questions
char GetFlagRCode() const
short GetNumberAnswer() const
void SetNumberAdditionalRR(const short number_additional_rr_)
short GetNumberAuthority() const
std::vector< DNSResourceRecord > authorities
std::vector< unsigned char > identification
char GetFlagZ() const
void SetFlagAA(const char aa_)
char GetFlagAA() const
void SetNumberAnswer(const short number_answer_)
char GetFlagQR() const
virtual Json::Value SerializeImpl() const override
short GetNumberQuestion() const
std::vector< DNSResourceRecord > additionals
std::vector< DNSResourceRecord > answers
char GetFlagRA() const
virtual void WriteImpl(WriteContainer &container) const override
void SetFlagZ(const char z_)
char GetFlagRD() const
void SetFlagRD(const char rd_)
const std::vector< DNSResourceRecord > & GetAdditionals() const
const std::vector< DNSResourceRecord > & GetAnswers() const
char GetFlagTC() const
void SetFlagTC(const char tc_)
virtual void ReadImpl(ReadIterator &iter, size_t &length) override
void SetNumberQuestion(const short number_question_)
void SetNumberAuthority(const short number_authority_)
Real class declaration, just a derived class of std::vector<Value>
Definition Json.hpp:180
Main class, basically a JsonVariant with extra utility functions it doesn't inherit JsonVariant direc...
Definition Json.hpp:45
void push_back(const Value &value)
Definition Json.cpp:257
virtual Json::Value Serialize() const
std::vector< unsigned char > ReadByteArray(ReadIterator &iter, size_t &length, const size_t desired_length)
std::vector< unsigned char > WriteContainer
std::vector< unsigned char >::const_iterator ReadIterator
void WriteByteArray(const std::vector< unsigned char > &my_array, WriteContainer &container)