blob: ed482b88c57860fa41157cdb6250140ac391f9d6 [file] [log] [blame]
Mark Sleee8540632006-05-30 09:24:40 +00001#include "protocol/TBinaryProtocol.h"
Mark Slee8d7e1f62006-06-07 06:48:56 +00002using std::string;
Mark Sleee8540632006-05-30 09:24:40 +00003
Marc Slemko6f038a72006-08-03 18:58:09 +00004namespace facebook { namespace thrift { namespace protocol {
5
Mark Slee8d7e1f62006-06-07 06:48:56 +00006uint32_t TBinaryProtocol::writeStructBegin(TTransport* out,
7 const string& name) const {
8 return 0;
Mark Sleee8540632006-05-30 09:24:40 +00009}
10
Mark Slee8d7e1f62006-06-07 06:48:56 +000011uint32_t TBinaryProtocol::writeStructEnd(TTransport* out) const {
12 return 0;
Mark Sleee8540632006-05-30 09:24:40 +000013}
14
Mark Slee8d7e1f62006-06-07 06:48:56 +000015uint32_t TBinaryProtocol::writeFieldBegin(TTransport* out,
16 const string& name,
17 const TType fieldType,
18 const uint16_t fieldId) const {
19 return
20 writeByte(out, (uint8_t)fieldType) +
Mark Sleef3c322b2006-06-26 23:52:22 +000021 writeI32(out, (int32_t)fieldId);
Mark Slee8d7e1f62006-06-07 06:48:56 +000022}
23
24uint32_t TBinaryProtocol::writeFieldEnd(TTransport* out) const {
25 return 0;
26}
27
28uint32_t TBinaryProtocol::writeFieldStop(TTransport* out) const {
29 return
30 writeByte(out, (uint8_t)T_STOP);
31}
32
33uint32_t TBinaryProtocol::writeMapBegin(TTransport* out,
34 const TType keyType,
35 const TType valType,
Mark Sleef3c322b2006-06-26 23:52:22 +000036 const int32_t size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000037 return
38 writeByte(out, (uint8_t)keyType) +
39 writeByte(out, (uint8_t)valType) +
Mark Sleef3c322b2006-06-26 23:52:22 +000040 writeI32(out, (int32_t)size);
Mark Slee8d7e1f62006-06-07 06:48:56 +000041}
42
43uint32_t TBinaryProtocol::writeMapEnd(TTransport* out) const {
44 return 0;
45}
46
47uint32_t TBinaryProtocol::writeListBegin(TTransport* out,
48 const TType elemType,
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) elemType) +
Mark Sleef3c322b2006-06-26 23:52:22 +000052 writeI32(out, (int32_t)size);
Mark Slee8d7e1f62006-06-07 06:48:56 +000053}
54
55uint32_t TBinaryProtocol::writeListEnd(TTransport* out) const {
56 return 0;
57}
58
59uint32_t TBinaryProtocol::writeSetBegin(TTransport* out,
60 const TType elemType,
Mark Sleef3c322b2006-06-26 23:52:22 +000061 const int32_t size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +000062 return
63 writeByte(out, (uint8_t)elemType) +
Mark Sleef3c322b2006-06-26 23:52:22 +000064 writeI32(out, (int32_t)size);
Mark Slee8d7e1f62006-06-07 06:48:56 +000065}
66
67uint32_t TBinaryProtocol::writeSetEnd(TTransport* out) const {
68 return 0;
69}
70
71uint32_t TBinaryProtocol::writeByte(TTransport* out,
72 const uint8_t byte) const {
73 out->write(&byte, 1);
74 return 1;
75}
76
77uint32_t TBinaryProtocol::writeU32(TTransport* out,
78 const uint32_t u32) const {
79 uint32_t net = (uint32_t)htonl(u32);
80 out->write((uint8_t*)&net, 4);
81 return 4;
82}
83
84uint32_t TBinaryProtocol::writeI32(TTransport* out,
85 const int32_t i32) const {
86 int32_t net = (int32_t)htonl(i32);
87 out->write((uint8_t*)&net, 4);
88 return 4;
89}
90
91uint32_t TBinaryProtocol::writeU64(TTransport* out,
92 const uint64_t u64) const {
93 uint64_t net = (uint64_t)htonll(u64);
94 out->write((uint8_t*)&net, 8);
95 return 8;
96}
97
98uint32_t TBinaryProtocol::writeI64(TTransport* out,
99 const int64_t i64) const {
100 int64_t net = (int64_t)htonll(i64);
101 out->write((uint8_t*)&net, 8);
102 return 8;
103}
104
105uint32_t TBinaryProtocol::writeString(TTransport* out,
106 const string& str) const {
Mark Sleef3c322b2006-06-26 23:52:22 +0000107 uint32_t result = writeI32(out, str.size());
Mark Slee8d7e1f62006-06-07 06:48:56 +0000108 out->write((uint8_t*)str.data(), str.size());
109 return result + str.size();
110}
111
112/**
113 * Reading functions
114 */
115
116uint32_t TBinaryProtocol::readStructBegin(TTransport* in,
117 string& name) const {
118 name = "";
119 return 0;
120}
121
122uint32_t TBinaryProtocol::readStructEnd(TTransport* in) const {
123 return 0;
124}
125
126uint32_t TBinaryProtocol::readFieldBegin(TTransport* in,
127 string& name,
128 TType& fieldType,
129 uint16_t& fieldId) const {
130 uint32_t result = 0;
131 uint8_t type;
132 result += readByte(in, type);
133 fieldType = (TType)type;
134 if (fieldType == T_STOP) {
135 fieldId = 0;
136 return result;
137 }
Mark Sleef3c322b2006-06-26 23:52:22 +0000138 int32_t id;
139 result += readI32(in, id);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000140 fieldId = (uint16_t)id;
141 return result;
142}
Mark Sleee8540632006-05-30 09:24:40 +0000143
Mark Slee8d7e1f62006-06-07 06:48:56 +0000144uint32_t TBinaryProtocol::readFieldEnd(TTransport* in) const {
145 return 0;
Mark Sleee8540632006-05-30 09:24:40 +0000146}
Mark Slee8d7e1f62006-06-07 06:48:56 +0000147
148uint32_t TBinaryProtocol::readMapBegin(TTransport* in,
149 TType& keyType,
150 TType& valType,
Mark Sleef3c322b2006-06-26 23:52:22 +0000151 int32_t& size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000152 uint8_t k, v;
153 uint32_t result = 0;
154 result += readByte(in, k);
155 keyType = (TType)k;
156 result += readByte(in, v);
157 valType = (TType)v;
Mark Sleef3c322b2006-06-26 23:52:22 +0000158 result += readI32(in, size);
Mark Sleee8540632006-05-30 09:24:40 +0000159 return result;
160}
161
Mark Slee8d7e1f62006-06-07 06:48:56 +0000162uint32_t TBinaryProtocol::readMapEnd(TTransport* in) const {
163 return 0;
164}
165
166uint32_t TBinaryProtocol::readListBegin(TTransport* in,
167 TType& elemType,
Mark Sleef3c322b2006-06-26 23:52:22 +0000168 int32_t& size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000169 uint8_t e;
170 uint32_t result = 0;
171 result += readByte(in, e);
172 elemType = (TType)e;
Mark Sleef3c322b2006-06-26 23:52:22 +0000173 result += readI32(in, size);
Mark Sleee8540632006-05-30 09:24:40 +0000174 return result;
175}
176
Mark Slee8d7e1f62006-06-07 06:48:56 +0000177uint32_t TBinaryProtocol::readListEnd(TTransport* in) const {
178 return 0;
179}
180
181uint32_t TBinaryProtocol::readSetBegin(TTransport* in,
182 TType& elemType,
Mark Sleef3c322b2006-06-26 23:52:22 +0000183 int32_t& size) const {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000184 uint8_t e;
185 uint32_t result = 0;
186 result += readByte(in, e);
187 elemType = (TType)e;
Mark Sleef3c322b2006-06-26 23:52:22 +0000188 result += readI32(in, size);
Mark Sleee8540632006-05-30 09:24:40 +0000189 return result;
190}
191
Mark Slee8d7e1f62006-06-07 06:48:56 +0000192uint32_t TBinaryProtocol::readSetEnd(TTransport* in) const {
193 return 0;
Mark Sleee8540632006-05-30 09:24:40 +0000194}
195
Mark Slee8d7e1f62006-06-07 06:48:56 +0000196uint32_t TBinaryProtocol::readByte(TTransport* in,
197 uint8_t& byte) const {
198 uint8_t b[1];
199 in->readAll(b, 1);
200 byte = *(uint8_t*)b;
201 return 1;
Mark Sleee8540632006-05-30 09:24:40 +0000202}
203
Mark Slee8d7e1f62006-06-07 06:48:56 +0000204uint32_t TBinaryProtocol::readU32(TTransport* in,
205 uint32_t& u32) const {
206 uint8_t b[4];
207 in->readAll(b, 4);
208 u32 = *(uint32_t*)b;
209 u32 = (uint32_t)ntohl(u32);
210 return 4;
Mark Sleee8540632006-05-30 09:24:40 +0000211}
212
Mark Slee8d7e1f62006-06-07 06:48:56 +0000213uint32_t TBinaryProtocol::readI32(TTransport* in,
214 int32_t& i32) const {
215 uint8_t b[4];
216 in->readAll(b, 4);
217 i32 = *(int32_t*)b;
218 i32 = (int32_t)ntohl(i32);
219 return 4;
Mark Sleee8540632006-05-30 09:24:40 +0000220}
221
Mark Slee8d7e1f62006-06-07 06:48:56 +0000222uint32_t TBinaryProtocol::readU64(TTransport* in,
223 uint64_t& u64) const {
224 uint8_t b[8];
225 in->readAll(b, 8);
226 u64 = *(uint64_t*)b;
227 u64 = (uint64_t)ntohll(u64);
228 return 8;
Mark Sleee8540632006-05-30 09:24:40 +0000229}
230
Mark Slee8d7e1f62006-06-07 06:48:56 +0000231uint32_t TBinaryProtocol::readI64(TTransport* in,
232 int64_t& i64) const {
233 uint8_t b[8];
234 in->readAll(b, 8);
235 i64 = *(int64_t*)b;
236 i64 = (int64_t)ntohll(i64);
237 return 8;
Mark Sleee8540632006-05-30 09:24:40 +0000238}
239
Mark Slee8d7e1f62006-06-07 06:48:56 +0000240uint32_t TBinaryProtocol::readString(TTransport* in,
241 string& str) const {
Mark Sleef3c322b2006-06-26 23:52:22 +0000242 uint32_t result;
243 int32_t size;
244 result = readI32(in, size);
Mark Slee6e536442006-06-30 18:28:50 +0000245
246 // Use the heap here to prevent stack overflow for v. large strings
247 uint8_t *b = new uint8_t[size];
Mark Slee8d7e1f62006-06-07 06:48:56 +0000248 in->readAll(b, size);
249 str = string((char*)b, size);
Mark Slee6e536442006-06-30 18:28:50 +0000250 delete [] b;
251
Mark Sleef3c322b2006-06-26 23:52:22 +0000252 return result + (uint32_t)size;
Mark Sleee8540632006-05-30 09:24:40 +0000253}
Marc Slemko6f038a72006-08-03 18:58:09 +0000254}}} // facebook::thrift::protocol