src/​examples/​cpp03/​chat/​chat_message.​hppsrc/​examples/​cpp11/​chat/​chat_message.​hpp
1 /​/​1 /​/​
2 /​/​·​chat_message.​hpp2 /​/​·​chat_message.​hpp
3 /​/​·​~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2023·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2023·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #ifndef·​CHAT_MESSAGE_HPP11 #ifndef·​CHAT_MESSAGE_HPP
12 #define·​CHAT_MESSAGE_HPP12 #define·​CHAT_MESSAGE_HPP
13 13
14 #include·​<cstdio>14 #include·​<cstdio>
15 #include·​<cstdlib>15 #include·​<cstdlib>
16 #include·​<cstring>16 #include·​<cstring>
17 17
18 class·​chat_message18 class·​chat_message
19 {19 {
20 public:​20 public:​
21 ··​enum21 ··static·constexpr·std:​:​size_t·header_length·=·4;​
22 ··{22 ··static·constexpr·std:​:​size_t·max_body_length·=·512;​
23 ····header_length·=·4,​
24 ····max_body_length·=·512
25 ··};​
26 23
27 ··​chat_message()​24 ··​chat_message()​
28 ····​:​·​body_length_(0)​25 ····​:​·​body_length_(0)​
29 ··​{26 ··​{
30 ··​}27 ··​}
31 28
32 ··​const·​char*·​data()​·​const29 ··​const·​char*·​data()​·​const
33 ··​{30 ··​{
34 ····​return·​data_;​31 ····​return·​data_;​
35 ··​}32 ··​}
36 33
37 ··​char*·​data()​34 ··​char*·​data()​
38 ··​{35 ··​{
39 ····​return·​data_;​36 ····​return·​data_;​
40 ··​}37 ··​}
41 38
42 ··​size_t·​length()​·​const39 ··std:​:​size_t·​length()​·​const
43 ··​{40 ··​{
44 ····​return·​header_length·​+·​body_length_;​41 ····​return·​header_length·​+·​body_length_;​
45 ··​}42 ··​}
46 43
47 ··​const·​char*·​body()​·​const44 ··​const·​char*·​body()​·​const
48 ··​{45 ··​{
49 ····​return·​data_·​+·​header_length;​46 ····​return·​data_·​+·​header_length;​
50 ··​}47 ··​}
51 48
52 ··​char*·​body()​49 ··​char*·​body()​
53 ··​{50 ··​{
54 ····​return·​data_·​+·​header_length;​51 ····​return·​data_·​+·​header_length;​
55 ··​}52 ··​}
56 53
57 ··​size_t·​body_length()​·​const54 ··std:​:​size_t·​body_length()​·​const
58 ··​{55 ··​{
59 ····​return·​body_length_;​56 ····​return·​body_length_;​
60 ··​}57 ··​}
61 58
62 ··​void·​body_length(size_t·​new_length)​59 ··​void·​body_length(std:​:​size_t·​new_length)​
63 ··​{60 ··​{
64 ····​body_length_·​=·​new_length;​61 ····​body_length_·​=·​new_length;​
65 ····​if·​(body_length_·​>·​max_body_length)​62 ····​if·​(body_length_·​>·​max_body_length)​
66 ······​body_length_·​=·​max_body_length;​63 ······​body_length_·​=·​max_body_length;​
67 ··​}64 ··​}
68 65
69 ··​bool·​decode_header()​66 ··​bool·​decode_header()​
70 ··​{67 ··​{
71 ····​using·​namespace·​std;​·​/​/​·​For·​strncat·​and·​atoi.​
72 ····​char·​header[header_length·​+·​1]·​=·​"";​68 ····​char·​header[header_length·​+·​1]·​=·​"";​
73 ····​strncat(header,​·​data_,​·​header_length)​;​69 ····std:​:​strncat(header,​·​data_,​·​header_length)​;​
74 ····​body_length_·​=·​atoi(header)​;​70 ····​body_length_·​=·std:​:​atoi(header)​;​
75 ····​if·​(body_length_·​>·​max_body_length)​71 ····​if·​(body_length_·​>·​max_body_length)​
76 ····​{72 ····​{
77 ······​body_length_·​=·​0;​73 ······​body_length_·​=·​0;​
78 ······​return·​false;​74 ······​return·​false;​
79 ····​}75 ····​}
80 ····​return·​true;​76 ····​return·​true;​
81 ··​}77 ··​}
82 78
83 ··​void·​encode_header()​79 ··​void·​encode_header()​
84 ··​{80 ··​{
85 ····​using·​namespace·​std;​·​/​/​·​For·​sprintf·​and·​memcpy.​
86 ····​char·​header[header_length·​+·​1]·​=·​"";​81 ····​char·​header[header_length·​+·​1]·​=·​"";​
87 ····​sprintf(header,​·​"%4d",​·​static_cast<int>(body​_length_)​)​;​82 ····std:​:​sprintf(header,​·​"%4d",​·​static_cast<int>(body​_length_)​)​;​
88 ····​memcpy(data_,​·​header,​·​header_length)​;​83 ····std:​:​memcpy(data_,​·​header,​·​header_length)​;​
89 ··​}84 ··​}
90 85
91 private:​86 private:​
92 ··​char·​data_[header_length·​+·​max_body_length];​87 ··​char·​data_[header_length·​+·​max_body_length];​
93 ··​size_t·​body_length_;​88 ··std:​:​size_t·​body_length_;​
94 };​89 };​
95 90
96 #endif·​/​/​·​CHAT_MESSAGE_HPP91 #endif·​/​/​·​CHAT_MESSAGE_HPP