-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchat_message.h
51 lines (38 loc) · 1.21 KB
/
chat_message.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#define _CRT_SECURE_NO_WARNINGS
#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_;
};