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