summaryrefslogtreecommitdiff
path: root/src/network/packet.cpp
diff options
context:
space:
mode:
authorGravatar Weiyi Wang2017-07-17 17:08:02 +0300
committerGravatar GitHub2017-07-17 17:08:02 +0300
commit924215a41fc3b1cfe16ae622a14a4bc856b5972e (patch)
treec0407aad38f63520e402ce713bf7a73fa6397f11 /src/network/packet.cpp
parentMerge pull request #2829 from MerryMage/check_submodules_present (diff)
parentNetwork: Changed timeout for receiving packets to 100ms (diff)
downloadyuzu-924215a41fc3b1cfe16ae622a14a4bc856b5972e.tar.gz
yuzu-924215a41fc3b1cfe16ae622a14a4bc856b5972e.tar.xz
yuzu-924215a41fc3b1cfe16ae622a14a4bc856b5972e.zip
Merge pull request #2818 from B3n30/network
Enable data transfer over ENet
Diffstat (limited to '')
-rw-r--r--src/network/packet.cpp225
1 files changed, 225 insertions, 0 deletions
diff --git a/src/network/packet.cpp b/src/network/packet.cpp
new file mode 100644
index 000000000..660e92c0d
--- /dev/null
+++ b/src/network/packet.cpp
@@ -0,0 +1,225 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#ifdef _WIN32
6#include <winsock2.h>
7#else
8#include <arpa/inet.h>
9#endif
10#include <cstring>
11#include <string>
12#include "network/packet.h"
13
14namespace Network {
15
16void Packet::Append(const void* in_data, std::size_t size_in_bytes) {
17 if (in_data && (size_in_bytes > 0)) {
18 std::size_t start = data.size();
19 data.resize(start + size_in_bytes);
20 std::memcpy(&data[start], in_data, size_in_bytes);
21 }
22}
23
24void Packet::Read(void* out_data, std::size_t size_in_bytes) {
25 if (out_data && CheckSize(size_in_bytes)) {
26 std::memcpy(out_data, &data[read_pos], size_in_bytes);
27 read_pos += size_in_bytes;
28 }
29}
30
31void Packet::Clear() {
32 data.clear();
33 read_pos = 0;
34 is_valid = true;
35}
36
37const void* Packet::GetData() const {
38 return !data.empty() ? &data[0] : nullptr;
39}
40
41void Packet::IgnoreBytes(u32 length) {
42 read_pos += length;
43}
44
45std::size_t Packet::GetDataSize() const {
46 return data.size();
47}
48
49bool Packet::EndOfPacket() const {
50 return read_pos >= data.size();
51}
52
53Packet::operator bool() const {
54 return is_valid ? &Packet::CheckSize : nullptr;
55}
56
57Packet& Packet::operator>>(bool& out_data) {
58 u8 value;
59 if (*this >> value) {
60 out_data = (value != 0);
61 }
62 return *this;
63}
64
65Packet& Packet::operator>>(s8& out_data) {
66 Read(&out_data, sizeof(out_data));
67 return *this;
68}
69
70Packet& Packet::operator>>(u8& out_data) {
71 Read(&out_data, sizeof(out_data));
72 return *this;
73}
74
75Packet& Packet::operator>>(s16& out_data) {
76 s16 value;
77 Read(&value, sizeof(value));
78 out_data = ntohs(value);
79 return *this;
80}
81
82Packet& Packet::operator>>(u16& out_data) {
83 u16 value;
84 Read(&value, sizeof(value));
85 out_data = ntohs(value);
86 return *this;
87}
88
89Packet& Packet::operator>>(s32& out_data) {
90 s32 value;
91 Read(&value, sizeof(value));
92 out_data = ntohl(value);
93 return *this;
94}
95
96Packet& Packet::operator>>(u32& out_data) {
97 u32 value;
98 Read(&value, sizeof(value));
99 out_data = ntohl(value);
100 return *this;
101}
102
103Packet& Packet::operator>>(float& out_data) {
104 Read(&out_data, sizeof(out_data));
105 return *this;
106}
107
108Packet& Packet::operator>>(double& out_data) {
109 Read(&out_data, sizeof(out_data));
110 return *this;
111}
112
113Packet& Packet::operator>>(char* out_data) {
114 // First extract string length
115 u32 length = 0;
116 *this >> length;
117
118 if ((length > 0) && CheckSize(length)) {
119 // Then extract characters
120 std::memcpy(out_data, &data[read_pos], length);
121 out_data[length] = '\0';
122
123 // Update reading position
124 read_pos += length;
125 }
126
127 return *this;
128}
129
130Packet& Packet::operator>>(std::string& out_data) {
131 // First extract string length
132 u32 length = 0;
133 *this >> length;
134
135 out_data.clear();
136 if ((length > 0) && CheckSize(length)) {
137 // Then extract characters
138 out_data.assign(&data[read_pos], length);
139
140 // Update reading position
141 read_pos += length;
142 }
143
144 return *this;
145}
146
147Packet& Packet::operator<<(bool in_data) {
148 *this << static_cast<u8>(in_data);
149 return *this;
150}
151
152Packet& Packet::operator<<(s8 in_data) {
153 Append(&in_data, sizeof(in_data));
154 return *this;
155}
156
157Packet& Packet::operator<<(u8 in_data) {
158 Append(&in_data, sizeof(in_data));
159 return *this;
160}
161
162Packet& Packet::operator<<(s16 in_data) {
163 s16 toWrite = htons(in_data);
164 Append(&toWrite, sizeof(toWrite));
165 return *this;
166}
167
168Packet& Packet::operator<<(u16 in_data) {
169 u16 toWrite = htons(in_data);
170 Append(&toWrite, sizeof(toWrite));
171 return *this;
172}
173
174Packet& Packet::operator<<(s32 in_data) {
175 s32 toWrite = htonl(in_data);
176 Append(&toWrite, sizeof(toWrite));
177 return *this;
178}
179
180Packet& Packet::operator<<(u32 in_data) {
181 u32 toWrite = htonl(in_data);
182 Append(&toWrite, sizeof(toWrite));
183 return *this;
184}
185
186Packet& Packet::operator<<(float in_data) {
187 Append(&in_data, sizeof(in_data));
188 return *this;
189}
190
191Packet& Packet::operator<<(double in_data) {
192 Append(&in_data, sizeof(in_data));
193 return *this;
194}
195
196Packet& Packet::operator<<(const char* in_data) {
197 // First insert string length
198 u32 length = std::strlen(in_data);
199 *this << length;
200
201 // Then insert characters
202 Append(in_data, length * sizeof(char));
203
204 return *this;
205}
206
207Packet& Packet::operator<<(const std::string& in_data) {
208 // First insert string length
209 u32 length = static_cast<u32>(in_data.size());
210 *this << length;
211
212 // Then insert characters
213 if (length > 0)
214 Append(in_data.c_str(), length * sizeof(std::string::value_type));
215
216 return *this;
217}
218
219bool Packet::CheckSize(std::size_t size) {
220 is_valid = is_valid && (read_pos + size <= data.size());
221
222 return is_valid;
223}
224
225} // namespace Network