3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include "networkpacket.h"
23 #include "util/serialize.h"
25 NetworkPacket::NetworkPacket(u8 *data, u32 datasize, u16 peer_id):
29 m_datasize = datasize - 2;
31 // Copy data packet to remove opcode
32 m_data = new u8[m_datasize];
34 memcpy(m_data, &data[2], m_datasize);
37 NetworkPacket::~NetworkPacket()
42 char* NetworkPacket::getString(u32 from_offset)
44 assert(from_offset < m_datasize);
46 return (char*)&m_data[from_offset];
49 char NetworkPacket::getChar(u32 offset)
51 assert(offset < m_datasize);
53 return m_data[offset];
56 NetworkPacket& NetworkPacket::operator>>(std::string& dst)
58 u16 strLen = readU16(&m_data[m_read_offset]);
59 m_read_offset += sizeof(u16);
69 dst.append((char*)&m_data[m_read_offset], strLen);
71 m_read_offset += strLen*sizeof(char);
75 NetworkPacket& NetworkPacket::operator>>(std::wstring& dst)
77 u16 strLen = readU16(&m_data[m_read_offset]);
78 m_read_offset += sizeof(u16);
87 for(u16 i=0; i<strLen; i++) {
88 wchar_t c16 = readU16(&m_data[m_read_offset]);
90 m_read_offset += sizeof(u16);
96 std::string NetworkPacket::readLongString()
98 u32 strLen = readU32(&m_data[m_read_offset]);
99 m_read_offset += sizeof(u32);
108 dst.append((char*)&m_data[m_read_offset], strLen);
110 m_read_offset += strLen*sizeof(char);
115 NetworkPacket& NetworkPacket::operator>>(char& dst)
117 dst = getChar(m_read_offset);
119 m_read_offset += sizeof(char);
123 u8* NetworkPacket::getU8Ptr(u32 from_offset)
125 assert(from_offset < m_datasize);
127 return (u8*)&m_data[from_offset];
130 u8 NetworkPacket::getU8(u32 offset)
132 assert(offset < m_datasize);
134 return m_data[offset];
137 NetworkPacket& NetworkPacket::operator>>(u8& dst)
139 assert(m_read_offset < m_datasize);
140 dst = m_data[m_read_offset];
142 m_read_offset += sizeof(u8);
146 NetworkPacket& NetworkPacket::operator>>(bool& dst)
148 assert(m_read_offset < m_datasize);
149 dst = m_data[m_read_offset];
151 m_read_offset += sizeof(u8);
155 u16 NetworkPacket::getU16(u32 from_offset)
157 assert(from_offset < m_datasize);
159 return readU16(&m_data[from_offset]);
162 NetworkPacket& NetworkPacket::operator>>(u16& dst)
164 dst = getU16(m_read_offset);
166 m_read_offset += sizeof(u16);
170 u32 NetworkPacket::getU32(u32 from_offset)
172 assert(from_offset < m_datasize);
174 return readU32(&m_data[from_offset]);
177 NetworkPacket& NetworkPacket::operator>>(u32& dst)
179 dst = getU32(m_read_offset);
181 m_read_offset += sizeof(u32);
185 u64 NetworkPacket::getU64(u32 from_offset)
187 assert(from_offset < m_datasize);
189 return readU64(&m_data[from_offset]);
192 NetworkPacket& NetworkPacket::operator>>(u64& dst)
194 dst = getU64(m_read_offset);
196 m_read_offset += sizeof(u64);
200 float NetworkPacket::getF1000(u32 from_offset)
202 assert(from_offset < m_datasize);
204 return readF1000(&m_data[from_offset]);
207 NetworkPacket& NetworkPacket::operator>>(float& dst)
209 dst = getF1000(m_read_offset);
211 m_read_offset += sizeof(float);
215 NetworkPacket& NetworkPacket::operator>>(v2f& dst)
217 assert(m_read_offset < m_datasize);
219 dst = readV2F1000(&m_data[m_read_offset]);
221 m_read_offset += sizeof(v2f);
225 NetworkPacket& NetworkPacket::operator>>(v3f& dst)
227 assert(m_read_offset < m_datasize);
229 dst = readV3F1000(&m_data[m_read_offset]);
231 m_read_offset += sizeof(v3f);
235 s16 NetworkPacket::getS16(u32 from_offset)
237 assert(from_offset < m_datasize);
239 return readS16(&m_data[from_offset]);
242 NetworkPacket& NetworkPacket::operator>>(s16& dst)
244 dst = getS16(m_read_offset);
246 m_read_offset += sizeof(s16);
250 s32 NetworkPacket::getS32(u32 from_offset)
252 assert(from_offset < m_datasize);
254 return readS32(&m_data[from_offset]);
257 NetworkPacket& NetworkPacket::operator>>(s32& dst)
259 dst = getS32(m_read_offset);
261 m_read_offset += sizeof(s32);
265 NetworkPacket& NetworkPacket::operator>>(v2s32& dst)
267 dst = readV2S32(&m_data[m_read_offset]);
269 m_read_offset += sizeof(v2s32);
273 v3s16 NetworkPacket::getV3S16(u32 from_offset)
275 assert(from_offset < m_datasize);
277 return readV3S16(&m_data[from_offset]);
280 NetworkPacket& NetworkPacket::operator>>(v3s16& dst)
282 dst = getV3S16(m_read_offset);
284 m_read_offset += sizeof(v3s16);
288 v3s32 NetworkPacket::getV3S32(u32 from_offset)
290 assert(from_offset < m_datasize);
292 return readV3S32(&m_data[from_offset]);
295 NetworkPacket& NetworkPacket::operator>>(v3s32& dst)
297 dst = getV3S32(m_read_offset);
299 m_read_offset += sizeof(v3s32);