Luanti 5.16.0-dev
 
Loading...
Searching...
No Matches
networkpacket.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2015 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
4
5#pragma once
6
7#include "util/pointer.h" // Buffer<T>
9#include "networkprotocol.h"
10#include <SColor.h>
11#include <string>
12#include <string_view>
13#include <vector>
14
16{
17public:
18 NetworkPacket(u16 command, u32 preallocate, session_t peer_id) :
19 m_command(command), m_peer_id(peer_id)
20 {
21 m_data.reserve(preallocate);
22 }
23 NetworkPacket(u16 command, u32 preallocate) :
24 m_command(command)
25 {
26 m_data.reserve(preallocate);
27 }
28 NetworkPacket() = default;
29
30 ~NetworkPacket() = default;
31
32 void putRawPacket(const u8 *data, u32 datasize, session_t peer_id);
33 void clear();
34
35 // Getters
36 u32 getSize() const { return m_datasize; }
37 session_t getPeerId() const { return m_peer_id; }
38 u16 getCommand() const { return m_command; }
39
41 inline u32 getOffset() const { return m_read_offset; }
42
43 u32 getRemainingBytes() const { return m_datasize - m_read_offset; }
44 inline bool hasRemainingBytes() const { return getRemainingBytes() != 0; }
45
46 // Returns a pointer to buffer data.
47 // A better name for this would be getRawString()
48 const char *getString(u32 from_offset) const;
49 const char *getRemainingString() const { return getString(m_read_offset); }
50
51 // Perform length check and skip ahead by `count` bytes.
52 void skip(u32 count);
53
54 // Appends bytes from string buffer to packet
55 void putRawString(const char *src, u32 len);
56 void putRawString(std::string_view src)
57 {
58 putRawString(src.data(), src.size());
59 }
60
61 // Reads bytes from packet into string buffer
62 void readRawString(char *dst, u32 len);
63 std::string readRawString(u32 len)
64 {
65 std::string s;
66 s.resize(len);
67 readRawString(&s[0], len);
68 return s;
69 }
70
71 NetworkPacket &operator>>(std::string &dst);
72 NetworkPacket &operator<<(std::string_view src);
73
74 void putLongString(std::string_view src);
75
76 NetworkPacket &operator>>(std::wstring &dst);
77 NetworkPacket &operator<<(std::wstring_view src);
78
79 std::string readLongString();
80
81 NetworkPacket &operator>>(char &dst);
82 NetworkPacket &operator<<(char src);
83
84 NetworkPacket &operator>>(bool &dst);
85 NetworkPacket &operator<<(bool src);
86
87 NetworkPacket &operator>>(u8 &dst);
89
90 NetworkPacket &operator>>(u16 &dst);
91 NetworkPacket &operator<<(u16 src);
92
93 NetworkPacket &operator>>(u32 &dst);
94 NetworkPacket &operator<<(u32 src);
95
96 NetworkPacket &operator>>(u64 &dst);
97 NetworkPacket &operator<<(u64 src);
98
99 NetworkPacket &operator>>(float &dst);
100 NetworkPacket &operator<<(float src);
101
104
107
108 NetworkPacket &operator>>(s16 &dst);
109 NetworkPacket &operator<<(s16 src);
110
111 NetworkPacket &operator>>(s32 &dst);
112 NetworkPacket &operator<<(s32 src);
113
116
119
122
123 NetworkPacket &operator>>(video::SColor &dst);
124 NetworkPacket &operator<<(video::SColor src);
125
126 // Temp, we remove SharedBuffer when migration finished
127 // ^ this comment has been here for 7 years
129
130private:
131 void checkReadOffset(u32 from_offset, u32 field_size) const;
132
133 // resize data buffer for writing
134 inline void checkDataSize(u32 field_size)
135 {
136 if (m_read_offset + field_size > m_datasize) {
137 m_datasize = m_read_offset + field_size;
138 m_data.resize(m_datasize);
139 }
140 }
141
142 std::vector<u8> m_data;
143 u32 m_datasize = 0;
144 u32 m_read_offset = 0; // read and write offset
145 u16 m_command = 0;
147};
Definition pointer.h:15
Definition networkpacket.h:16
void clear()
Definition networkpacket.cpp:39
std::string readRawString(u32 len)
Definition networkpacket.h:63
void skip(u32 count)
Definition networkpacket.cpp:55
std::string readLongString()
Definition networkpacket.cpp:206
u32 getRemainingBytes() const
Definition networkpacket.h:43
void putRawPacket(const u8 *data, u32 datasize, session_t peer_id)
Definition networkpacket.cpp:21
void checkReadOffset(u32 from_offset, u32 field_size) const
Definition networkpacket.cpp:10
u16 m_command
Definition networkpacket.h:145
const char * getRemainingString() const
Definition networkpacket.h:49
u32 m_read_offset
Definition networkpacket.h:144
void putRawString(std::string_view src)
Definition networkpacket.h:56
u32 getOffset() const
Read OR write offset (context-depending)
Definition networkpacket.h:41
NetworkPacket & operator>>(std::string &dst)
Definition networkpacket.cpp:84
const char * getString(u32 from_offset) const
Definition networkpacket.cpp:48
bool hasRemainingBytes() const
Definition networkpacket.h:44
NetworkPacket()=default
Buffer< u8 > oldForgePacket()
Definition networkpacket.cpp:512
std::vector< u8 > m_data
Definition networkpacket.h:142
u32 m_datasize
Definition networkpacket.h:143
u32 getSize() const
Definition networkpacket.h:36
~NetworkPacket()=default
void readRawString(char *dst, u32 len)
Definition networkpacket.cpp:72
void checkDataSize(u32 field_size)
Definition networkpacket.h:134
NetworkPacket(u16 command, u32 preallocate, session_t peer_id)
Definition networkpacket.h:18
NetworkPacket & operator<<(std::string_view src)
Definition networkpacket.cpp:105
void putRawString(const char *src, u32 len)
Definition networkpacket.cpp:61
u16 getCommand() const
Definition networkpacket.h:38
NetworkPacket(u16 command, u32 preallocate)
Definition networkpacket.h:23
void putLongString(std::string_view src)
Definition networkpacket.cpp:120
session_t m_peer_id
Definition networkpacket.h:146
session_t getPeerId() const
Definition networkpacket.h:37
core::vector2d< s32 > v2s32
Definition irr_v2d.h:13
core::vector2d< f32 > v2f
Definition irr_v2d.h:11
core::vector3d< s32 > v3s32
Definition irr_v3d.h:15
core::vector3d< s16 > v3s16
Definition irr_v3d.h:13
core::vector3df v3f
Definition irr_v3d.h:11
u16 session_t
Definition networkprotocol.h:27