]> git.mxchange.org Git - flightgear.git/blob - src/Server/messagebuf.cxx
Multiplayer client/server system -- MessageBuf class and test harness complete
[flightgear.git] / src / Server / messagebuf.cxx
1 #include "messagebuf.hxx"\r
2 \r
3 #include <netinet/in.h>\r
4 \r
5 unsigned char FGMPSMessageBuf::get(bool raw)\r
6 {\r
7         if (pos >= buf.length())\r
8                 throw FGMPSDataException( "FGMPSMessageBuf: Read past end of buffer" );\r
9         if (raw) return buf[pos++];\r
10         if ((unsigned char)buf[pos] == 0xff) {\r
11                 pos++;\r
12                 return ((unsigned char)buf[pos++] ^ 0xff);\r
13         }\r
14         return buf[pos++];\r
15 }\r
16 \r
17 void FGMPSMessageBuf::put(unsigned char byte, bool raw)\r
18 {\r
19         if (!raw) {\r
20                 if ((byte & 0xf0) == 0xf0) {\r
21                         buf += 0xff;\r
22                         byte = byte ^ 0xff;\r
23                 }\r
24         }\r
25         buf += byte;\r
26 }\r
27 \r
28 void FGMPSMessageBuf::write1(void* data)\r
29 {\r
30         put(*(unsigned char *)data);\r
31 }\r
32 \r
33 void FGMPSMessageBuf::write2(void* data)\r
34 {\r
35         *((uint16_t*)tmp) = htons(*((uint16_t*)data));\r
36         put(tmp[0]); \r
37         put(tmp[1]); \r
38 }\r
39 \r
40 void FGMPSMessageBuf::write4(void* data)\r
41 {\r
42         *((uint32_t*)tmp) = htonl(*((uint32_t*)data));\r
43         put(tmp[0]); \r
44         put(tmp[1]); \r
45         put(tmp[2]); \r
46         put(tmp[3]); \r
47 }\r
48 \r
49 void FGMPSMessageBuf::write8(void* data)\r
50 {\r
51         *((uint32_t*)tmp+0) = htonl(*((uint32_t*)data+4));\r
52         *((uint32_t*)tmp+4) = htonl(*((uint32_t*)data+0));\r
53         put(tmp[0]); \r
54         put(tmp[1]); \r
55         put(tmp[2]); \r
56         put(tmp[3]); \r
57         put(tmp[4]); \r
58         put(tmp[5]); \r
59         put(tmp[6]); \r
60         put(tmp[7]); \r
61 }\r
62 \r
63 void FGMPSMessageBuf::writef(float data)\r
64 {\r
65         write4(&data);\r
66 }\r
67 \r
68 void FGMPSMessageBuf::writed(double data)\r
69 {\r
70         write8(&data);\r
71 }\r
72 \r
73 void FGMPSMessageBuf::writes(string data)\r
74 {\r
75         put(data.length());\r
76         for (int i=0; i<data.length(); i++) put(data[i]);\r
77 }\r
78 \r
79 void* FGMPSMessageBuf::read1()\r
80 {\r
81         tmp[0] = get();\r
82         return tmp;\r
83 }\r
84 \r
85 void* FGMPSMessageBuf::read2()\r
86 {\r
87         tmp[0] = get();\r
88         tmp[1] = get();\r
89         *((uint16_t*)tmp) = ntohs(*((uint16_t*)tmp));\r
90         return tmp;\r
91 }\r
92 \r
93 void* FGMPSMessageBuf::read4()\r
94 {\r
95         tmp[0] = get();\r
96         tmp[1] = get();\r
97         tmp[2] = get();\r
98         tmp[3] = get();\r
99         *((uint32_t*)tmp) = ntohl(*((uint32_t*)tmp));\r
100         return tmp;\r
101 }\r
102 \r
103 void* FGMPSMessageBuf::read8()\r
104 {\r
105         unsigned char res[32];\r
106 \r
107         res[0] = get();\r
108         res[1] = get();\r
109         res[2] = get();\r
110         res[3] = get();\r
111         res[4] = get();\r
112         res[5] = get();\r
113         res[6] = get();\r
114         res[7] = get();\r
115         *((uint32_t*)tmp+4) = ntohl(*((uint32_t*)res+0));\r
116         *((uint32_t*)tmp+0) = ntohl(*((uint32_t*)res+4));\r
117         return tmp;\r
118 }\r
119 \r
120 float FGMPSMessageBuf::readf()\r
121 {\r
122         return *((float*)read4());\r
123 }\r
124 \r
125 double FGMPSMessageBuf::readd()\r
126 {\r
127         return *((double*)read8());\r
128 }\r
129 \r
130 string FGMPSMessageBuf::reads(size_t length)\r
131 {\r
132         string  res = "";\r
133         for (int i=0; i<length; i++) res += get();\r
134         return res;\r
135 }\r
136 \r
137 \r
138 \r