diff -r 22e3bfb6720d -r 7710cce889b2 src/proto2/Protocol.hh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/proto2/Protocol.hh Thu Nov 06 22:23:59 2008 +0000 @@ -0,0 +1,74 @@ +#ifndef PROTOCOL_HH +#define PROTOCOL_HH + +#include "NetworkConfig.hh" +#include "Network.hh" + +#include + +enum packet_type { + PKT_INVALID, + PKT_HELLO +}; + +class NetworkPacket { + private: + char buf[NETWORK_PACKET_MAX]; + size_t size; + size_t offset; + public: + CL_IPAddress src; + + public: + NetworkPacket () : size(0), offset(0) { } + + void recvFromSocket (CL_Socket &sock) { + size = sock.recv((void *) buf, NETWORK_PACKET_MAX, src); + + offset = 0; + } + + template void read_into (T* val_ptr) { + if (offset + sizeof(T) > size) + throw std::logic_error("short packet"); + + *val_ptr = *((T*) (buf + offset)); + + offset += sizeof(T); + } + + template T read_type (void) { + T val; + + read_into(&val); + + return val; + } + + uint8_t read_uint8 (void) { + return read_type(); + } + + uint16_t read_uint16 (void) { + return htons(read_type()); + } + + enum packet_type read_pkt_type (void) { + return (enum packet_type) read_uint8(); + } +}; + +struct pkt_base { + NetworkPacket &packet; + + pkt_base (NetworkPacket &packet) : packet(packet) { } +}; + +struct pkt_Hello : public pkt_base { + uint16_t player_id; + + pkt_Hello (NetworkPacket &packet) : pkt_base(packet), + player_id(packet.read_uint16()) { } +}; + +#endif