author | Tero Marttila <terom@fixme.fi> |
Tue, 13 Jan 2009 21:14:12 +0200 | |
changeset 391 | 59c2499fe7bb |
parent 387 | 294ce7ae8140 |
child 400 | d64bf28c4340 |
permissions | -rw-r--r-- |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
1 |
#ifndef NETWORK_PACKET_HH |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
2 |
#define NETWORK_PACKET_HH |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
3 |
|
186 | 4 |
#include "Config.hh" |
300 | 5 |
#include "../Types.hh" |
186 | 6 |
#include "../Error.hh" |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
7 |
|
284 | 8 |
/** |
9 |
* Base class of errors thrown by NetworkPacket* methods |
|
10 |
*/ |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
11 |
class NetworkPacketError : public Error { |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
12 |
public: |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
13 |
NetworkPacketError (const std::string &message) : Error(message) { } |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
14 |
}; |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
15 |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
16 |
// forward-declare for write_packet |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
17 |
class NetworkPacketBuffer; |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
18 |
|
284 | 19 |
/** |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
20 |
* Read-interface for network packets |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
21 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
22 |
class NetworkPacketInput { |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
23 |
public: |
284 | 24 |
/** |
387
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
25 |
* Abstract method to get a pointer to \a len bytes of raw in-memory binary data, advancing the read offset |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
26 |
* |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
27 |
* @param len the number of bytes to consume |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
28 |
*/ |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
29 |
virtual const void* read_ptr (size_t len) = 0; |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
30 |
|
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
31 |
/** |
284 | 32 |
* Abstract method that copies len bytes from the packet to ptr, first testing that they exist |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
33 |
*/ |
284 | 34 |
virtual void read ( |
35 |
void *ptr, //<<< where to copy |
|
36 |
size_t len //<<< number of bytes to copy |
|
37 |
) = 0; |
|
391
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
38 |
|
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
39 |
/** |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
40 |
* Abstract method to get the number of input bytes remaining. |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
41 |
* |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
42 |
* @return number of input bytes still readable |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
43 |
*/ |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
44 |
virtual size_t tell_remaining (void) = 0; |
387
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
45 |
|
284 | 46 |
/** |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
47 |
* Convenience function to read() and return the value of the given type |
284 | 48 |
* |
49 |
* @return T The value |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
50 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
51 |
template <typename T> T read_val (void); |
296
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
284
diff
changeset
|
52 |
|
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
284
diff
changeset
|
53 |
// @{ |
284 | 54 |
/** |
296
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
284
diff
changeset
|
55 |
* Collection of methods to write out simple types, these convert from network-endianness and return the value |
284 | 56 |
*/ |
57 |
||
58 |
/** 32-bit unsigned int */ |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
59 |
uint32_t read_uint32 (void); |
284 | 60 |
|
61 |
/** 16-bit unsigned int */ |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
62 |
uint16_t read_uint16 (void); |
284 | 63 |
|
64 |
/** 8-bit unsigned int */ |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
65 |
uint8_t read_uint8 (void); |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
66 |
|
284 | 67 |
/** 32-bit signed int */ |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
68 |
int32_t read_int32 (void); |
284 | 69 |
|
70 |
/** 16-bit signed int */ |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
71 |
int16_t read_int16 (void); |
284 | 72 |
|
73 |
/** 8-bit signed int */ |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
74 |
int8_t read_int8 (void); |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
75 |
|
284 | 76 |
/** 32-bit float */ |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
77 |
float read_float32 (void); |
284 | 78 |
|
296
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
284
diff
changeset
|
79 |
// @} |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
80 |
|
284 | 81 |
/** |
82 |
* Read a Vector from the packet: |
|
83 |
* float32 vec_x |
|
84 |
* float32 vec_y |
|
85 |
* |
|
86 |
* @return Vector (vec_x, vec_y) |
|
87 |
*/ |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
88 |
Vector read_vector (void); |
387
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
89 |
|
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
90 |
/** |
391
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
91 |
* Read compressed data written with write_compressed. The given buffer must be the same size as passed to |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
92 |
* write_compressed. Returns the number of bytes that were decompressed into buf. |
387
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
93 |
*/ |
391
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
94 |
size_t read_uncompressed (void *buf, size_t len); |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
95 |
}; |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
96 |
|
284 | 97 |
/** |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
98 |
* Write-interface for network packets |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
99 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
100 |
class NetworkPacketOutput { |
391
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
101 |
protected: |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
102 |
/** |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
103 |
* Adjust size of the most recent write_ptr area of buf_len bytes to data_len bytes. |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
104 |
*/ |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
105 |
virtual void write_ptr_adjust (size_t buf_len, size_t data_len) = 0; |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
106 |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
107 |
public: |
284 | 108 |
/** |
387
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
109 |
* Abstract method to get a pointer to \a len bytes of raw in-memory binary data, advancing the write offset |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
110 |
* |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
111 |
* @param len number of bytes to commit |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
112 |
*/ |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
113 |
virtual void* write_ptr (size_t len) = 0; |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
114 |
|
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
115 |
/** |
284 | 116 |
* Abstract method that copies len bytes from ptr to the packet, first testing that they fit |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
117 |
*/ |
284 | 118 |
virtual void write ( |
119 |
const void *ptr, //<<< where to copy from |
|
120 |
size_t len //<<< number of bytes to copy |
|
121 |
) = 0; |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
122 |
|
284 | 123 |
/** |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
124 |
* Convenience function to write() the value of the given type-value |
284 | 125 |
* |
126 |
* @param val The value |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
127 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
128 |
template <typename T> void write_val (const T &val); |
284 | 129 |
|
296
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
284
diff
changeset
|
130 |
// @{ |
284 | 131 |
/** |
296
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
284
diff
changeset
|
132 |
* Collection of methods to write out simple types, these convert the given value to network-byte-order |
284 | 133 |
*/ |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
134 |
void write_uint32 (uint32_t val); |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
135 |
void write_uint16 (uint16_t val); |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
136 |
void write_uint8 (uint8_t val); |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
137 |
void write_int32 (int32_t val); |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
138 |
void write_int16 (int16_t val); |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
139 |
void write_int8 (int8_t val); |
284 | 140 |
void write_float32 (float val); |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
141 |
|
296
4d3ebaa29430
add separate Types.hh, and fix projectile-worm collisions on network
terom
parents:
284
diff
changeset
|
142 |
// @{ |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
143 |
|
284 | 144 |
/** |
145 |
* Write a vector to the packet: |
|
146 |
* float32 vec_x |
|
147 |
* float32 vec_y |
|
148 |
* |
|
149 |
* @param vec a Vector(vec_x, vec_y) |
|
150 |
*/ |
|
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
151 |
void write_vector (const Vector &vec); |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
152 |
|
284 | 153 |
/** |
154 |
* This write()s the contents of the given NetworkPacketBuffer to this packet. |
|
155 |
* |
|
156 |
* @param pkt the sub-packet to write() |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
157 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
158 |
void write_packet (const NetworkPacketBuffer &pkt); |
391
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
159 |
|
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
160 |
/** |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
161 |
* This will compress the given data buffer into this packet for reading with read_compressed. The compressed |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
162 |
* data will use at most write_compressed_size(len) bytes of data. |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
163 |
*/ |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
164 |
void write_compressed (const void *ptr, uint32_t len); |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
165 |
|
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
166 |
/** |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
167 |
* Return upper bound on packet size of compressed data, including header. |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
168 |
*/ |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
169 |
static size_t write_compressed_size (uint32_t len); |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
170 |
}; |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
171 |
|
284 | 172 |
/** |
173 |
* Implements an in-memory seekable buffer used by NetworkPackets |
|
174 |
* |
|
175 |
* @see NetworkPacketInput |
|
176 |
* @see NetworkPacketOutput |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
177 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
178 |
class NetworkPacketBuffer : public NetworkPacketInput, public NetworkPacketOutput { |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
179 |
protected: |
284 | 180 |
/** |
181 |
* Pointer to the packet data |
|
182 |
*/ |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
183 |
char *buf_ptr; |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
184 |
|
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
185 |
// the buffer size, the amount of data in the buffer, and the current read/write offset |
284 | 186 |
/** |
187 |
* The size of the memory region pointed to by buf_ptr |
|
188 |
*/ |
|
189 |
size_t buf_size; |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
190 |
|
284 | 191 |
/** |
192 |
* The number of bytes of read()-able data stored at buf_ptr |
|
193 |
*/ |
|
194 |
size_t data_size; |
|
195 |
||
196 |
/** |
|
197 |
* The current offset at which to run the next read/write |
|
198 |
*/ |
|
199 |
size_t offset; |
|
200 |
||
201 |
/** |
|
202 |
* Assert that the given number of bytes fits into the buffer at offset. Throws NetworkPacketError if not. |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
203 |
* |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
204 |
* The default implementation just checks offset and buf_size |
284 | 205 |
* |
206 |
* @param item_size the size of the item that should to be written |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
207 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
208 |
virtual void check_write_size (size_t item_size); |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
209 |
|
284 | 210 |
/** |
211 |
* Assert that the given number of bytes is available from the buffer. Throws NetworkPacketError if not |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
212 |
* |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
213 |
* The default implementation just checks offset and data_size |
284 | 214 |
* |
215 |
* @param item_size the size of the item that should be read |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
216 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
217 |
virtual void check_read_size (size_t item_size); |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
218 |
|
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
219 |
public: |
284 | 220 |
/** |
221 |
* Construct the NetworkPacketBuffer using the given buf_ptr, buf_size and data_size |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
222 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
223 |
NetworkPacketBuffer (char *buf_ptr, size_t buf_size, size_t data_size); |
387
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
224 |
|
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
225 |
/** |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
226 |
* Returns a read-only pointer to \a len bytes of internal buffer memory, calling check_read_size first and |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
227 |
* updating offset |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
228 |
* |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
229 |
* @param len number of bytes from the buffer to consume |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
230 |
*/ |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
231 |
virtual const void* read_ptr (size_t len); |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
232 |
|
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
233 |
/** |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
234 |
* Returns a read-write pointer to \a len bytes of internal buffer memory, calling check_write_size first and |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
235 |
* updating offset+data_size |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
236 |
* |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
237 |
* @param len number of bytes in the buffer to commit |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
238 |
*/ |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
239 |
virtual void* write_ptr (size_t len); |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
240 |
|
284 | 241 |
/** |
242 |
* Copy bytes from the packet buffer to ptr using memcpy(), calling check_read_size first. |
|
243 |
* |
|
244 |
* @param ptr where to copy the data to |
|
245 |
* @param len number of bytes to copy |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
246 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
247 |
virtual void read (void *ptr, size_t len); |
284 | 248 |
|
249 |
/** |
|
250 |
* Copy bytes from ptr to the packet buffer using memcpy(), calling check_write_size first |
|
251 |
* |
|
252 |
* @param ptr where to copy the data from |
|
253 |
* @param len number of bytes to copy |
|
254 |
*/ |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
255 |
virtual void write (const void *ptr, size_t len); |
387
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
256 |
|
391
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
257 |
virtual void write_ptr_adjust (size_t buf_len, size_t data_len); |
59c2499fe7bb
add compressed read/write NetworkPacket API and move zlib stuff out of NetworkServer/Client
Tero Marttila <terom@fixme.fi>
parents:
387
diff
changeset
|
258 |
|
387
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
259 |
/** |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
260 |
* Returns our data_size - read-offset |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
261 |
*/ |
294ce7ae8140
dirty implementation of compressed terrain array data
terom
parents:
300
diff
changeset
|
262 |
virtual size_t tell_remaining (void); |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
263 |
|
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
264 |
/* |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
265 |
* Accessor functions, used by the actual socket code to read/write the buffer |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
266 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
267 |
char* get_buf (void) { return buf_ptr; } |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
268 |
const char* get_buf (void) const { return buf_ptr; } |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
269 |
size_t get_data_size (void) const { return data_size; } |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
270 |
size_t get_buf_size (void) const { return buf_size; } |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
271 |
|
284 | 272 |
/** |
273 |
* If the contents of buf_ptr is replaced with a new packet, call this to update offset/data_size |
|
274 |
* |
|
275 |
* @param size new amount of data in the buffer |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
276 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
277 |
void set_data_size (size_t size) { offset = 0; data_size = size; } |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
278 |
}; |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
279 |
|
284 | 280 |
/** |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
281 |
* The common case is a packet that fits in a single UDP packet, so this just uses a static buffer of a fixed size, |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
282 |
* NETWORK_PACKET_SIZE. |
284 | 283 |
* |
284 |
* @see NetworkPacketBuffer |
|
285 |
* @see NETWORK_PACKET_SIZE |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
286 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
287 |
class NetworkPacket : public NetworkPacketBuffer { |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
288 |
private: |
284 | 289 |
/** |
290 |
* The static buffer, NETWORK_PACKET_SIZE bytes |
|
291 |
*/ |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
292 |
char _buf[NETWORK_PACKET_SIZE]; |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
293 |
|
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
294 |
public: |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
295 |
NetworkPacket (void); |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
296 |
}; |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
297 |
|
284 | 298 |
/** |
299 |
* This is intended for sending bigger packets via TCP; a buffer of the given size is allocated on the heap. |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
300 |
* |
284 | 301 |
* @see NetworkPacketBuffer |
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
302 |
*/ |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
303 |
class BigNetworkPacket : public NetworkPacketBuffer { |
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
304 |
public: |
284 | 305 |
/** |
306 |
* Allocates a buffer of the given size on the heap and uses it for NetworkPacketBuffer |
|
307 |
*/ |
|
200
2dbf40661580
better NetworkBuffer/Packet stuff + some additional Physics+Network stuff + random fixes
terom
parents:
186
diff
changeset
|
308 |
BigNetworkPacket (size_t size); |
202 | 309 |
|
310 |
private: |
|
284 | 311 |
/** |
312 |
* Object must not be copied |
|
313 |
*/ |
|
202 | 314 |
BigNetworkPacket (const BigNetworkPacket &pkt); |
315 |
BigNetworkPacket& operator= (const BigNetworkPacket &pkt); |
|
316 |
||
203
3ec7ab40755f
send initial terrain data to clients using a new NETCHAN_TERRAIN_ARRAY channel using raw BigNetworkPacket
terom
parents:
202
diff
changeset
|
317 |
public: |
284 | 318 |
/** |
319 |
* Frees the heap buffer |
|
320 |
*/ |
|
202 | 321 |
virtual ~BigNetworkPacket (void); |
185
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
322 |
}; |
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
323 |
|
25becd2cb026
that's not a prototype anymore... at least it shouldn't be
terom
parents:
diff
changeset
|
324 |
#endif /* NETWORK_PACKET_HH */ |