src/proto2/Protocol.hh
changeset 15 7710cce889b2
child 22 b70d30e1b0fe
--- /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