… | |
… | |
234 | #define SOUND_NORMAL 0 |
234 | #define SOUND_NORMAL 0 |
235 | #define SOUND_SPELL 1 |
235 | #define SOUND_SPELL 1 |
236 | |
236 | |
237 | struct data |
237 | struct data |
238 | { |
238 | { |
|
|
239 | unsigned int len; |
239 | const void *ptr; |
240 | const void *ptr; |
240 | unsigned int len; |
|
|
241 | |
241 | |
242 | data (const void *ptr, int len) : len (len), ptr (ptr) { } |
242 | data (const void *ptr, int len) : len (len), ptr (ptr) { } |
243 | data (const char *str) : len (strlen (str ? str : 0)), ptr ((void *)str) { } |
243 | data (const char *str) : len (strlen (str ? str : 0)), ptr ((void *)str) { } |
244 | data (const shstr &sh) : len (sh.length ()), ptr ((void *)&sh) { } |
244 | data (const shstr &sh) : len (sh.length ()), ptr ((void *)&sh) { } |
245 | }; |
245 | }; |
246 | |
246 | |
247 | struct data8 |
247 | struct data8 |
248 | { |
248 | { |
|
|
249 | unsigned int len; |
249 | const void *ptr; |
250 | const void *ptr; |
250 | unsigned int len; |
|
|
251 | |
251 | |
252 | data8 (const void *ptr, int len) : len (len), ptr (ptr) { } |
252 | data8 (const void *ptr, int len) : len (len), ptr (ptr) { } |
253 | data8 (const char *str) : len (strlen (str ? str : 0)), ptr ((void *)str) { } |
253 | data8 (const char *str) : len (strlen (str ? str : 0)), ptr ((void *)str) { } |
254 | data8 (const shstr &sh) : len (sh.length ()), ptr ((void *)&sh) { } |
254 | data8 (const shstr &sh) : len (sh.length ()), ptr ((void *)&sh) { } |
255 | }; |
255 | }; |
256 | |
256 | |
257 | struct data16 |
257 | struct data16 |
258 | { |
258 | { |
|
|
259 | unsigned int len; |
259 | const void *ptr; |
260 | const void *ptr; |
260 | unsigned int len; |
|
|
261 | |
261 | |
262 | data16 (const void *ptr, int len) : len (len), ptr (ptr) { } |
262 | data16 (const void *ptr, int len) : len (len), ptr (ptr) { } |
263 | data16 (const char *str) : len (strlen (str ? str : 0)), ptr ((void *)str) { } |
263 | data16 (const char *str) : len (strlen (str ? str : 0)), ptr ((void *)str) { } |
264 | data16 (const shstr &sh) : len (sh.length ()), ptr ((void *)&sh) { } |
264 | data16 (const shstr &sh) : len (sh.length ()), ptr ((void *)&sh) { } |
265 | }; |
265 | }; |
266 | |
266 | |
267 | /* Contains the base information we use to make up a packet we want to send. */ |
267 | /* Contains the base information we use to make up a packet we want to send. */ |
268 | struct packet |
268 | struct packet |
269 | { |
269 | { |
270 | enum { bufsize = MAXSOCKBUF }; |
270 | enum { bufsize = MAXSOCKBUF }; |
|
|
271 | enum { hdrlen = 2 }; // keep this many bytes free at the front |
271 | |
272 | |
272 | // strategy: only check on variable-length adds |
273 | // strategy: only check on variable-length adds |
273 | // and allow 256 bytes for any headers. |
274 | // and allow 256 bytes for any headers. |
274 | uint8 *cur; |
275 | uint8 *cur; |
275 | uint8 buf [bufsize + 256]; |
276 | uint8 buf_ [hdrlen + bufsize + 256]; |
276 | |
277 | |
277 | packet () { reset (); } |
278 | packet () { reset (); } |
278 | |
279 | |
|
|
280 | uint8 operator [](unsigned int i) const { return buf_ [i + hdrlen]; } |
|
|
281 | uint8 &operator [](unsigned int i) { return buf_ [i + hdrlen]; } |
|
|
282 | |
|
|
283 | uint8 *buf () { return buf_ + hdrlen; } |
|
|
284 | const uint8 *buf () const { return buf_ + hdrlen; } |
|
|
285 | |
279 | void reset (int offset = 0) { cur = buf + offset; } |
286 | void reset (int offset = 0) { cur = buf () + offset; } |
280 | int length () const { return cur - buf; } |
287 | int length () const { return cur - buf (); } |
281 | int room () { return bufsize - (cur - buf); } |
288 | int room () { return bufsize - (cur - buf ()); } |
282 | |
289 | |
283 | // unchecked |
290 | // unchecked |
284 | packet &operator <<(uint8 v) { *cur++ = v; return *this; } |
291 | packet &operator <<(uint8 v) { *cur++ = v; return *this; } |
285 | |
292 | |
286 | packet &operator <<(uint16 v) { return *this << uint8 (v >> 8) << uint8 (v); } |
293 | packet &operator <<(uint16 v) { return *this << uint8 (v >> 8) << uint8 (v); } |