--- /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 <stdexcept>
+
+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 <typename T> 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 <typename T> T read_type (void) {
+ T val;
+
+ read_into(&val);
+
+ return val;
+ }
+
+ uint8_t read_uint8 (void) {
+ return read_type<uint8_t>();
+ }
+
+ uint16_t read_uint16 (void) {
+ return htons(read_type<uint16_t>());
+ }
+
+ 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