blob: f1e4ec9a6cf70233b5ed8f4a5dca1c3ae89f8679 [file] [log] [blame]
Marc Slemkod42a2c22006-08-10 03:30:18 +00001#include "TBinaryProtocol.h"
2
Mark Slee8d7e1f62006-06-07 06:48:56 +00003using std::string;
Mark Sleee8540632006-05-30 09:24:40 +00004
Marc Slemko6f038a72006-08-03 18:58:09 +00005namespace facebook { namespace thrift { namespace protocol {
6
Marc Slemko16698852006-08-04 03:16:10 +00007uint32_t TBinaryProtocol::writeMessageBegin(shared_ptr<TTransport> out,
8 const TMessageType messageType,
9 const uint32_t seqid) const {
10 return
11 writeByte(out, (uint8_t)messageType) +
12 writeU32(out, seqid);
13}
14
15uint32_t TBinaryProtocol::writeMessageEnd(shared_ptr<TTransport> out) const {
16 return 0;
17}
18
19uint32_t TBinaryProtocol::writeStructBegin(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +000020 const string& name) const {
21 return 0;
Mark Sleee8540632006-05-30 09:24:40 +000022}
23
Marc Slemko16698852006-08-04 03:16:10 +000024uint32_t TBinaryProtocol::writeStructEnd(shared_ptr<TTransport> out) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000025 return 0;
Mark Sleee8540632006-05-30 09:24:40 +000026}
27
Marc Slemko16698852006-08-04 03:16:10 +000028uint32_t TBinaryProtocol::writeFieldBegin(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +000029 const string& name,
30 const TType fieldType,
Marc Slemko0b4ffa92006-08-11 02:49:29 +000031 const int16_t fieldId) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000032 return
33 writeByte(out, (uint8_t)fieldType) +
Marc Slemko0b4ffa92006-08-11 02:49:29 +000034 writeI16(out, fieldId);
Mark Slee8d7e1f62006-06-07 06:48:56 +000035}
36
Marc Slemko16698852006-08-04 03:16:10 +000037uint32_t TBinaryProtocol::writeFieldEnd(shared_ptr<TTransport> out) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000038 return 0;
39}
40
Marc Slemko16698852006-08-04 03:16:10 +000041uint32_t TBinaryProtocol::writeFieldStop(shared_ptr<TTransport> out) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000042 return
43 writeByte(out, (uint8_t)T_STOP);
44}
45
Marc Slemko16698852006-08-04 03:16:10 +000046uint32_t TBinaryProtocol::writeMapBegin(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +000047 const TType keyType,
48 const TType valType,
Mark Sleef3c322b2006-06-26 23:52:22 +000049 const int32_t size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000050 return
51 writeByte(out, (uint8_t)keyType) +
52 writeByte(out, (uint8_t)valType) +
Mark Sleef3c322b2006-06-26 23:52:22 +000053 writeI32(out, (int32_t)size);
Mark Slee8d7e1f62006-06-07 06:48:56 +000054}
55
Marc Slemko16698852006-08-04 03:16:10 +000056uint32_t TBinaryProtocol::writeMapEnd(shared_ptr<TTransport> out) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000057 return 0;
58}
59
Marc Slemko16698852006-08-04 03:16:10 +000060uint32_t TBinaryProtocol::writeListBegin(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +000061 const TType elemType,
Mark Sleef3c322b2006-06-26 23:52:22 +000062 const int32_t size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000063 return
64 writeByte(out, (uint8_t) elemType) +
Mark Sleef3c322b2006-06-26 23:52:22 +000065 writeI32(out, (int32_t)size);
Mark Slee8d7e1f62006-06-07 06:48:56 +000066}
67
Marc Slemko16698852006-08-04 03:16:10 +000068uint32_t TBinaryProtocol::writeListEnd(shared_ptr<TTransport> out) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000069 return 0;
70}
71
Marc Slemko16698852006-08-04 03:16:10 +000072uint32_t TBinaryProtocol::writeSetBegin(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +000073 const TType elemType,
Mark Sleef3c322b2006-06-26 23:52:22 +000074 const int32_t size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000075 return
76 writeByte(out, (uint8_t)elemType) +
Mark Sleef3c322b2006-06-26 23:52:22 +000077 writeI32(out, (int32_t)size);
Mark Slee8d7e1f62006-06-07 06:48:56 +000078}
79
Marc Slemko16698852006-08-04 03:16:10 +000080uint32_t TBinaryProtocol::writeSetEnd(shared_ptr<TTransport> out) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000081 return 0;
82}
83
Marc Slemko0b4ffa92006-08-11 02:49:29 +000084uint32_t TBinaryProtocol::writeBool(shared_ptr<TTransport> out,
85 const bool value) const {
86 uint8_t tmp = value ? 1 : 0;
87 out->write(&tmp, 1);
88 return 1;
89}
90
Marc Slemko16698852006-08-04 03:16:10 +000091uint32_t TBinaryProtocol::writeByte(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +000092 const uint8_t byte) const {
93 out->write(&byte, 1);
94 return 1;
95}
96
Marc Slemko0b4ffa92006-08-11 02:49:29 +000097uint32_t TBinaryProtocol::writeU16(shared_ptr<TTransport> out,
98 const uint16_t u16) const {
99 uint16_t net = (uint16_t)htons(u16);
100 out->write((uint8_t*)&net, 2);
101 return 2;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000102}
103
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000104uint32_t TBinaryProtocol::writeI16(shared_ptr<TTransport> out,
105 const int16_t i16) const {
106 int16_t net = (int16_t)htons(i16);
107 out->write((uint8_t*)&net, 2);
108 return 2;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000109}
110
Marc Slemko16698852006-08-04 03:16:10 +0000111uint32_t TBinaryProtocol::writeU64(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000112 const uint64_t u64) const {
113 uint64_t net = (uint64_t)htonll(u64);
114 out->write((uint8_t*)&net, 8);
115 return 8;
116}
117
Marc Slemko16698852006-08-04 03:16:10 +0000118uint32_t TBinaryProtocol::writeI64(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000119 const int64_t i64) const {
120 int64_t net = (int64_t)htonll(i64);
121 out->write((uint8_t*)&net, 8);
122 return 8;
123}
124
Marc Slemko16698852006-08-04 03:16:10 +0000125uint32_t TBinaryProtocol::writeString(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000126 const string& str) const {
Mark Sleef3c322b2006-06-26 23:52:22 +0000127 uint32_t result = writeI32(out, str.size());
Mark Slee8d7e1f62006-06-07 06:48:56 +0000128 out->write((uint8_t*)str.data(), str.size());
129 return result + str.size();
130}
131
132/**
133 * Reading functions
134 */
135
Marc Slemko16698852006-08-04 03:16:10 +0000136uint32_t TBinaryProtocol::readMessasgeBegin(shared_ptr<TTransport> in,
137 TMessageType& messageType,
138 uint32_t& seqid) const {
139
140 uint32_t result = 0;
141 uint8_t type;
142 result+= readByte(in, type);
143 messageType = (TMessageType)type;
144 result+= readU32(in, seqid);
145 return result;
146}
147
148uint32_t TBinaryProtocol::readMessageEnd(shared_ptr<TTransport> in) const{
149 return 0;
150}
151
152uint32_t TBinaryProtocol::readStructBegin(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000153 string& name) const {
154 name = "";
155 return 0;
156}
157
Marc Slemko16698852006-08-04 03:16:10 +0000158uint32_t TBinaryProtocol::readStructEnd(shared_ptr<TTransport> in) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000159 return 0;
160}
161
Marc Slemko16698852006-08-04 03:16:10 +0000162uint32_t TBinaryProtocol::readFieldBegin(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000163 string& name,
164 TType& fieldType,
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000165 int16_t& fieldId) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000166 uint32_t result = 0;
167 uint8_t type;
168 result += readByte(in, type);
169 fieldType = (TType)type;
170 if (fieldType == T_STOP) {
171 fieldId = 0;
172 return result;
173 }
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000174 result += readI16(in, fieldId);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000175 return result;
176}
Mark Sleee8540632006-05-30 09:24:40 +0000177
Marc Slemko16698852006-08-04 03:16:10 +0000178uint32_t TBinaryProtocol::readFieldEnd(shared_ptr<TTransport> in) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000179 return 0;
Mark Sleee8540632006-05-30 09:24:40 +0000180}
Mark Slee8d7e1f62006-06-07 06:48:56 +0000181
Marc Slemko16698852006-08-04 03:16:10 +0000182uint32_t TBinaryProtocol::readMapBegin(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000183 TType& keyType,
184 TType& valType,
Mark Sleef3c322b2006-06-26 23:52:22 +0000185 int32_t& size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000186 uint8_t k, v;
187 uint32_t result = 0;
188 result += readByte(in, k);
189 keyType = (TType)k;
190 result += readByte(in, v);
191 valType = (TType)v;
Mark Sleef3c322b2006-06-26 23:52:22 +0000192 result += readI32(in, size);
Mark Sleee8540632006-05-30 09:24:40 +0000193 return result;
194}
195
Marc Slemko16698852006-08-04 03:16:10 +0000196uint32_t TBinaryProtocol::readMapEnd(shared_ptr<TTransport> in) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000197 return 0;
198}
199
Marc Slemko16698852006-08-04 03:16:10 +0000200uint32_t TBinaryProtocol::readListBegin(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000201 TType& elemType,
Mark Sleef3c322b2006-06-26 23:52:22 +0000202 int32_t& size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000203 uint8_t e;
204 uint32_t result = 0;
205 result += readByte(in, e);
206 elemType = (TType)e;
Mark Sleef3c322b2006-06-26 23:52:22 +0000207 result += readI32(in, size);
Mark Sleee8540632006-05-30 09:24:40 +0000208 return result;
209}
210
Marc Slemko16698852006-08-04 03:16:10 +0000211uint32_t TBinaryProtocol::readListEnd(shared_ptr<TTransport> in) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000212 return 0;
213}
214
Marc Slemko16698852006-08-04 03:16:10 +0000215uint32_t TBinaryProtocol::readSetBegin(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000216 TType& elemType,
Mark Sleef3c322b2006-06-26 23:52:22 +0000217 int32_t& size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000218 uint8_t e;
219 uint32_t result = 0;
220 result += readByte(in, e);
221 elemType = (TType)e;
Mark Sleef3c322b2006-06-26 23:52:22 +0000222 result += readI32(in, size);
Mark Sleee8540632006-05-30 09:24:40 +0000223 return result;
224}
225
Marc Slemko16698852006-08-04 03:16:10 +0000226uint32_t TBinaryProtocol::readSetEnd(shared_ptr<TTransport> in) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000227 return 0;
Mark Sleee8540632006-05-30 09:24:40 +0000228}
229
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000230uint32_t TBinaryProtocol::readBool(shared_ptr<TTransport> in,
231 bool& value) const {
232 uint8_t b[1];
233 in->readAll(b, 1);
234 value = *(uint8_t*)b != 0;
235 return 1;
236}
237
Marc Slemko16698852006-08-04 03:16:10 +0000238uint32_t TBinaryProtocol::readByte(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000239 uint8_t& byte) const {
240 uint8_t b[1];
241 in->readAll(b, 1);
242 byte = *(uint8_t*)b;
243 return 1;
Mark Sleee8540632006-05-30 09:24:40 +0000244}
245
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000246uint32_t TBinaryProtocol::readU16(shared_ptr<TTransport> in,
247 uint16_t& u16) const {
248 uint8_t b[2];
249 in->readAll(b, 2);
250 u16 = *(uint16_t*)b;
251 u16 = (uint16_t)ntohs(u16);
252 return 2;
253}
254
255uint32_t TBinaryProtocol::readI16(shared_ptr<TTransport> in,
256 int16_t& i16) const {
257 uint8_t b[2];
258 in->readAll(b, 2);
259 i16 = *(int16_t*)b;
260 i16 = (int16_t)ntohs(i16);
261 return 2;
262}
263
Marc Slemko16698852006-08-04 03:16:10 +0000264uint32_t TBinaryProtocol::readU32(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000265 uint32_t& u32) const {
266 uint8_t b[4];
267 in->readAll(b, 4);
268 u32 = *(uint32_t*)b;
269 u32 = (uint32_t)ntohl(u32);
270 return 4;
Mark Sleee8540632006-05-30 09:24:40 +0000271}
272
Marc Slemko16698852006-08-04 03:16:10 +0000273uint32_t TBinaryProtocol::readI32(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000274 int32_t& i32) const {
275 uint8_t b[4];
276 in->readAll(b, 4);
277 i32 = *(int32_t*)b;
278 i32 = (int32_t)ntohl(i32);
279 return 4;
Mark Sleee8540632006-05-30 09:24:40 +0000280}
281
Marc Slemko16698852006-08-04 03:16:10 +0000282uint32_t TBinaryProtocol::readU64(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000283 uint64_t& u64) const {
284 uint8_t b[8];
285 in->readAll(b, 8);
286 u64 = *(uint64_t*)b;
287 u64 = (uint64_t)ntohll(u64);
288 return 8;
Mark Sleee8540632006-05-30 09:24:40 +0000289}
290
Marc Slemko16698852006-08-04 03:16:10 +0000291uint32_t TBinaryProtocol::readI64(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000292 int64_t& i64) const {
293 uint8_t b[8];
294 in->readAll(b, 8);
295 i64 = *(int64_t*)b;
296 i64 = (int64_t)ntohll(i64);
297 return 8;
Mark Sleee8540632006-05-30 09:24:40 +0000298}
299
Marc Slemko16698852006-08-04 03:16:10 +0000300uint32_t TBinaryProtocol::readString(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000301 string& str) const {
Mark Sleef3c322b2006-06-26 23:52:22 +0000302 uint32_t result;
303 int32_t size;
304 result = readI32(in, size);
Mark Slee6e536442006-06-30 18:28:50 +0000305
306 // Use the heap here to prevent stack overflow for v. large strings
307 uint8_t *b = new uint8_t[size];
Mark Slee8d7e1f62006-06-07 06:48:56 +0000308 in->readAll(b, size);
309 str = string((char*)b, size);
Mark Slee6e536442006-06-30 18:28:50 +0000310 delete [] b;
311
Mark Sleef3c322b2006-06-26 23:52:22 +0000312 return result + (uint32_t)size;
Mark Sleee8540632006-05-30 09:24:40 +0000313}
Marc Slemko6f038a72006-08-03 18:58:09 +0000314}}} // facebook::thrift::protocol