92 lines
1.6 KiB
C++
92 lines
1.6 KiB
C++
//
|
|
// chat_message.hpp
|
|
// ~~~~~~~~~~~~~~~~
|
|
//
|
|
// Copyright (c) 2003-2019 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:
|
|
enum { header_length = 4 };
|
|
enum { max_body_length = 512 };
|
|
|
|
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;
|
|
}
|
|
|
|
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;
|
|
}
|
|
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
|