| 
									
										
										
										
											2018-05-29 11:25:24 +02:00
										 |  |  | //
 | 
					
						
							|  |  |  | // chat_message.hpp
 | 
					
						
							|  |  |  | // ~~~~~~~~~~~~~~~~
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Distributed under the Boost Software License, Version 1.0. (See accompanying
 | 
					
						
							|  |  |  | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef CHAT_MESSAGE_HPP
 | 
					
						
							|  |  |  | #define CHAT_MESSAGE_HPP
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <cstdio>
 | 
					
						
							|  |  |  | #include <cstdlib>
 | 
					
						
							|  |  |  | #include <cstring>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class chat_message { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-06-22 17:55:10 +04:00
										 |  |  |     static constexpr std::size_t header_length = 4; | 
					
						
							|  |  |  |     static constexpr std::size_t max_body_length = 512; | 
					
						
							| 
									
										
										
										
											2018-05-29 11:25:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     chat_message() | 
					
						
							|  |  |  |         : body_length_(0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const char *data() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return data_; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     char *data() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return data_; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::size_t length() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return header_length + body_length_; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const char *body() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return data_ + header_length; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     char *body() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return data_ + header_length; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::size_t body_length() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return body_length_; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void body_length(std::size_t new_length) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         body_length_ = new_length; | 
					
						
							|  |  |  |         if (body_length_ > max_body_length) { | 
					
						
							|  |  |  |             body_length_ = max_body_length; | 
					
						
							| 
									
										
										
										
											2022-10-11 16:31:57 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-05-29 11:25:24 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool decode_header() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         char header[header_length + 1] = ""; | 
					
						
							|  |  |  |         std::strncat(header, data_, header_length); | 
					
						
							|  |  |  |         body_length_ = std::atoi(header); | 
					
						
							|  |  |  |         if (body_length_ > max_body_length) { | 
					
						
							|  |  |  |             body_length_ = 0; | 
					
						
							|  |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2022-10-11 16:31:57 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-05-29 11:25:24 +02:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void encode_header() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         char header[header_length + 1] = ""; | 
					
						
							|  |  |  |         std::sprintf(header, "%4d", static_cast<int>(body_length_)); | 
					
						
							|  |  |  |         std::memcpy(data_, header, header_length); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     char data_[header_length + max_body_length]; | 
					
						
							|  |  |  |     std::size_t body_length_; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // CHAT_MESSAGE_HPP
 |