#ifndef MESSAGES_H #define MESSAGES_H #include namespace message { enum MessageType { MSG_TYPE_NONE = 0, MSG_TYPE_HELLO, MSG_TYPE_POS, MSG_TYPE_CHUNK, MSG_TYPE_MSG }; class MessageBase { protected: uint8_t type; boost::asio::streambuf b; public: MessageBase(); virtual ~MessageBase() {}; void send(boost::asio::ip::tcp::socket& socket); virtual std::size_t payload_size(); virtual void read(boost::asio::ip::tcp::socket& socket); static uint8_t read_type(boost::asio::ip::tcp::socket& socket); }; class Hello : public MessageBase { public: Hello(); Hello(uint8_t version); virtual std::size_t payload_size(); uint8_t read_version(); }; class Pos : public MessageBase { public: Pos(); Pos(float x, float y, float z); virtual std::size_t payload_size(); void get_pos(float& x, float& y, float& z); }; class Chunk : public MessageBase { protected: bool got_coords; public: Chunk(); Chunk(int64_t x, int64_t y); virtual std::size_t payload_size(); void set_data(float *data); float* get_data(); void get_coords(int64_t& x, int64_t& y); }; class Message : public MessageBase { protected: uint16_t str_len; bool got_len; public: Message(); Message(std::string msg); virtual std::size_t payload_size(); uint16_t get_len(); std::string get_str(); }; } #endif