diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | messages.cpp | 47 | ||||
-rw-r--r-- | messages.h | 17 |
3 files changed, 64 insertions, 1 deletions
@@ -1 +1,2 @@ *.o +*.swp diff --git a/messages.cpp b/messages.cpp index 7bff612..bf50d8c 100644 --- a/messages.cpp +++ b/messages.cpp @@ -127,3 +127,50 @@ void Chunk::get_coords(int64_t& x, int64_t& y) { is.read((char*)&y, sizeof(y)); got_coords = true; } + +/* Message */ + +Message::Message() { + type = MSG_TYPE_MSG; + + str_len = 0; + got_len = false; +} + +Message::Message(std::string msg) { + type = MSG_TYPE_MSG; + + str_len = msg.size(); + + std::ostream os(&b); + os.write((const char*)&str_len, sizeof(str_len)); + os.write(msg.c_str(), str_len); + + got_len = true; +} + +std::size_t Message::payload_size() { + return (got_len ? str_len : sizeof(uint16_t)); +} + +uint16_t Message::get_len() { + std::istream is(&b); + is.read((char*)&str_len, sizeof(str_len)); + + got_len = true; + + return str_len; +} + +std::string Message::get_str() { + std::string s; + + char *buf = new char[str_len]; + std::istream is(&b); + is.read(buf, str_len); + + s.assign(buf, str_len); + delete[] buf; + + return s; +} @@ -9,7 +9,8 @@ enum MessageType { MSG_TYPE_NONE = 0, MSG_TYPE_HELLO, MSG_TYPE_POS, - MSG_TYPE_CHUNK + MSG_TYPE_CHUNK, + MSG_TYPE_MSG }; class MessageBase { @@ -60,6 +61,20 @@ class Chunk : public MessageBase { 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 |