Luanti 5.17.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
47 std::string_view getRemainingNoCopy() const;
48
49 // Perform length check and skip ahead by `count` bytes.
50 inline void skip(u32 count) {
52 }
53
54 inline void seek(u32 position) {
55 m_read_offset = checkReadOffset(position, 0);
56 }
57
58 // Appends bytes from string buffer to packet
59 void putRawString(const char *src, u32 len);
60 void putRawString(std::string_view src)
61 {
62 putRawString(src.data(), src.size());
63 }
64
65 // Reads bytes from packet into string buffer
66 void readRawString(char *dst, u32 len);
67 std::string readRawString(u32 len)
68 {
69 std::string s;
70 s.resize(len);
71 readRawString(&s[0], len);
72 return s;
73 }
74
75 NetworkPacket &operator>>(std::string &dst);
76 NetworkPacket &operator<<(std::string_view src);
77
78 void putLongString(std::string_view src);
79
80 NetworkPacket &operator>>(std::wstring &dst);
81 NetworkPacket &operator<<(std::wstring_view src);
82
83 std::string readLongString();
84
85 NetworkPacket &operator>>(char &dst);
86 NetworkPacket &operator<<(char src);
87
88 NetworkPacket &operator>>(bool &dst);
89 NetworkPacket &operator<<(bool src);
90
91 NetworkPacket &operator>>(u8 &dst);
93
94 NetworkPacket &operator>>(u16 &dst);
95 NetworkPacket &operator<<(u16 src);
96
97 NetworkPacket &operator>>(u32 &dst);
98 NetworkPacket &operator<<(u32 src);
99
100 NetworkPacket &operator>>(u64 &dst);
101 NetworkPacket &operator<<(u64 src);
102
103 NetworkPacket &operator>>(float &dst);
104 NetworkPacket &operator<<(float src);
105
108
111
112 NetworkPacket &operator>>(s16 &dst);
113 NetworkPacket &operator<<(s16 src);
114
115 NetworkPacket &operator>>(s32 &dst);
116 NetworkPacket &operator<<(s32 src);
117
120
123
126
127 NetworkPacket &operator>>(video::SColor &dst);
128 NetworkPacket &operator<<(video::SColor src);
129
130 // Temp, we remove SharedBuffer when migration finished
131 // ^ this comment has been here for 7 years
133
134private:
136 u32 checkReadOffset(u32 from_offset, u32 field_size) const;
137
138 // resize data buffer for writing
139 inline void checkDataSize(u32 field_size)
140 {
141 if (m_read_offset + field_size > m_datasize) {
142 m_datasize = m_read_offset + field_size;
143 m_data.resize(m_datasize);
144 }
145 }
146
147 std::vector<u8> m_data;
148 u32 m_datasize = 0;
149 u32 m_read_offset = 0; // read and write offset
150 u16 m_command = 0;
152};
Definition pointer.h:15
Definition networkpacket.h:16
void clear()
Definition networkpacket.cpp:41
std::string readRawString(u32 len)
Definition networkpacket.h:67
void skip(u32 count)
Definition networkpacket.h:50
std::string readLongString()
Definition networkpacket.cpp:204
u32 getRemainingBytes() const
Definition networkpacket.h:43
void putRawPacket(const u8 *data, u32 datasize, session_t peer_id)
Definition networkpacket.cpp:23
u16 m_command
Definition networkpacket.h:150
u32 m_read_offset
Definition networkpacket.h:149
void putRawString(std::string_view src)
Definition networkpacket.h:60
u32 getOffset() const
Read OR write offset (context-depending).
Definition networkpacket.h:41
NetworkPacket & operator>>(std::string &dst)
Definition networkpacket.cpp:82
bool hasRemainingBytes() const
Definition networkpacket.h:44
NetworkPacket()=default
Buffer< u8 > oldForgePacket()
Definition networkpacket.cpp:510
std::vector< u8 > m_data
Definition networkpacket.h:147
u32 m_datasize
Definition networkpacket.h:148
u32 getSize() const
Definition networkpacket.h:36
~NetworkPacket()=default
void readRawString(char *dst, u32 len)
Definition networkpacket.cpp:70
void checkDataSize(u32 field_size)
Definition networkpacket.h:139
NetworkPacket(u16 command, u32 preallocate, session_t peer_id)
Definition networkpacket.h:18
NetworkPacket & operator<<(std::string_view src)
Definition networkpacket.cpp:103
void seek(u32 position)
Sets the read OR write offset (context-dependent).
Definition networkpacket.h:54
u32 checkReadOffset(u32 from_offset, u32 field_size) const
Returns from_offset + field_size on success.
Definition networkpacket.cpp:10
void putRawString(const char *src, u32 len)
Definition networkpacket.cpp:59
std::string_view getRemainingNoCopy() const
Does not advance the data read offset!
Definition networkpacket.cpp:50
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:118
session_t m_peer_id
Definition networkpacket.h:151
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