ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/newclient.h
(Generate patch)

Comparing deliantra/server/include/newclient.h (file contents):
Revision 1.11 by root, Thu Dec 14 00:23:59 2006 UTC vs.
Revision 1.18 by root, Thu Dec 14 20:39:54 2006 UTC

234#define SOUND_NORMAL 0 234#define SOUND_NORMAL 0
235#define SOUND_SPELL 1 235#define SOUND_SPELL 1
236 236
237struct data 237struct 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
247struct data8 247struct 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
257struct data16 257struct 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. */
268struct SockList 268struct packet
269{ 269{
270 SockList () : buf (0), len (0) { } 270 enum { bufsize = MAXSOCKBUF };
271 SockList (int size) : buf ((uint8 *)malloc (size)), len (0) { } 271 enum { hdrlen = 2 }; // keep this many bytes free at the front
272 272
273 void reset () { len = 0; } 273 // strategy: only check on variable-length adds
274 // and allow 256 bytes for any headers.
275 uint8 *cur;
276 uint8 buf_ [hdrlen + bufsize + 256];
277
278 packet () { reset (); }
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
286 void reset (int offset = 0) { cur = buf () + offset; }
274 int length () const { return len; } 287 int length () const { return cur - buf (); }
288 int room () { return bufsize - (cur - buf ()); }
275 289
290 // unchecked
276 SockList &operator <<(uint8 v) { buf [len++] = v; return *this; } 291 packet &operator <<(uint8 v) { *cur++ = v; return *this; }
277 292
278 SockList &operator <<(uint16 v) { return *this << uint8 (v >> 8) << uint8 (v); } 293 packet &operator <<(uint16 v) { return *this << uint8 (v >> 8) << uint8 (v); }
279 SockList &operator <<(uint32 v) { return *this << uint16 (v >> 16) << uint16 (v); } 294 packet &operator <<(uint32 v) { return *this << uint16 (v >> 16) << uint16 (v); }
280 SockList &operator <<(uint64 v) { return *this << uint32 (v >> 32) << uint32 (v); } 295 packet &operator <<(uint64 v) { return *this << uint32 (v >> 32) << uint32 (v); }
281 296
282 SockList &operator <<(sint8 v) { return *this << (uint8 )v; } 297 packet &operator <<(sint8 v) { return *this << (uint8 )v; }
283 SockList &operator <<(sint16 v) { return *this << (uint16)v; } 298 packet &operator <<(sint16 v) { return *this << (uint16)v; }
284 SockList &operator <<(sint32 v) { return *this << (uint32)v; } 299 packet &operator <<(sint32 v) { return *this << (uint32)v; }
285 SockList &operator <<(sint64 v) { return *this << (uint64)v; } 300 packet &operator <<(sint64 v) { return *this << (uint64)v; }
286 301
302 // checked
287 SockList &operator <<(const data &v); 303 packet &operator <<(const data &v);
288 SockList &operator <<(const data8 &v); 304 packet &operator <<(const data8 &v);
289 SockList &operator <<(const data16 &v); 305 packet &operator <<(const data16 &v);
290 306
291 SockList &operator <<(const char *v); 307 packet &operator <<(const char *v);
292 SockList &operator <<(const shstr &sh) { return *this << data (&sh, sh.length ()); } 308 packet &operator <<(const shstr &sh) { return *this << data (&sh, sh.length ()); }
293 309
294 void printf (const char *format, ...); 310 void printf (const char *format, ...);
295
296 void free () { ::free (buf); }
297
298public:
299 uint8 *buf;
300 int len;
301}; 311};
302
303inline void SockList_AddChar (SockList *sl, uint8 data) { *sl << data; }
304inline void SockList_AddShort (SockList *sl, uint16 data) { *sl << data; }
305inline void SockList_AddInt (SockList *sl, uint32 data) { *sl << data; }
306inline void SockList_AddInt64 (SockList *sl, uint64 data) { *sl << data; }
307 312
308inline uint16 net_uint16 (uint8 *data) { return (data [0] << 8) | data [1]; } 313inline uint16 net_uint16 (uint8 *data) { return (data [0] << 8) | data [1]; }
309inline uint32 net_uint32 (uint8 *data) { return (net_uint16 (data) << 16) | net_uint16 (data + 2); } 314inline uint32 net_uint32 (uint8 *data) { return (net_uint16 (data) << 16) | net_uint16 (data + 2); }
310inline sint16 net_sint16 (uint8 *data) { return sint16 (net_uint16 (data)); } 315inline sint16 net_sint16 (uint8 *data) { return sint16 (net_uint16 (data)); }
311inline sint16 net_sint32 (uint8 *data) { return sint32 (net_uint32 (data)); } 316inline sint16 net_sint32 (uint8 *data) { return sint32 (net_uint32 (data)); }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines