58 float fx = read_float32(); |
60 float fx = read_float32(); |
59 float fy = read_float32(); |
61 float fy = read_float32(); |
60 |
62 |
61 return Vector(fx, fy); |
63 return Vector(fx, fy); |
62 } |
64 } |
|
65 |
|
66 size_t NetworkPacketInput::read_uncompressed (void *buf, size_t len) { |
|
67 // given len |
|
68 unsigned long inflate_size = len; |
|
69 |
|
70 // read deflate size |
|
71 unsigned long deflate_size = read_uint32(); |
|
72 |
|
73 // pointer to packet data |
|
74 const void *deflate_ptr = read_ptr(deflate_size); |
|
75 |
|
76 // uncompress the rest of the packet data |
|
77 if (uncompress((uint8_t *) buf, &inflate_size, (const uint8_t *) deflate_ptr, deflate_size) != Z_OK) |
|
78 throw Error("uncompress"); |
|
79 |
|
80 // return inflated size |
|
81 return inflate_size; |
|
82 } |
63 |
83 |
64 /* |
84 /* |
65 * NetworkPacketOutput |
85 * NetworkPacketOutput |
66 */ |
86 */ |
67 template <typename T> void NetworkPacketOutput::write_val (const T &val) { |
87 template <typename T> void NetworkPacketOutput::write_val (const T &val) { |
111 |
131 |
112 void NetworkPacketOutput::write_packet (const NetworkPacketBuffer &pkt) { |
132 void NetworkPacketOutput::write_packet (const NetworkPacketBuffer &pkt) { |
113 // just write() it |
133 // just write() it |
114 write(pkt.get_buf(), pkt.get_data_size()); |
134 write(pkt.get_buf(), pkt.get_data_size()); |
115 } |
135 } |
|
136 |
|
137 void NetworkPacketOutput::write_compressed (const void *ptr, uint32_t len) { |
|
138 // full compression buffer size, including header |
|
139 unsigned long deflate_buf_size = write_compressed_size(len); |
|
140 |
|
141 // size of compressed data area after header |
|
142 unsigned long deflate_size = deflate_buf_size - sizeof(uint32_t); |
|
143 |
|
144 // packet buffer |
|
145 void *deflate_buf = write_ptr(deflate_buf_size); |
|
146 |
|
147 // compress |
|
148 if (compress((uint8_t *) deflate_buf + sizeof(uint32_t), &deflate_size, (const uint8_t *) ptr, len) != Z_OK) |
|
149 throw Error("compress failed"); |
|
150 |
|
151 // write data size |
|
152 *((uint32_t *) deflate_buf) = htonl(deflate_size); |
|
153 |
|
154 // adjust final area |
|
155 write_ptr_adjust(deflate_buf_size, sizeof(uint32_t) + deflate_size); |
|
156 } |
|
157 |
|
158 size_t NetworkPacketOutput::write_compressed_size (uint32_t len) { |
|
159 return sizeof(uint32_t) + compressBound(len); |
|
160 } |
116 |
161 |
117 /* |
162 /* |
118 * NetworkPacketBuffer |
163 * NetworkPacketBuffer |
119 */ |
164 */ |
120 NetworkPacketBuffer::NetworkPacketBuffer (char *buf_ptr, size_t buf_size, size_t data_size) : |
165 NetworkPacketBuffer::NetworkPacketBuffer (char *buf_ptr, size_t buf_size, size_t data_size) : |
136 throw NetworkPacketError("not enough data to read"); |
181 throw NetworkPacketError("not enough data to read"); |
137 } |
182 } |
138 |
183 |
139 const void* NetworkPacketBuffer::read_ptr (size_t len) { |
184 const void* NetworkPacketBuffer::read_ptr (size_t len) { |
140 // check buffer overflow |
185 // check buffer overflow |
141 check_write_size(len); |
186 check_read_size(len); |
142 |
187 |
143 // pointer value... |
188 // pointer value... |
144 const void *ptr = buf_ptr + offset; |
189 const void *ptr = buf_ptr + offset; |
145 |
190 |
146 // update offset |
191 // update offset |
179 |
224 |
180 // copy value in |
225 // copy value in |
181 memcpy(output_ptr, ptr, len); |
226 memcpy(output_ptr, ptr, len); |
182 } |
227 } |
183 |
228 |
|
229 void NetworkPacketBuffer::write_ptr_adjust (size_t buf_len, size_t data_len) { |
|
230 assert(data_len <= buf_len); |
|
231 |
|
232 // adjust offset backwards |
|
233 offset -= (buf_len - data_len); |
|
234 data_size -= (buf_len - data_len); |
|
235 } |
|
236 |
184 size_t NetworkPacketBuffer::tell_remaining (void) { |
237 size_t NetworkPacketBuffer::tell_remaining (void) { |
185 // number of bytes in total - number of bytes read |
238 // number of bytes in total - number of bytes read |
186 return data_size - offset; |
239 return data_size - offset; |
187 } |
240 } |
188 |
241 |