Remove unused ConnectionCommand::sendToAll function. NetworkPacket::oldForgePacket...
[oweals/minetest.git] / src / network / networkpacket.cpp
1 /*
2 Minetest
3 Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #include "networkpacket.h"
21 #include "debug.h"
22 #include "exceptions.h"
23 #include "util/serialize.h"
24
25 NetworkPacket::NetworkPacket(u8 *data, u32 datasize, u16 peer_id):
26 m_read_offset(0), m_peer_id(peer_id)
27 {
28         m_read_offset = 0;
29         m_datasize = datasize - 2;
30
31         // split command and datas
32         m_command = readU16(&data[0]);
33         m_data = std::vector<u8>(&data[2], &data[2 + m_datasize]);
34 }
35
36 NetworkPacket::NetworkPacket(u16 command, u32 datasize, u16 peer_id):
37 m_datasize(datasize), m_read_offset(0), m_command(command), m_peer_id(peer_id)
38 {
39         m_data.resize(m_datasize);
40 }
41
42 NetworkPacket::NetworkPacket(u16 command, u32 datasize):
43 m_datasize(datasize), m_read_offset(0), m_command(command), m_peer_id(0)
44 {
45         m_data.resize(m_datasize);
46 }
47
48 NetworkPacket::~NetworkPacket()
49 {
50         m_data.clear();
51 }
52
53 char* NetworkPacket::getString(u32 from_offset)
54 {
55         if (from_offset >= m_datasize)
56                 throw SerializationError("Malformed packet read");
57
58         return (char*)&m_data[from_offset];
59 }
60
61 void NetworkPacket::putRawString(const char* src, u32 len)
62 {
63         if (m_read_offset + len * sizeof(char) >= m_datasize) {
64                 m_datasize += len * sizeof(char);
65                 m_data.resize(m_datasize);
66         }
67
68         memcpy(&m_data[m_read_offset], src, len);
69         m_read_offset += len;
70 }
71
72 NetworkPacket& NetworkPacket::operator>>(std::string& dst)
73 {
74         u16 strLen = readU16(&m_data[m_read_offset]);
75         m_read_offset += sizeof(u16);
76
77         dst.clear();
78
79         if (strLen == 0) {
80                 return *this;
81         }
82
83         dst.reserve(strLen);
84         dst.append((char*)&m_data[m_read_offset], strLen);
85
86         m_read_offset += strLen * sizeof(char);
87         return *this;
88 }
89
90 NetworkPacket& NetworkPacket::operator<<(std::string src)
91 {
92         u16 msgsize = src.size();
93         if (msgsize > 0xFFFF) {
94                 msgsize = 0xFFFF;
95         }
96
97         *this << msgsize;
98
99         if (m_read_offset + msgsize * sizeof(char) >= m_datasize) {
100                 m_datasize += msgsize * sizeof(char);
101                 m_data.resize(m_datasize);
102         }
103
104         memcpy(&m_data[m_read_offset], src.c_str(), msgsize);
105         m_read_offset += msgsize;
106
107         return *this;
108 }
109
110 void NetworkPacket::putLongString(std::string src)
111 {
112         u32 msgsize = src.size();
113         if (msgsize > 0xFFFFFFFF) {
114                 msgsize = 0xFFFFFFFF;
115         }
116
117         *this << msgsize;
118
119         if (m_read_offset + msgsize * sizeof(char) >= m_datasize) {
120                 m_datasize += msgsize * sizeof(char);
121                 m_data.resize(m_datasize);
122         }
123
124         memcpy(&m_data[m_read_offset], src.c_str(), msgsize);
125         m_read_offset += msgsize;
126 }
127
128 NetworkPacket& NetworkPacket::operator>>(std::wstring& dst)
129 {
130         u16 strLen = readU16(&m_data[m_read_offset]);
131         m_read_offset += sizeof(u16);
132
133         dst.clear();
134
135         if (strLen == 0) {
136                 return *this;
137         }
138
139         dst.reserve(strLen);
140         for(u16 i=0; i<strLen; i++) {
141                 wchar_t c16 = readU16(&m_data[m_read_offset]);
142                 dst.append(&c16, 1);
143                 m_read_offset += sizeof(u16);
144         }
145
146         return *this;
147 }
148
149 NetworkPacket& NetworkPacket::operator<<(std::wstring src)
150 {
151         u16 msgsize = src.size();
152         if (msgsize > 0xFFFF) {
153                 msgsize = 0xFFFF;
154         }
155
156         *this << msgsize;
157
158         // Write string
159         for (u16 i=0; i<msgsize; i++) {
160                 *this << (u16) src[i];
161         }
162
163         return *this;
164 }
165
166 std::string NetworkPacket::readLongString()
167 {
168         u32 strLen = readU32(&m_data[m_read_offset]);
169         m_read_offset += sizeof(u32);
170
171         if (strLen == 0) {
172                 return "";
173         }
174
175         std::string dst;
176
177         dst.reserve(strLen);
178         dst.append((char*)&m_data[m_read_offset], strLen);
179
180         m_read_offset += strLen*sizeof(char);
181
182         return dst;
183 }
184
185 NetworkPacket& NetworkPacket::operator>>(char& dst)
186 {
187         if (m_read_offset >= m_datasize)
188                 throw SerializationError("Malformed packet read");
189
190         dst = readU8(&m_data[m_read_offset]);
191
192         incrOffset<char>();
193         return *this;
194 }
195
196 char NetworkPacket::getChar(u32 offset)
197 {
198         if (offset >= m_datasize)
199                 throw SerializationError("Malformed packet read");
200
201         return readU8(&m_data[offset]);
202 }
203
204 NetworkPacket& NetworkPacket::operator<<(char src)
205 {
206         checkDataSize<u8>();
207
208         writeU8(&m_data[m_read_offset], src);
209
210         incrOffset<char>();
211         return *this;
212 }
213
214 NetworkPacket& NetworkPacket::operator<<(u8 src)
215 {
216         checkDataSize<u8>();
217
218         writeU8(&m_data[m_read_offset], src);
219
220         incrOffset<u8>();
221         return *this;
222 }
223
224 NetworkPacket& NetworkPacket::operator<<(bool src)
225 {
226         checkDataSize<u8>();
227
228         writeU8(&m_data[m_read_offset], src);
229
230         incrOffset<u8>();
231         return *this;
232 }
233
234 NetworkPacket& NetworkPacket::operator<<(u16 src)
235 {
236         checkDataSize<u16>();
237
238         writeU16(&m_data[m_read_offset], src);
239
240         incrOffset<u16>();
241         return *this;
242 }
243
244 NetworkPacket& NetworkPacket::operator<<(u32 src)
245 {
246         checkDataSize<u32>();
247
248         writeU32(&m_data[m_read_offset], src);
249
250         incrOffset<u32>();
251         return *this;
252 }
253
254 NetworkPacket& NetworkPacket::operator<<(u64 src)
255 {
256         checkDataSize<u64>();
257
258         writeU64(&m_data[m_read_offset], src);
259
260         incrOffset<u64>();
261         return *this;
262 }
263
264 NetworkPacket& NetworkPacket::operator<<(float src)
265 {
266         checkDataSize<float>();
267
268         writeF1000(&m_data[m_read_offset], src);
269
270         incrOffset<float>();
271         return *this;
272 }
273
274 NetworkPacket& NetworkPacket::operator>>(bool& dst)
275 {
276         if (m_read_offset >= m_datasize)
277                 throw SerializationError("Malformed packet read");
278
279         dst = readU8(&m_data[m_read_offset]);
280
281         incrOffset<u8>();
282         return *this;
283 }
284
285 NetworkPacket& NetworkPacket::operator>>(u8& dst)
286 {
287         if (m_read_offset >= m_datasize)
288                 throw SerializationError("Malformed packet read");
289
290         dst = readU8(&m_data[m_read_offset]);
291
292         incrOffset<u8>();
293         return *this;
294 }
295
296 u8 NetworkPacket::getU8(u32 offset)
297 {
298         if (offset >= m_datasize)
299                 throw SerializationError("Malformed packet read");
300
301         return readU8(&m_data[offset]);
302 }
303
304 u8* NetworkPacket::getU8Ptr(u32 from_offset)
305 {
306         if (m_datasize == 0) {
307                 return NULL;
308         }
309
310         if (from_offset >= m_datasize)
311                 throw SerializationError("Malformed packet read");
312
313         return (u8*)&m_data[from_offset];
314 }
315
316 NetworkPacket& NetworkPacket::operator>>(u16& dst)
317 {
318         if (m_read_offset >= m_datasize)
319                 throw SerializationError("Malformed packet read");
320
321         dst = readU16(&m_data[m_read_offset]);
322
323         incrOffset<u16>();
324         return *this;
325 }
326
327 u16 NetworkPacket::getU16(u32 from_offset)
328 {
329         if (from_offset >= m_datasize)
330                 throw SerializationError("Malformed packet read");
331
332         return readU16(&m_data[from_offset]);
333 }
334
335 NetworkPacket& NetworkPacket::operator>>(u32& dst)
336 {
337         if (m_read_offset >= m_datasize)
338                 throw SerializationError("Malformed packet read");
339
340         dst = readU32(&m_data[m_read_offset]);
341
342         incrOffset<u32>();
343         return *this;
344 }
345
346 NetworkPacket& NetworkPacket::operator>>(u64& dst)
347 {
348         if (m_read_offset >= m_datasize)
349                 throw SerializationError("Malformed packet read");
350
351         dst = readU64(&m_data[m_read_offset]);
352
353         incrOffset<u64>();
354         return *this;
355 }
356
357 NetworkPacket& NetworkPacket::operator>>(float& dst)
358 {
359         if (m_read_offset >= m_datasize)
360                 throw SerializationError("Malformed packet read");
361
362         dst = readF1000(&m_data[m_read_offset]);
363
364         incrOffset<float>();
365         return *this;
366 }
367
368 NetworkPacket& NetworkPacket::operator>>(v2f& dst)
369 {
370         if (m_read_offset >= m_datasize)
371                 throw SerializationError("Malformed packet read");
372
373         dst = readV2F1000(&m_data[m_read_offset]);
374
375         incrOffset<v2f>();
376         return *this;
377 }
378
379 NetworkPacket& NetworkPacket::operator>>(v3f& dst)
380 {
381         if (m_read_offset >= m_datasize)
382                 throw SerializationError("Malformed packet read");
383
384         dst = readV3F1000(&m_data[m_read_offset]);
385
386         incrOffset<v3f>();
387         return *this;
388 }
389
390 NetworkPacket& NetworkPacket::operator>>(s16& dst)
391 {
392         if (m_read_offset >= m_datasize)
393                 throw SerializationError("Malformed packet read");
394
395         dst = readS16(&m_data[m_read_offset]);
396
397         incrOffset<s16>();
398         return *this;
399 }
400
401 NetworkPacket& NetworkPacket::operator<<(s16 src)
402 {
403         *this << (u16) src;
404         return *this;
405 }
406
407 NetworkPacket& NetworkPacket::operator>>(s32& dst)
408 {
409         if (m_read_offset >= m_datasize)
410                 throw SerializationError("Malformed packet read");
411
412         dst = readS32(&m_data[m_read_offset]);
413
414         incrOffset<s32>();
415         return *this;
416 }
417
418 NetworkPacket& NetworkPacket::operator<<(s32 src)
419 {
420         *this << (u32) src;
421         return *this;
422 }
423
424 NetworkPacket& NetworkPacket::operator>>(v3s16& dst)
425 {
426         if (m_read_offset >= m_datasize)
427                 throw SerializationError("Malformed packet read");
428
429         dst = readV3S16(&m_data[m_read_offset]);
430
431         incrOffset<v3s16>();
432         return *this;
433 }
434
435 NetworkPacket& NetworkPacket::operator>>(v2s32& dst)
436 {
437         dst = readV2S32(&m_data[m_read_offset]);
438
439         incrOffset<v2s32>();
440         return *this;
441 }
442
443 NetworkPacket& NetworkPacket::operator>>(v3s32& dst)
444 {
445         if (m_read_offset >= m_datasize)
446                 throw SerializationError("Malformed packet read");
447
448         dst = readV3S32(&m_data[m_read_offset]);
449
450         incrOffset<v3s32>();
451         return *this;
452 }
453
454 NetworkPacket& NetworkPacket::operator<<(v2f src)
455 {
456         *this << (float) src.X;
457         *this << (float) src.Y;
458         return *this;
459 }
460
461 NetworkPacket& NetworkPacket::operator<<(v3f src)
462 {
463         *this << (float) src.X;
464         *this << (float) src.Y;
465         *this << (float) src.Z;
466         return *this;
467 }
468
469 NetworkPacket& NetworkPacket::operator<<(v3s16 src)
470 {
471         *this << (s16) src.X;
472         *this << (s16) src.Y;
473         *this << (s16) src.Z;
474         return *this;
475 }
476
477 NetworkPacket& NetworkPacket::operator<<(v2s32 src)
478 {
479         *this << (s32) src.X;
480         *this << (s32) src.Y;
481         return *this;
482 }
483
484 NetworkPacket& NetworkPacket::operator<<(v3s32 src)
485 {
486         *this << (s32) src.X;
487         *this << (s32) src.Y;
488         *this << (s32) src.Z;
489         return *this;
490 }
491
492 NetworkPacket& NetworkPacket::operator>>(video::SColor& dst)
493 {
494         if (m_read_offset >= m_datasize)
495                 throw SerializationError("Malformed packet read");
496
497         dst = readARGB8(&m_data[m_read_offset]);
498
499         incrOffset<u32>();
500         return *this;
501 }
502
503 NetworkPacket& NetworkPacket::operator<<(video::SColor src)
504 {
505         checkDataSize<u32>();
506
507         writeU32(&m_data[m_read_offset], src.color);
508
509         incrOffset<u32>();
510         return *this;
511 }
512
513 Buffer<u8> NetworkPacket::oldForgePacket()
514 {
515         SharedBuffer<u8> sb(m_datasize + 2);
516         writeU16(&sb[0], m_command);
517
518         u8* datas = getU8Ptr(0);
519
520         if (datas != NULL)
521                 memcpy(&sb[2], datas, m_datasize);
522         return sb;
523 }