diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-08-22 07:52:33 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-08-22 07:52:33 +0000 |
| commit | 8b3c16e6152a527f9aec1a88a9eed74119de7000 (patch) | |
| tree | f0bde5cea15e696e42cade06a3b12ff6b13acc57 /src/engine/packet.h | |
| parent | 9899666a7ce6679a3b9667ab09f615f4d0769c16 (diff) | |
| download | zcatch-8b3c16e6152a527f9aec1a88a9eed74119de7000.tar.gz zcatch-8b3c16e6152a527f9aec1a88a9eed74119de7000.zip | |
major engine cleanup. dependency on baselib removed. engine is now C code (not ansi tho). some other cruft removed aswell
Diffstat (limited to 'src/engine/packet.h')
| -rw-r--r-- | src/engine/packet.h | 315 |
1 files changed, 0 insertions, 315 deletions
diff --git a/src/engine/packet.h b/src/engine/packet.h deleted file mode 100644 index 1dd3c3ab..00000000 --- a/src/engine/packet.h +++ /dev/null @@ -1,315 +0,0 @@ -#include <stdarg.h> -#include <string.h> -#include <baselib/stream/file.h> -#include <baselib/network.h> - -#include "versions.h" -#include "ringbuffer.h" -#include "compression.h" -#include "snapshot.h" - -enum -{ - NETMSG_NULL=0, - - // the first thing sent by the client - // contains the version info for the client - NETMSG_INFO=1, - - // sent by server - NETMSG_MAP, - NETMSG_SNAP, - NETMSG_SNAPEMPTY, - NETMSG_SNAPSMALL, - - // sent by client - NETMSG_ENTERGAME, - NETMSG_INPUT, - NETMSG_SNAPACK, - - // sent by both - NETMSG_ERROR, -}; - - -// this should be revised -enum -{ - MAX_NAME_LENGTH=32, - MAX_CLANNAME_LENGTH=32, - MAX_INPUT_SIZE=128, - MAX_SNAPSHOT_SIZE=64*1024, - MAX_SNAPSHOT_PACKSIZE=768 -}; - - -class snapshot_storage -{ - struct holder - { - int64 tagtime; - int tick; - int data_size; - int *data() { return (int *)(this+1); } - }; - - ring_buffer buffer; - -public: - void purge_until(int tick) - { - while(1) - { - ring_buffer::item *i = buffer.first(); - if(!i) - break; - holder *h = (holder *)i->data(); - if(h->tick < tick) - buffer.pop_first(); - else - break; - } - } - - void purge_all() - { - buffer.reset(); - } - - void add(int tick, int64 tagtime, int data_size, void *data) - { - holder *h = (holder *)buffer.alloc(sizeof(holder)+data_size); - h->tick = tick; - h->data_size = data_size; - h->tagtime = tagtime; - mem_copy(h->data(), data, data_size); - } - - int get(int tick, int64 *tagtime, void **data) - { - ring_buffer::item *i = buffer.first(); - while(i) - { - holder *h = (holder *)i->data(); - if(h->tick == tick) - { - if(data) - *data = h->data(); - if(tagtime) - *tagtime = h->tagtime; - return h->data_size; - } - - i = i->next; - } - - return -1; - } -}; - -class snapshot_builder -{ -public: - static const int MAX_ITEMS = 512; - - char data[MAX_SNAPSHOT_SIZE]; - int data_size; - - int offsets[MAX_ITEMS]; - int num_items; - - int top_size; - int top_items; - - int snapnum; - - snapshot_builder() - { - top_size = 0; - top_items = 0; - snapnum = 0; - } - - void start() - { - data_size = 0; - num_items = 0; - } - - snapshot::item *get_item(int index) - { - return (snapshot::item *)&(data[offsets[index]]); - } - - int *get_item_data(int key) - { - for(int i = 0; i < num_items; i++) - { - if(get_item(i)->key() == key) - return (int *)get_item(i)->data(); - } - return 0; - } - - int finish(void *snapdata) - { - snapnum++; - - // flattern and make the snapshot - snapshot *snap = (snapshot *)snapdata; - snap->data_size = data_size; - snap->num_items = num_items; - int offset_size = sizeof(int)*num_items; - mem_copy(snap->offsets(), offsets, offset_size); - mem_copy(snap->data_start(), data, data_size); - return sizeof(snapshot) + offset_size + data_size; - } - - void *new_item(int type, int id, int size) - { - snapshot::item *obj = (snapshot::item *)(data+data_size); - mem_zero(obj, sizeof(snapshot::item) + size); - obj->type_and_id = (type<<16)|id; - offsets[num_items] = data_size; - data_size += sizeof(snapshot::item) + size; - num_items++; - - dbg_assert(data_size < MAX_SNAPSHOT_SIZE, "too much data"); - dbg_assert(num_items < MAX_ITEMS, "too many items"); - - return obj->data(); - } -}; - -class data_packer -{ - enum - { - BUFFER_SIZE=1024*2 - }; - - unsigned char buffer[BUFFER_SIZE]; - unsigned char *current; - unsigned char *end; - int error; -public: - void reset() - { - error = 0; - current = buffer; - end = current + BUFFER_SIZE; - } - - void add_int(int i) - { - // TODO: add space check - // TODO: variable length encoding perhaps - // TODO: add debug marker - current = vint_pack(current, i); - //*current++ = (i>>24)&0xff; - //*current++ = (i>>16)&0xff; - //*current++ = (i>>8)&0xff; - //*current++ = i&0xff; - } - - void add_string(const char *p, int limit) - { - // TODO: add space check - // TODO: add debug marker - if(limit > 0) - { - while(*p && limit != 0) - { - *current++ = *p++; - limit--; - } - *current++ = 0; - } - else - { - while(*p) - *current++ = *p++; - *current++ = 0; - } - } - - void add_raw(const unsigned char *data, int size) - { - // TODO: add space check - // TODO: add debug marker - //add_int(size); - while(size) - { - *current++ = *data++; - size--; - } - } - - int size() const - { - return (const unsigned char *)current-(const unsigned char *)buffer; - } - - const unsigned char *data() - { - return (const unsigned char *)buffer; - } -}; - -class data_unpacker -{ - const unsigned char *current; - const unsigned char *start; - const unsigned char *end; - int error; - -public: - void reset(const unsigned char *data, int size) - { - error = 0; - start = data; - end = start + size; - current = start; - } - - int get_int() - { - if(current >= end) - return 0; - - int i; - current = vint_unpack(current, &i); - // TODO: might be changed into variable width - // TODO: add range check - // TODO: add debug marker - //i = (current[0]<<24) | (current[1]<<16) | (current[2]<<8) | (current[3]); - //current += 4; - return i; - } - - const char *get_string() - { - if(current >= end) - return ""; - - // TODO: add range check - // TODO: add debug marker - const char *ptr = (const char *)current; - while(*current) // skip the string - current++; - current++; - return ptr; - } - - const unsigned char *get_raw(int size) - { - // TODO: add range check - // TODO: add debug marker - //int s = get_int(); - //if(size) - //*size = s; - const unsigned char *ptr = current; - current += size; - return ptr; - } -}; |