From e483f468085379a986cbc48bb13a7983315475cf Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Sun, 12 Jun 2011 20:26:46 +0200 Subject: Reworked the message classes to be more coder-friendly. --- messages.h | 71 ++++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 18 deletions(-) (limited to 'messages.h') diff --git a/messages.h b/messages.h index d521fef..62f5a03 100644 --- a/messages.h +++ b/messages.h @@ -19,46 +19,77 @@ enum MessageType { class MessageBase { protected: uint8_t type; - boost::asio::streambuf b; + + template + static inline void read(boost::asio::ip::tcp::socket& socket, T& v) { + boost::asio::read(socket, boost::asio::buffer(&v, sizeof(T))); + } + static std::string read_string(boost::asio::ip::tcp::socket& socket); + + template + static inline void write(boost::asio::ip::tcp::socket& socket, T& v) { + boost::asio::write(socket, boost::asio::buffer(&v, sizeof(T))); + } + + static void write_string(boost::asio::ip::tcp::socket& socket, std::string str); + + //! Does the actual sending of data per packet type. + virtual void do_send(boost::asio::ip::tcp::socket& socket) = 0; public: MessageBase(); virtual ~MessageBase() {}; + //! Sends the packet type and calls do_send(). void send(boost::asio::ip::tcp::socket& socket); - virtual std::size_t payload_size(); - virtual void read(boost::asio::ip::tcp::socket& socket); + virtual void recv(boost::asio::ip::tcp::socket& socket) = 0; static uint8_t read_type(boost::asio::ip::tcp::socket& socket); }; class Hello : public MessageBase { + protected: + uint8_t version; + + virtual void do_send(boost::asio::ip::tcp::socket& socket); + public: Hello(); Hello(uint8_t version); - virtual std::size_t payload_size(); - uint8_t read_version(); + virtual void recv(boost::asio::ip::tcp::socket& socket); + + uint8_t get_version(); }; class Pos : public MessageBase { + protected: + Vector3 pos; + + virtual void do_send(boost::asio::ip::tcp::socket& socket); + public: Pos(); - Pos(float x, float y, float z); + Pos(Vector3 pos); - virtual std::size_t payload_size(); - void get_pos(float& x, float& y, float& z); + virtual void recv(boost::asio::ip::tcp::socket& socket); + + Vector3 get_pos(); }; class Chunk : public MessageBase { protected: - bool got_coords; + int64_t x, y; + float *data; + + virtual void do_send(boost::asio::ip::tcp::socket& socket); public: Chunk(); Chunk(int64_t x, int64_t y); - virtual std::size_t payload_size(); + virtual void recv(boost::asio::ip::tcp::socket& socket); + void set_data(float *data); float* get_data(); void get_coords(int64_t& x, int64_t& y); @@ -66,14 +97,16 @@ class Chunk : public MessageBase { class Message : public MessageBase { protected: - uint16_t str_len; - bool got_len; + std::string msg; + + virtual void do_send(boost::asio::ip::tcp::socket& socket); public: Message(); Message(std::string msg); - virtual std::size_t payload_size(); + virtual void recv(boost::asio::ip::tcp::socket& socket); + uint16_t get_len(); std::string get_str(); }; @@ -81,18 +114,20 @@ class Message : public MessageBase { class Player : public MessageBase { protected: uint32_t id; - uint16_t str_len; - bool got_len; + Vector3 pos; + std::string name; + + virtual void do_send(boost::asio::ip::tcp::socket& socket); public: Player(); Player(uint32_t id, Vector3 pos, std::string name); - virtual std::size_t payload_size(); + virtual void recv(boost::asio::ip::tcp::socket& socket); + uint32_t get_id(); Vector3 get_pos(); - uint16_t get_len(); - std::string get_str(); + std::string get_name(); }; } -- cgit v1.2.3