blob: 624965b693dc302bb42c45e3cb7b1bc0d63d2d45 [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,
31 const uint16_t fieldId) const {
32 return
33 writeByte(out, (uint8_t)fieldType) +
Mark Sleef3c322b2006-06-26 23:52:22 +000034 writeI32(out, (int32_t)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 Slemko16698852006-08-04 03:16:10 +000084uint32_t TBinaryProtocol::writeByte(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +000085 const uint8_t byte) const {
86 out->write(&byte, 1);
87 return 1;
88}
89
Marc Slemko16698852006-08-04 03:16:10 +000090uint32_t TBinaryProtocol::writeU32(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +000091 const uint32_t u32) const {
92 uint32_t net = (uint32_t)htonl(u32);
93 out->write((uint8_t*)&net, 4);
94 return 4;
95}
96
Marc Slemko16698852006-08-04 03:16:10 +000097uint32_t TBinaryProtocol::writeI32(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +000098 const int32_t i32) const {
99 int32_t net = (int32_t)htonl(i32);
100 out->write((uint8_t*)&net, 4);
101 return 4;
102}
103
Marc Slemko16698852006-08-04 03:16:10 +0000104uint32_t TBinaryProtocol::writeU64(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000105 const uint64_t u64) const {
106 uint64_t net = (uint64_t)htonll(u64);
107 out->write((uint8_t*)&net, 8);
108 return 8;
109}
110
Marc Slemko16698852006-08-04 03:16:10 +0000111uint32_t TBinaryProtocol::writeI64(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000112 const int64_t i64) const {
113 int64_t net = (int64_t)htonll(i64);
114 out->write((uint8_t*)&net, 8);
115 return 8;
116}
117
Marc Slemko16698852006-08-04 03:16:10 +0000118uint32_t TBinaryProtocol::writeString(shared_ptr<TTransport> out,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000119 const string& str) const {
Mark Sleef3c322b2006-06-26 23:52:22 +0000120 uint32_t result = writeI32(out, str.size());
Mark Slee8d7e1f62006-06-07 06:48:56 +0000121 out->write((uint8_t*)str.data(), str.size());
122 return result + str.size();
123}
124
125/**
126 * Reading functions
127 */
128
Marc Slemko16698852006-08-04 03:16:10 +0000129uint32_t TBinaryProtocol::readMessasgeBegin(shared_ptr<TTransport> in,
130 TMessageType& messageType,
131 uint32_t& seqid) const {
132
133 uint32_t result = 0;
134 uint8_t type;
135 result+= readByte(in, type);
136 messageType = (TMessageType)type;
137 result+= readU32(in, seqid);
138 return result;
139}
140
141uint32_t TBinaryProtocol::readMessageEnd(shared_ptr<TTransport> in) const{
142 return 0;
143}
144
145uint32_t TBinaryProtocol::readStructBegin(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000146 string& name) const {
147 name = "";
148 return 0;
149}
150
Marc Slemko16698852006-08-04 03:16:10 +0000151uint32_t TBinaryProtocol::readStructEnd(shared_ptr<TTransport> in) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000152 return 0;
153}
154
Marc Slemko16698852006-08-04 03:16:10 +0000155uint32_t TBinaryProtocol::readFieldBegin(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000156 string& name,
157 TType& fieldType,
158 uint16_t& fieldId) const {
159 uint32_t result = 0;
160 uint8_t type;
161 result += readByte(in, type);
162 fieldType = (TType)type;
163 if (fieldType == T_STOP) {
164 fieldId = 0;
165 return result;
166 }
Mark Sleef3c322b2006-06-26 23:52:22 +0000167 int32_t id;
168 result += readI32(in, id);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000169 fieldId = (uint16_t)id;
170 return result;
171}
Mark Sleee8540632006-05-30 09:24:40 +0000172
Marc Slemko16698852006-08-04 03:16:10 +0000173uint32_t TBinaryProtocol::readFieldEnd(shared_ptr<TTransport> in) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000174 return 0;
Mark Sleee8540632006-05-30 09:24:40 +0000175}
Mark Slee8d7e1f62006-06-07 06:48:56 +0000176
Marc Slemko16698852006-08-04 03:16:10 +0000177uint32_t TBinaryProtocol::readMapBegin(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000178 TType& keyType,
179 TType& valType,
Mark Sleef3c322b2006-06-26 23:52:22 +0000180 int32_t& size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000181 uint8_t k, v;
182 uint32_t result = 0;
183 result += readByte(in, k);
184 keyType = (TType)k;
185 result += readByte(in, v);
186 valType = (TType)v;
Mark Sleef3c322b2006-06-26 23:52:22 +0000187 result += readI32(in, size);
Mark Sleee8540632006-05-30 09:24:40 +0000188 return result;
189}
190
Marc Slemko16698852006-08-04 03:16:10 +0000191uint32_t TBinaryProtocol::readMapEnd(shared_ptr<TTransport> in) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000192 return 0;
193}
194
Marc Slemko16698852006-08-04 03:16:10 +0000195uint32_t TBinaryProtocol::readListBegin(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000196 TType& elemType,
Mark Sleef3c322b2006-06-26 23:52:22 +0000197 int32_t& size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000198 uint8_t e;
199 uint32_t result = 0;
200 result += readByte(in, e);
201 elemType = (TType)e;
Mark Sleef3c322b2006-06-26 23:52:22 +0000202 result += readI32(in, size);
Mark Sleee8540632006-05-30 09:24:40 +0000203 return result;
204}
205
Marc Slemko16698852006-08-04 03:16:10 +0000206uint32_t TBinaryProtocol::readListEnd(shared_ptr<TTransport> in) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000207 return 0;
208}
209
Marc Slemko16698852006-08-04 03:16:10 +0000210uint32_t TBinaryProtocol::readSetBegin(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000211 TType& elemType,
Mark Sleef3c322b2006-06-26 23:52:22 +0000212 int32_t& size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000213 uint8_t e;
214 uint32_t result = 0;
215 result += readByte(in, e);
216 elemType = (TType)e;
Mark Sleef3c322b2006-06-26 23:52:22 +0000217 result += readI32(in, size);
Mark Sleee8540632006-05-30 09:24:40 +0000218 return result;
219}
220
Marc Slemko16698852006-08-04 03:16:10 +0000221uint32_t TBinaryProtocol::readSetEnd(shared_ptr<TTransport> in) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000222 return 0;
Mark Sleee8540632006-05-30 09:24:40 +0000223}
224
Marc Slemko16698852006-08-04 03:16:10 +0000225uint32_t TBinaryProtocol::readByte(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000226 uint8_t& byte) const {
227 uint8_t b[1];
228 in->readAll(b, 1);
229 byte = *(uint8_t*)b;
230 return 1;
Mark Sleee8540632006-05-30 09:24:40 +0000231}
232
Marc Slemko16698852006-08-04 03:16:10 +0000233uint32_t TBinaryProtocol::readU32(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000234 uint32_t& u32) const {
235 uint8_t b[4];
236 in->readAll(b, 4);
237 u32 = *(uint32_t*)b;
238 u32 = (uint32_t)ntohl(u32);
239 return 4;
Mark Sleee8540632006-05-30 09:24:40 +0000240}
241
Marc Slemko16698852006-08-04 03:16:10 +0000242uint32_t TBinaryProtocol::readI32(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000243 int32_t& i32) const {
244 uint8_t b[4];
245 in->readAll(b, 4);
246 i32 = *(int32_t*)b;
247 i32 = (int32_t)ntohl(i32);
248 return 4;
Mark Sleee8540632006-05-30 09:24:40 +0000249}
250
Marc Slemko16698852006-08-04 03:16:10 +0000251uint32_t TBinaryProtocol::readU64(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000252 uint64_t& u64) const {
253 uint8_t b[8];
254 in->readAll(b, 8);
255 u64 = *(uint64_t*)b;
256 u64 = (uint64_t)ntohll(u64);
257 return 8;
Mark Sleee8540632006-05-30 09:24:40 +0000258}
259
Marc Slemko16698852006-08-04 03:16:10 +0000260uint32_t TBinaryProtocol::readI64(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000261 int64_t& i64) const {
262 uint8_t b[8];
263 in->readAll(b, 8);
264 i64 = *(int64_t*)b;
265 i64 = (int64_t)ntohll(i64);
266 return 8;
Mark Sleee8540632006-05-30 09:24:40 +0000267}
268
Marc Slemko16698852006-08-04 03:16:10 +0000269uint32_t TBinaryProtocol::readString(shared_ptr<TTransport> in,
Mark Slee8d7e1f62006-06-07 06:48:56 +0000270 string& str) const {
Mark Sleef3c322b2006-06-26 23:52:22 +0000271 uint32_t result;
272 int32_t size;
273 result = readI32(in, size);
Mark Slee6e536442006-06-30 18:28:50 +0000274
275 // Use the heap here to prevent stack overflow for v. large strings
276 uint8_t *b = new uint8_t[size];
Mark Slee8d7e1f62006-06-07 06:48:56 +0000277 in->readAll(b, size);
278 str = string((char*)b, size);
Mark Slee6e536442006-06-30 18:28:50 +0000279 delete [] b;
280
Mark Sleef3c322b2006-06-26 23:52:22 +0000281 return result + (uint32_t)size;
Mark Sleee8540632006-05-30 09:24:40 +0000282}
Marc Slemko6f038a72006-08-03 18:58:09 +0000283}}} // facebook::thrift::protocol