]>
Dogcows Code - chaz/yoink/blob - src/moof/packet.cc
2 /*] Copyright (c) 2009-2010, Charles McGarvey [**************************
3 **] All rights reserved.
7 * Distributable under the terms and conditions of the 2-clause BSD license;
8 * see the file COPYING for a complete text of the license.
10 **************************************************************************/
26 #include <arpa/inet.h>
33 #define bswap_16(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
37 #define bswap_32(x) ((((x) & 0xff000000) >> 24) | \
38 (((x) & 0x00ff0000) >> 8) | \
39 (((x) & 0x0000ff00) << 8) | \
40 (((x) & 0x000000ff) << 24))
44 #define bswap_64(x) (((x) << 56) | \
45 (((x) << 40) & 0xff000000000000ULL) | \
46 (((x) << 24) & 0xff0000000000ULL) | \
47 (((x) << 8) & 0xff00000000ULL) | \
48 (((x) >> 8) & 0xff000000ULL) | \
49 (((x) >> 24) & 0xff0000ULL) | \
50 (((x) >> 40) & 0xff00ULL) | \
56 static uint16_t htons(uint16_t x
)
58 #if SDL_BYTEORDER == SDL_LIL_ENDIAN
64 static uint16_t ntohs(uint16_t x
)
69 static uint32_t htonl(uint32_t x
)
71 #if SDL_BYTEORDER == SDL_LIL_ENDIAN
77 static uint32_t ntohl(uint32_t x
)
84 static uint64_t htonll(uint64_t x
)
86 #if SDL_BYTEORDER == SDL_LIL_ENDIAN
92 static uint64_t ntohll(uint64_t x
)
101 packet::packet(size_t size
) :
102 buffer_((char*)malloc(size
)),
105 packet::packet(const char* data
, size_t size
) :
106 buffer_((char*)malloc(size
)),
111 if (buffer_
) memcpy(buffer_
, data
, size
);
112 else throw std::length_error("out of memory");
116 packet::packet(const packet
& copy
) :
117 buffer_((char*)malloc(copy
.size_
)),
122 if (buffer_
) memcpy(buffer_
, copy
.buffer_
, size_
);
123 else throw std::length_error("out of memory");
126 packet
& packet::operator = (const packet
& copy
)
129 buffer_
= (char*)malloc(copy
.size_
);
131 if (buffer_
) memcpy(buffer_
, copy
.buffer_
, size_
);
132 else throw std::length_error("out of memory");
134 state_
= copy
.state_
;
135 saved_
= copy
.saved_
;
146 packet
& packet::operator << (bool value
)
148 int bit
= state_
.write_bool_num
% 8;
151 state_
.write_bool_mark
= state_
.write_mark
;
153 unsigned char byte
= 0;
154 if (write(&byte
, 1) == 0) throw std::length_error("out of memory");
157 if (value
) buffer_
[state_
.write_bool_mark
] |= (1 << bit
);
158 ++state_
.write_bool_num
;
164 packet
& packet::operator << (int8_t value
)
166 return *this << reinterpret_cast<uint8_t&>(value
);
169 packet
& packet::operator << (int16_t value
)
171 return *this << reinterpret_cast<uint16_t&>(value
);
174 packet
& packet::operator << (int32_t value
)
176 return *this << reinterpret_cast<uint32_t&>(value
);
179 packet
& packet::operator << (int64_t value
)
181 return *this << reinterpret_cast<uint64_t&>(value
);
185 packet
& packet::operator << (uint8_t value
)
187 if (write(&value
, sizeof(value
)) != sizeof(value
))
189 throw std::length_error("out of memory");
194 packet
& packet::operator << (uint16_t value
)
196 value
= htons(value
);
197 if (write(&value
, sizeof(value
)) != sizeof(value
))
199 throw std::length_error("out of memory");
204 packet
& packet::operator << (uint32_t value
)
206 value
= htonl(value
);
207 if (write(&value
, sizeof(value
)) != sizeof(value
))
209 throw std::length_error("out of memory");
214 packet
& packet::operator << (uint64_t value
)
216 value
= htonll(value
);
217 if (write(&value
, sizeof(value
)) != sizeof(value
))
219 throw std::length_error("out of memory");
224 packet
& packet::operator << (float value
)
226 // XXX: assumes the ieee-754
227 uint32_t* integer
= reinterpret_cast<uint32_t*>(&value
);
228 *integer
= htonl(*integer
);
229 if (write(integer
, sizeof(value
)) != sizeof(value
))
231 throw std::length_error("out of memory");
236 packet
& packet::operator << (double value
)
238 // XXX: assumes the ieee-754
239 uint64_t* integer
= reinterpret_cast<uint64_t*>(&value
);
240 *integer
= htonll(*integer
);
241 if (write(integer
, sizeof(value
)) != sizeof(value
))
243 throw std::length_error("out of memory");
248 size_t packet::write(const void* bytes
, size_t size
)
250 size_t num_bytes
= std::min(size
, size_
- state_
.write_mark
);
251 if (!buffer_
|| num_bytes
< size
)
253 int num_pages
= 1 + size
/ PAGE_SIZE
;
254 int new_size
= size_
+ num_pages
* PAGE_SIZE
;
255 char* new_buffer
= (char*)realloc(buffer_
, new_size
);
258 buffer_
= new_buffer
;
262 if (!buffer_
) return 0;
264 memcpy(buffer_
+ state_
.write_mark
, bytes
, num_bytes
);
265 state_
.write_mark
+= num_bytes
;
270 packet
& packet::operator >> (bool& value
)
272 int bit
= state_
.read_bool_num
% 8;
275 state_
.read_bool_mark
= state_
.read_mark
;
277 unsigned char byte
= 0;
278 if (read(&byte
, 1) == 0) throw std::out_of_range("end of packet");
281 value
= 1 & (buffer_
[state_
.read_bool_mark
] >> bit
);
282 ++state_
.read_bool_num
;
287 packet
& packet::operator >> (int8_t& value
)
289 return *this >> reinterpret_cast<uint8_t&>(value
);
292 packet
& packet::operator >> (int16_t& value
)
294 return *this >> reinterpret_cast<uint16_t&>(value
);
297 packet
& packet::operator >> (int32_t& value
)
299 return *this >> reinterpret_cast<uint32_t&>(value
);
302 packet
& packet::operator >> (int64_t& value
)
304 return *this >> reinterpret_cast<uint64_t&>(value
);
307 packet
& packet::operator >> (uint8_t& value
)
309 if (read(&value
, sizeof(value
)) != sizeof(value
))
311 throw std::out_of_range("end of packet");
316 packet
& packet::operator >> (uint16_t& value
)
318 if (read(&value
, sizeof(value
)) != sizeof(value
))
320 throw std::out_of_range("end of packet");
322 value
= ntohs(value
);
326 packet
& packet::operator >> (uint32_t& value
)
328 if (read(&value
, sizeof(value
)) != sizeof(value
))
330 throw std::out_of_range("end of packet");
332 value
= ntohl(value
);
336 packet
& packet::operator >> (uint64_t& value
)
338 if (read(&value
, sizeof(value
)) != sizeof(value
))
340 throw std::out_of_range("end of packet");
342 value
= ntohll(value
);
346 packet
& packet::operator >> (float& value
)
348 // XXX: assumes the ieee-754
349 uint32_t* integer
= reinterpret_cast<uint32_t*>(&value
);
350 if (read(integer
, sizeof(value
)) != sizeof(value
))
352 throw std::out_of_range("end of packet");
354 *integer
= htonl(*integer
);
358 packet
& packet::operator >> (double& value
)
360 // XXX: assumes the ieee-754
361 uint64_t* integer
= reinterpret_cast<uint64_t*>(&value
);
362 if (read(integer
, sizeof(value
)) != sizeof(value
))
364 throw std::out_of_range("end of packet");
366 *integer
= htonll(*integer
);
370 size_t packet::read(void* bytes
, size_t size
)
372 size_t num_bytes
= std::min(size
, state_
.write_mark
- state_
.read_mark
);
373 memcpy(bytes
, buffer_
+ state_
.read_mark
, num_bytes
);
374 state_
.read_mark
+= num_bytes
;
381 state_
.read_mark
= state_
.write_mark
;
382 state_
.read_bool_mark
= 0;
383 state_
.read_bool_num
= 0;
384 state_
.write_bool_mark
= 0;
385 state_
.write_bool_num
= 0;
394 void packet::revert()
This page took 0.056542 seconds and 5 git commands to generate.