Files
@ r23755:c8be91297a35
Branch filter:
Location: cpp/openttd-patchpack/source/src/network/core/packet.cpp - annotation
r23755:c8be91297a35
7.7 KiB
text/x-c
Update: Translations from eints
hungarian: 3 changes by Brumi
hungarian: 3 changes by Brumi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 | r5584:545d748cc681 r5584:545d748cc681 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r6121:a8ff6abe7fb2 r6121:a8ff6abe7fb2 r6121:a8ff6abe7fb2 r6121:a8ff6abe7fb2 r5584:545d748cc681 r8214:9a3935f9ef4e r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r21383:942c32fb8b0e r21383:942c32fb8b0e r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r23607:36c15679007d r5898:2191f99d1ffb r16617:66046f584de7 r23607:36c15679007d r16617:66046f584de7 r16617:66046f584de7 r16617:66046f584de7 r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r23607:36c15679007d r23607:36c15679007d r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r16617:66046f584de7 r5898:2191f99d1ffb r5898:2191f99d1ffb r5584:545d748cc681 r5584:545d748cc681 r16617:66046f584de7 r16617:66046f584de7 r16617:66046f584de7 r16617:66046f584de7 r16617:66046f584de7 r16617:66046f584de7 r16617:66046f584de7 r16617:66046f584de7 r5584:545d748cc681 r5584:545d748cc681 r6247:96e840dbefcc r5584:545d748cc681 r23607:36c15679007d r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5918:49621b4f6bf6 r5918:49621b4f6bf6 r5918:49621b4f6bf6 r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r5918:49621b4f6bf6 r5918:49621b4f6bf6 r5918:49621b4f6bf6 r5918:49621b4f6bf6 r5918:49621b4f6bf6 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r5900:b72b667bb359 r5584:545d748cc681 r16617:66046f584de7 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r5900:b72b667bb359 r5584:545d748cc681 r16617:66046f584de7 r5900:b72b667bb359 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r5900:b72b667bb359 r5584:545d748cc681 r16617:66046f584de7 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r5900:b72b667bb359 r5584:545d748cc681 r16617:66046f584de7 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r5584:545d748cc681 r10647:62911ec68e89 r5584:545d748cc681 r23607:36c15679007d r7752:29f6d729843c r16617:66046f584de7 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r5584:545d748cc681 r5584:545d748cc681 r5918:49621b4f6bf6 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r5900:b72b667bb359 r5584:545d748cc681 r5624:8f8d1f8d3a74 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r5900:b72b667bb359 r14239:cf70bc564c2b r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r6247:96e840dbefcc r5584:545d748cc681 r23607:36c15679007d r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r6247:96e840dbefcc r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5898:2191f99d1ffb r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r6247:96e840dbefcc r5918:49621b4f6bf6 r5918:49621b4f6bf6 r5918:49621b4f6bf6 r5918:49621b4f6bf6 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r6247:96e840dbefcc r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5900:b72b667bb359 r5584:545d748cc681 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r6247:96e840dbefcc r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5900:b72b667bb359 r5584:545d748cc681 r5900:b72b667bb359 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r6247:96e840dbefcc r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5900:b72b667bb359 r5584:545d748cc681 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r6247:96e840dbefcc r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5900:b72b667bb359 r5584:545d748cc681 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r17622:d9f6f6845b5d r18732:ad27548fd630 r17622:d9f6f6845b5d r18732:ad27548fd630 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r11272:411ffa5b815a r5584:545d748cc681 r5584:545d748cc681 r5624:8f8d1f8d3a74 r5584:545d748cc681 r5900:b72b667bb359 r5900:b72b667bb359 r5584:545d748cc681 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r5584:545d748cc681 r5900:b72b667bb359 r5584:545d748cc681 r5584:545d748cc681 r5900:b72b667bb359 r5584:545d748cc681 r18732:ad27548fd630 r5584:545d748cc681 | /* $Id$ */
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file packet.cpp Basic functions to create, fill and read packets.
*/
#include "../../stdafx.h"
#include "../../string_func.h"
#include "packet.h"
#include "../../safeguards.h"
/**
* Create a packet that is used to read from a network socket
* @param cs the socket handler associated with the socket we are reading from
*/
Packet::Packet(NetworkSocketHandler *cs)
{
assert(cs != nullptr);
this->cs = cs;
this->next = nullptr;
this->pos = 0; // We start reading from here
this->size = 0;
this->buffer = MallocT<byte>(SEND_MTU);
}
/**
* Creates a packet to send
* @param type of the packet to send
*/
Packet::Packet(PacketType type)
{
this->cs = nullptr;
this->next = nullptr;
/* Skip the size so we can write that in before sending the packet */
this->pos = 0;
this->size = sizeof(PacketSize);
this->buffer = MallocT<byte>(SEND_MTU);
this->buffer[this->size++] = type;
}
/**
* Free the buffer of this packet.
*/
Packet::~Packet()
{
free(this->buffer);
}
/**
* Writes the packet size from the raw packet from packet->size
*/
void Packet::PrepareToSend()
{
assert(this->cs == nullptr && this->next == nullptr);
this->buffer[0] = GB(this->size, 0, 8);
this->buffer[1] = GB(this->size, 8, 8);
this->pos = 0; // We start reading from here
}
/*
* The next couple of functions make sure we can send
* uint8, uint16, uint32 and uint64 endian-safe
* over the network. The least significant bytes are
* sent first.
*
* So 0x01234567 would be sent as 67 45 23 01.
*
* A bool is sent as a uint8 where zero means false
* and non-zero means true.
*/
/**
* Package a boolean in the packet.
* @param data The data to send.
*/
void Packet::Send_bool(bool data)
{
this->Send_uint8(data ? 1 : 0);
}
/**
* Package a 8 bits integer in the packet.
* @param data The data to send.
*/
void Packet::Send_uint8(uint8 data)
{
assert(this->size < SEND_MTU - sizeof(data));
this->buffer[this->size++] = data;
}
/**
* Package a 16 bits integer in the packet.
* @param data The data to send.
*/
void Packet::Send_uint16(uint16 data)
{
assert(this->size < SEND_MTU - sizeof(data));
this->buffer[this->size++] = GB(data, 0, 8);
this->buffer[this->size++] = GB(data, 8, 8);
}
/**
* Package a 32 bits integer in the packet.
* @param data The data to send.
*/
void Packet::Send_uint32(uint32 data)
{
assert(this->size < SEND_MTU - sizeof(data));
this->buffer[this->size++] = GB(data, 0, 8);
this->buffer[this->size++] = GB(data, 8, 8);
this->buffer[this->size++] = GB(data, 16, 8);
this->buffer[this->size++] = GB(data, 24, 8);
}
/**
* Package a 64 bits integer in the packet.
* @param data The data to send.
*/
void Packet::Send_uint64(uint64 data)
{
assert(this->size < SEND_MTU - sizeof(data));
this->buffer[this->size++] = GB(data, 0, 8);
this->buffer[this->size++] = GB(data, 8, 8);
this->buffer[this->size++] = GB(data, 16, 8);
this->buffer[this->size++] = GB(data, 24, 8);
this->buffer[this->size++] = GB(data, 32, 8);
this->buffer[this->size++] = GB(data, 40, 8);
this->buffer[this->size++] = GB(data, 48, 8);
this->buffer[this->size++] = GB(data, 56, 8);
}
/**
* Sends a string over the network. It sends out
* the string + '\0'. No size-byte or something.
* @param data The string to send
*/
void Packet::Send_string(const char *data)
{
assert(data != nullptr);
/* The <= *is* valid due to the fact that we are comparing sizes and not the index. */
assert(this->size + strlen(data) + 1 <= SEND_MTU);
while ((this->buffer[this->size++] = *data++) != '\0') {}
}
/*
* Receiving commands
* Again, the next couple of functions are endian-safe
* see the comment before Send_bool for more info.
*/
/**
* Is it safe to read from the packet, i.e. didn't we run over the buffer ?
* @param bytes_to_read The amount of bytes we want to try to read.
* @return True if that is safe, otherwise false.
*/
bool Packet::CanReadFromPacket(uint bytes_to_read)
{
/* Don't allow reading from a quit client/client who send bad data */
if (this->cs->HasClientQuit()) return false;
/* Check if variable is within packet-size */
if (this->pos + bytes_to_read > this->size) {
this->cs->NetworkSocketHandler::CloseConnection();
return false;
}
return true;
}
/**
* Reads the packet size from the raw packet and stores it in the packet->size
*/
void Packet::ReadRawPacketSize()
{
assert(this->cs != nullptr && this->next == nullptr);
this->size = (PacketSize)this->buffer[0];
this->size += (PacketSize)this->buffer[1] << 8;
}
/**
* Prepares the packet so it can be read
*/
void Packet::PrepareToRead()
{
this->ReadRawPacketSize();
/* Put the position on the right place */
this->pos = sizeof(PacketSize);
}
/**
* Read a boolean from the packet.
* @return The read data.
*/
bool Packet::Recv_bool()
{
return this->Recv_uint8() != 0;
}
/**
* Read a 8 bits integer from the packet.
* @return The read data.
*/
uint8 Packet::Recv_uint8()
{
uint8 n;
if (!this->CanReadFromPacket(sizeof(n))) return 0;
n = this->buffer[this->pos++];
return n;
}
/**
* Read a 16 bits integer from the packet.
* @return The read data.
*/
uint16 Packet::Recv_uint16()
{
uint16 n;
if (!this->CanReadFromPacket(sizeof(n))) return 0;
n = (uint16)this->buffer[this->pos++];
n += (uint16)this->buffer[this->pos++] << 8;
return n;
}
/**
* Read a 32 bits integer from the packet.
* @return The read data.
*/
uint32 Packet::Recv_uint32()
{
uint32 n;
if (!this->CanReadFromPacket(sizeof(n))) return 0;
n = (uint32)this->buffer[this->pos++];
n += (uint32)this->buffer[this->pos++] << 8;
n += (uint32)this->buffer[this->pos++] << 16;
n += (uint32)this->buffer[this->pos++] << 24;
return n;
}
/**
* Read a 64 bits integer from the packet.
* @return The read data.
*/
uint64 Packet::Recv_uint64()
{
uint64 n;
if (!this->CanReadFromPacket(sizeof(n))) return 0;
n = (uint64)this->buffer[this->pos++];
n += (uint64)this->buffer[this->pos++] << 8;
n += (uint64)this->buffer[this->pos++] << 16;
n += (uint64)this->buffer[this->pos++] << 24;
n += (uint64)this->buffer[this->pos++] << 32;
n += (uint64)this->buffer[this->pos++] << 40;
n += (uint64)this->buffer[this->pos++] << 48;
n += (uint64)this->buffer[this->pos++] << 56;
return n;
}
/**
* Reads a string till it finds a '\0' in the stream.
* @param buffer The buffer to put the data into.
* @param size The size of the buffer.
* @param settings The string validation settings.
*/
void Packet::Recv_string(char *buffer, size_t size, StringValidationSettings settings)
{
PacketSize pos;
char *bufp = buffer;
const char *last = buffer + size - 1;
/* Don't allow reading from a closed socket */
if (cs->HasClientQuit()) return;
pos = this->pos;
while (--size > 0 && pos < this->size && (*buffer++ = this->buffer[pos++]) != '\0') {}
if (size == 0 || pos == this->size) {
*buffer = '\0';
/* If size was sooner to zero then the string in the stream
* skip till the \0, so than packet can be read out correctly for the rest */
while (pos < this->size && this->buffer[pos] != '\0') pos++;
pos++;
}
this->pos = pos;
str_validate(bufp, last, settings);
}
|