Line data Source code
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 : #ifndef NETWORKPACKET_HEADER
21 : #define NETWORKPACKET_HEADER
22 :
23 : #include "util/pointer.h"
24 : #include "util/numeric.h"
25 : #include "networkprotocol.h"
26 :
27 : class NetworkPacket
28 : {
29 :
30 : public:
31 : NetworkPacket(u16 command, u32 datasize, u16 peer_id);
32 : NetworkPacket(u16 command, u32 datasize);
33 2511 : NetworkPacket(): m_datasize(0), m_read_offset(0), m_command(0),
34 2511 : m_peer_id(0) {}
35 : ~NetworkPacket();
36 :
37 : void putRawPacket(u8 *data, u32 datasize, u16 peer_id);
38 :
39 : // Getters
40 2100 : u32 getSize() { return m_datasize; }
41 1321 : u16 getPeerId() { return m_peer_id; }
42 4624 : u16 getCommand() { return m_command; }
43 :
44 : // Returns a c-string without copying.
45 : // A better name for this would be getRawString()
46 : char* getString(u32 from_offset);
47 : // major difference to putCString(): doesn't write len into the buffer
48 : void putRawString(const char* src, u32 len);
49 :
50 : NetworkPacket& operator>>(std::string& dst);
51 : NetworkPacket& operator<<(std::string src);
52 :
53 : void putLongString(std::string src);
54 :
55 : NetworkPacket& operator>>(std::wstring& dst);
56 : NetworkPacket& operator<<(std::wstring src);
57 :
58 : std::string readLongString();
59 :
60 : char getChar(u32 offset);
61 : NetworkPacket& operator>>(char& dst);
62 : NetworkPacket& operator<<(char src);
63 :
64 : NetworkPacket& operator>>(bool& dst);
65 : NetworkPacket& operator<<(bool src);
66 :
67 : u8 getU8(u32 offset);
68 :
69 : NetworkPacket& operator>>(u8& dst);
70 : NetworkPacket& operator<<(u8 src);
71 :
72 : u8* getU8Ptr(u32 offset);
73 :
74 : u16 getU16(u32 from_offset);
75 : NetworkPacket& operator>>(u16& dst);
76 : NetworkPacket& operator<<(u16 src);
77 :
78 : NetworkPacket& operator>>(u32& dst);
79 : NetworkPacket& operator<<(u32 src);
80 :
81 : NetworkPacket& operator>>(u64& dst);
82 : NetworkPacket& operator<<(u64 src);
83 :
84 : NetworkPacket& operator>>(float& dst);
85 : NetworkPacket& operator<<(float src);
86 :
87 : NetworkPacket& operator>>(v2f& dst);
88 : NetworkPacket& operator<<(v2f src);
89 :
90 : NetworkPacket& operator>>(v3f& dst);
91 : NetworkPacket& operator<<(v3f src);
92 :
93 : NetworkPacket& operator>>(s16& dst);
94 : NetworkPacket& operator<<(s16 src);
95 :
96 : NetworkPacket& operator>>(s32& dst);
97 : NetworkPacket& operator<<(s32 src);
98 :
99 : NetworkPacket& operator>>(v2s32& dst);
100 : NetworkPacket& operator<<(v2s32 src);
101 :
102 : NetworkPacket& operator>>(v3s16& dst);
103 : NetworkPacket& operator<<(v3s16 src);
104 :
105 : NetworkPacket& operator>>(v3s32& dst);
106 : NetworkPacket& operator<<(v3s32 src);
107 :
108 : NetworkPacket& operator>>(video::SColor& dst);
109 : NetworkPacket& operator<<(video::SColor src);
110 :
111 : // Temp, we remove SharedBuffer when migration finished
112 : Buffer<u8> oldForgePacket();
113 : private:
114 : void checkReadOffset(u32 from_offset);
115 :
116 4880 : template<typename T> void checkDataSize()
117 : {
118 4880 : if (m_read_offset + sizeof(T) > m_datasize) {
119 0 : m_datasize = m_read_offset + sizeof(T);
120 0 : m_data.resize(m_datasize);
121 : }
122 4880 : }
123 :
124 6399 : template<typename T> void incrOffset()
125 : {
126 6399 : m_read_offset += sizeof(T);
127 6399 : }
128 :
129 : std::vector<u8> m_data;
130 : u32 m_datasize;
131 : u32 m_read_offset;
132 : u16 m_command;
133 : u16 m_peer_id;
134 : };
135 :
136 : #endif
|