blob: 0c513d14c161c70c67dbeecea13fc62e9d165e26 [file] [log] [blame]
David Reissea2cba82009-03-30 21:35:00 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
Mark Slee9f0c6512007-02-28 23:58:26 +000019
Mark Sleef5f2be42006-09-05 21:05:31 +000020#ifndef _THRIFT_PROTOCOL_TPROTOCOL_H_
21#define _THRIFT_PROTOCOL_TPROTOCOL_H_ 1
Mark Sleee8540632006-05-30 09:24:40 +000022
Marc Slemko16698852006-08-04 03:16:10 +000023#include <transport/TTransport.h>
Mark Sleef9831082007-02-20 20:59:21 +000024#include <protocol/TProtocolException.h>
Marc Slemko16698852006-08-04 03:16:10 +000025
26#include <boost/shared_ptr.hpp>
27
Mark Slee8d7e1f62006-06-07 06:48:56 +000028#include <netinet/in.h>
Mark Sleee8540632006-05-30 09:24:40 +000029#include <sys/types.h>
30#include <string>
31#include <map>
32
T Jake Lucianib5e62212009-01-31 22:36:20 +000033namespace apache { namespace thrift { namespace protocol {
Marc Slemko6f038a72006-08-03 18:58:09 +000034
T Jake Lucianib5e62212009-01-31 22:36:20 +000035using apache::thrift::transport::TTransport;
Marc Slemko6f038a72006-08-03 18:58:09 +000036
Mark Slee4f261c52007-04-13 00:33:24 +000037#ifdef HAVE_ENDIAN_H
38#include <endian.h>
39#endif
40
Mark Slee1d2ead32007-06-09 01:23:04 +000041#ifndef __BYTE_ORDER
42# if defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
43# define __BYTE_ORDER BYTE_ORDER
44# define __LITTLE_ENDIAN LITTLE_ENDIAN
45# define __BIG_ENDIAN BIG_ENDIAN
46# else
47# error "Cannot determine endianness"
48# endif
49#endif
50
Mark Sleedc8a2a22006-09-19 22:20:18 +000051#if __BYTE_ORDER == __BIG_ENDIAN
Mark Slee4f261c52007-04-13 00:33:24 +000052# define ntohll(n) (n)
53# define htonll(n) (n)
54#elif __BYTE_ORDER == __LITTLE_ENDIAN
55# if defined(__GNUC__) && defined(__GLIBC__)
56# include <byteswap.h>
57# define ntohll(n) bswap_64(n)
58# define htonll(n) bswap_64(n)
59# else /* GNUC & GLIBC */
60# define ntohll(n) ( (((unsigned long long)ntohl(n)) << 32) + ntohl(n >> 32) )
61# define htonll(n) ( (((unsigned long long)htonl(n)) << 32) + htonl(n >> 32) )
62# endif /* GNUC & GLIBC */
63#else /* __BYTE_ORDER */
64# error "Can't define htonll or ntohll!"
Mark Sleedc8a2a22006-09-19 22:20:18 +000065#endif
Mark Slee8d7e1f62006-06-07 06:48:56 +000066
Mark Sleee8540632006-05-30 09:24:40 +000067/**
Mark Slee8d7e1f62006-06-07 06:48:56 +000068 * Enumerated definition of the types that the Thrift protocol supports.
69 * Take special note of the T_END type which is used specifically to mark
70 * the end of a sequence of fields.
71 */
72enum TType {
Marc Slemkod42a2c22006-08-10 03:30:18 +000073 T_STOP = 0,
Marc Slemko5b126d62006-08-11 23:03:42 +000074 T_VOID = 1,
75 T_BOOL = 2,
76 T_BYTE = 3,
Mark Sleecfc01932006-09-01 22:18:16 +000077 T_I08 = 3,
Marc Slemko5b126d62006-08-11 23:03:42 +000078 T_I16 = 6,
Marc Slemko5b126d62006-08-11 23:03:42 +000079 T_I32 = 8,
80 T_U64 = 9,
81 T_I64 = 10,
Mark Sleec98d0502006-09-06 02:42:25 +000082 T_DOUBLE = 4,
Marc Slemko5b126d62006-08-11 23:03:42 +000083 T_STRING = 11,
Marc Slemkod97eb612006-08-24 23:37:36 +000084 T_UTF7 = 11,
85 T_STRUCT = 12,
86 T_MAP = 13,
87 T_SET = 14,
88 T_LIST = 15,
89 T_UTF8 = 16,
90 T_UTF16 = 17
Mark Slee8d7e1f62006-06-07 06:48:56 +000091};
92
93/**
Mark Sleef5f2be42006-09-05 21:05:31 +000094 * Enumerated definition of the message types that the Thrift protocol
95 * supports.
Marc Slemko16698852006-08-04 03:16:10 +000096 */
97enum TMessageType {
98 T_CALL = 1,
Mark Sleef9831082007-02-20 20:59:21 +000099 T_REPLY = 2,
David Reissdeda1412009-04-02 19:22:31 +0000100 T_EXCEPTION = 3,
101 T_ONEWAY = 4
Marc Slemko16698852006-08-04 03:16:10 +0000102};
103
104/**
Mark Sleee8540632006-05-30 09:24:40 +0000105 * Abstract class for a thrift protocol driver. These are all the methods that
106 * a protocol must implement. Essentially, there must be some way of reading
107 * and writing all the base types, plus a mechanism for writing out structs
Mark Slee5d06fea2007-03-05 22:18:18 +0000108 * with indexed fields.
109 *
110 * TProtocol objects should not be shared across multiple encoding contexts,
111 * as they may need to maintain internal state in some protocols (i.e. XML).
112 * Note that is is acceptable for the TProtocol module to do its own internal
113 * buffered reads/writes to the underlying TTransport where appropriate (i.e.
114 * when parsing an input XML stream, reading should be batched rather than
115 * looking ahead character by character for a close tag).
Mark Sleee8540632006-05-30 09:24:40 +0000116 *
Mark Sleee8540632006-05-30 09:24:40 +0000117 */
118class TProtocol {
119 public:
120 virtual ~TProtocol() {}
121
122 /**
Mark Slee8d7e1f62006-06-07 06:48:56 +0000123 * Writing functions.
Mark Sleee8540632006-05-30 09:24:40 +0000124 */
125
Mark Slee82a6c0f2007-04-04 21:08:21 +0000126 virtual uint32_t writeMessageBegin(const std::string& name,
127 const TMessageType messageType,
128 const int32_t seqid) = 0;
Marc Slemko16698852006-08-04 03:16:10 +0000129
Mark Slee4af6ed72006-10-25 19:02:49 +0000130 virtual uint32_t writeMessageEnd() = 0;
Marc Slemko16698852006-08-04 03:16:10 +0000131
132
David Reiss64120002008-04-29 23:12:24 +0000133 virtual uint32_t writeStructBegin(const char* name) = 0;
David Reiss0c90f6f2008-02-06 22:18:40 +0000134
Mark Slee4af6ed72006-10-25 19:02:49 +0000135 virtual uint32_t writeStructEnd() = 0;
David Reiss0c90f6f2008-02-06 22:18:40 +0000136
David Reiss64120002008-04-29 23:12:24 +0000137 virtual uint32_t writeFieldBegin(const char* name,
David Reiss96d23882007-07-26 21:10:32 +0000138 const TType fieldType,
139 const int16_t fieldId) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000140
Mark Slee4af6ed72006-10-25 19:02:49 +0000141 virtual uint32_t writeFieldEnd() = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000142
Mark Slee4af6ed72006-10-25 19:02:49 +0000143 virtual uint32_t writeFieldStop() = 0;
David Reiss0c90f6f2008-02-06 22:18:40 +0000144
Mark Slee4af6ed72006-10-25 19:02:49 +0000145 virtual uint32_t writeMapBegin(const TType keyType,
David Reiss96d23882007-07-26 21:10:32 +0000146 const TType valType,
147 const uint32_t size) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000148
Mark Slee4af6ed72006-10-25 19:02:49 +0000149 virtual uint32_t writeMapEnd() = 0;
David Reiss0c90f6f2008-02-06 22:18:40 +0000150
Mark Slee4af6ed72006-10-25 19:02:49 +0000151 virtual uint32_t writeListBegin(const TType elemType,
David Reiss96d23882007-07-26 21:10:32 +0000152 const uint32_t size) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000153
Mark Slee4af6ed72006-10-25 19:02:49 +0000154 virtual uint32_t writeListEnd() = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000155
Mark Slee4af6ed72006-10-25 19:02:49 +0000156 virtual uint32_t writeSetBegin(const TType elemType,
David Reiss96d23882007-07-26 21:10:32 +0000157 const uint32_t size) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000158
Mark Slee4af6ed72006-10-25 19:02:49 +0000159 virtual uint32_t writeSetEnd() = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000160
Mark Slee4af6ed72006-10-25 19:02:49 +0000161 virtual uint32_t writeBool(const bool value) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000162
Mark Slee4af6ed72006-10-25 19:02:49 +0000163 virtual uint32_t writeByte(const int8_t byte) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000164
Mark Slee4af6ed72006-10-25 19:02:49 +0000165 virtual uint32_t writeI16(const int16_t i16) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000166
Mark Slee4af6ed72006-10-25 19:02:49 +0000167 virtual uint32_t writeI32(const int32_t i32) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000168
Mark Slee4af6ed72006-10-25 19:02:49 +0000169 virtual uint32_t writeI64(const int64_t i64) = 0;
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000170
Mark Slee4af6ed72006-10-25 19:02:49 +0000171 virtual uint32_t writeDouble(const double dub) = 0;
Mark Sleec98d0502006-09-06 02:42:25 +0000172
Mark Slee4af6ed72006-10-25 19:02:49 +0000173 virtual uint32_t writeString(const std::string& str) = 0;
Mark Sleee8540632006-05-30 09:24:40 +0000174
David Reissc005b1b2008-02-15 01:38:18 +0000175 virtual uint32_t writeBinary(const std::string& str) = 0;
176
Mark Sleee8540632006-05-30 09:24:40 +0000177 /**
Mark Slee8d7e1f62006-06-07 06:48:56 +0000178 * Reading functions
Mark Sleee8540632006-05-30 09:24:40 +0000179 */
180
Mark Slee4af6ed72006-10-25 19:02:49 +0000181 virtual uint32_t readMessageBegin(std::string& name,
David Reiss96d23882007-07-26 21:10:32 +0000182 TMessageType& messageType,
183 int32_t& seqid) = 0;
David Reiss0c90f6f2008-02-06 22:18:40 +0000184
Mark Slee4af6ed72006-10-25 19:02:49 +0000185 virtual uint32_t readMessageEnd() = 0;
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000186
Mark Slee4af6ed72006-10-25 19:02:49 +0000187 virtual uint32_t readStructBegin(std::string& name) = 0;
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000188
Mark Slee4af6ed72006-10-25 19:02:49 +0000189 virtual uint32_t readStructEnd() = 0;
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000190
Mark Slee4af6ed72006-10-25 19:02:49 +0000191 virtual uint32_t readFieldBegin(std::string& name,
David Reiss96d23882007-07-26 21:10:32 +0000192 TType& fieldType,
193 int16_t& fieldId) = 0;
David Reiss0c90f6f2008-02-06 22:18:40 +0000194
Mark Slee4af6ed72006-10-25 19:02:49 +0000195 virtual uint32_t readFieldEnd() = 0;
David Reiss0c90f6f2008-02-06 22:18:40 +0000196
Mark Slee4af6ed72006-10-25 19:02:49 +0000197 virtual uint32_t readMapBegin(TType& keyType,
David Reiss96d23882007-07-26 21:10:32 +0000198 TType& valType,
199 uint32_t& size) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000200
Mark Slee4af6ed72006-10-25 19:02:49 +0000201 virtual uint32_t readMapEnd() = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000202
Mark Slee4af6ed72006-10-25 19:02:49 +0000203 virtual uint32_t readListBegin(TType& elemType,
David Reiss96d23882007-07-26 21:10:32 +0000204 uint32_t& size) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000205
Mark Slee4af6ed72006-10-25 19:02:49 +0000206 virtual uint32_t readListEnd() = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000207
Mark Slee4af6ed72006-10-25 19:02:49 +0000208 virtual uint32_t readSetBegin(TType& elemType,
David Reiss96d23882007-07-26 21:10:32 +0000209 uint32_t& size) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000210
Mark Slee4af6ed72006-10-25 19:02:49 +0000211 virtual uint32_t readSetEnd() = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000212
Mark Slee4af6ed72006-10-25 19:02:49 +0000213 virtual uint32_t readBool(bool& value) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000214
Mark Slee4af6ed72006-10-25 19:02:49 +0000215 virtual uint32_t readByte(int8_t& byte) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000216
Mark Slee4af6ed72006-10-25 19:02:49 +0000217 virtual uint32_t readI16(int16_t& i16) = 0;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000218
Mark Slee4af6ed72006-10-25 19:02:49 +0000219 virtual uint32_t readI32(int32_t& i32) = 0;
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000220
Mark Slee4af6ed72006-10-25 19:02:49 +0000221 virtual uint32_t readI64(int64_t& i64) = 0;
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000222
Mark Slee4af6ed72006-10-25 19:02:49 +0000223 virtual uint32_t readDouble(double& dub) = 0;
Mark Sleec98d0502006-09-06 02:42:25 +0000224
Mark Slee4af6ed72006-10-25 19:02:49 +0000225 virtual uint32_t readString(std::string& str) = 0;
Mark Sleee8540632006-05-30 09:24:40 +0000226
David Reissc005b1b2008-02-15 01:38:18 +0000227 virtual uint32_t readBinary(std::string& str) = 0;
228
David Reiss035aed92009-02-10 21:38:48 +0000229 uint32_t readBool(std::vector<bool>::reference ref) {
230 bool value;
231 uint32_t rv = readBool(value);
232 ref = value;
David Reiss57b50062009-02-25 00:59:55 +0000233 return rv;
David Reiss035aed92009-02-10 21:38:48 +0000234 }
235
Mark Sleee8540632006-05-30 09:24:40 +0000236 /**
Mark Slee8d7e1f62006-06-07 06:48:56 +0000237 * Method to arbitrarily skip over data.
Mark Sleee8540632006-05-30 09:24:40 +0000238 */
Mark Slee4af6ed72006-10-25 19:02:49 +0000239 uint32_t skip(TType type) {
Mark Slee8d7e1f62006-06-07 06:48:56 +0000240 switch (type) {
Mark Slee78f58e22006-09-02 04:17:07 +0000241 case T_BOOL:
242 {
243 bool boolv;
Mark Slee4af6ed72006-10-25 19:02:49 +0000244 return readBool(boolv);
Mark Slee78f58e22006-09-02 04:17:07 +0000245 }
Mark Slee8d7e1f62006-06-07 06:48:56 +0000246 case T_BYTE:
247 {
Mark Slee78f58e22006-09-02 04:17:07 +0000248 int8_t bytev;
Mark Slee4af6ed72006-10-25 19:02:49 +0000249 return readByte(bytev);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000250 }
Mark Sleecfc01932006-09-01 22:18:16 +0000251 case T_I16:
Mark Slee8d7e1f62006-06-07 06:48:56 +0000252 {
Mark Sleecfc01932006-09-01 22:18:16 +0000253 int16_t i16;
Mark Slee4af6ed72006-10-25 19:02:49 +0000254 return readI16(i16);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000255 }
256 case T_I32:
257 {
258 int32_t i32;
Mark Slee4af6ed72006-10-25 19:02:49 +0000259 return readI32(i32);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000260 }
Mark Slee8d7e1f62006-06-07 06:48:56 +0000261 case T_I64:
262 {
263 int64_t i64;
Mark Slee4af6ed72006-10-25 19:02:49 +0000264 return readI64(i64);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000265 }
Mark Sleec98d0502006-09-06 02:42:25 +0000266 case T_DOUBLE:
267 {
268 double dub;
Mark Slee4af6ed72006-10-25 19:02:49 +0000269 return readDouble(dub);
Mark Sleec98d0502006-09-06 02:42:25 +0000270 }
Mark Slee8d7e1f62006-06-07 06:48:56 +0000271 case T_STRING:
272 {
273 std::string str;
David Reissc005b1b2008-02-15 01:38:18 +0000274 return readBinary(str);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000275 }
276 case T_STRUCT:
277 {
278 uint32_t result = 0;
279 std::string name;
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000280 int16_t fid;
Mark Slee8d7e1f62006-06-07 06:48:56 +0000281 TType ftype;
Mark Slee4af6ed72006-10-25 19:02:49 +0000282 result += readStructBegin(name);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000283 while (true) {
Mark Slee4af6ed72006-10-25 19:02:49 +0000284 result += readFieldBegin(name, ftype, fid);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000285 if (ftype == T_STOP) {
286 break;
287 }
Mark Slee4af6ed72006-10-25 19:02:49 +0000288 result += skip(ftype);
289 result += readFieldEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +0000290 }
Mark Slee4af6ed72006-10-25 19:02:49 +0000291 result += readStructEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +0000292 return result;
293 }
294 case T_MAP:
295 {
296 uint32_t result = 0;
297 TType keyType;
298 TType valType;
Marc Slemkob09f5882006-08-23 22:03:34 +0000299 uint32_t i, size;
Mark Slee4af6ed72006-10-25 19:02:49 +0000300 result += readMapBegin(keyType, valType, size);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000301 for (i = 0; i < size; i++) {
Mark Slee4af6ed72006-10-25 19:02:49 +0000302 result += skip(keyType);
303 result += skip(valType);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000304 }
Mark Slee4af6ed72006-10-25 19:02:49 +0000305 result += readMapEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +0000306 return result;
307 }
308 case T_SET:
309 {
310 uint32_t result = 0;
311 TType elemType;
Marc Slemkob09f5882006-08-23 22:03:34 +0000312 uint32_t i, size;
Mark Slee4af6ed72006-10-25 19:02:49 +0000313 result += readSetBegin(elemType, size);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000314 for (i = 0; i < size; i++) {
Mark Slee4af6ed72006-10-25 19:02:49 +0000315 result += skip(elemType);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000316 }
Mark Slee4af6ed72006-10-25 19:02:49 +0000317 result += readSetEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +0000318 return result;
319 }
320 case T_LIST:
321 {
322 uint32_t result = 0;
323 TType elemType;
Marc Slemkob09f5882006-08-23 22:03:34 +0000324 uint32_t i, size;
Mark Slee4af6ed72006-10-25 19:02:49 +0000325 result += readListBegin(elemType, size);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000326 for (i = 0; i < size; i++) {
Mark Slee4af6ed72006-10-25 19:02:49 +0000327 result += skip(elemType);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000328 }
Mark Slee4af6ed72006-10-25 19:02:49 +0000329 result += readListEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +0000330 return result;
331 }
332 default:
333 return 0;
334 }
335 }
Mark Sleee8540632006-05-30 09:24:40 +0000336
Mark Slee5ea15f92007-03-05 22:55:59 +0000337 inline boost::shared_ptr<TTransport> getTransport() {
Mark Slee43b6c632007-02-07 00:54:17 +0000338 return ptrans_;
Mark Slee4af6ed72006-10-25 19:02:49 +0000339 }
340
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000341 // TODO: remove these two calls, they are for backwards
342 // compatibility
Mark Slee5ea15f92007-03-05 22:55:59 +0000343 inline boost::shared_ptr<TTransport> getInputTransport() {
Mark Slee43b6c632007-02-07 00:54:17 +0000344 return ptrans_;
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000345 }
Mark Slee5ea15f92007-03-05 22:55:59 +0000346 inline boost::shared_ptr<TTransport> getOutputTransport() {
Mark Slee43b6c632007-02-07 00:54:17 +0000347 return ptrans_;
Mark Slee4af6ed72006-10-25 19:02:49 +0000348 }
349
Mark Sleee8540632006-05-30 09:24:40 +0000350 protected:
Mark Slee5ea15f92007-03-05 22:55:59 +0000351 TProtocol(boost::shared_ptr<TTransport> ptrans):
Mark Slee43b6c632007-02-07 00:54:17 +0000352 ptrans_(ptrans) {
353 trans_ = ptrans.get();
354 }
David Reiss0c90f6f2008-02-06 22:18:40 +0000355
Mark Slee5ea15f92007-03-05 22:55:59 +0000356 boost::shared_ptr<TTransport> ptrans_;
Mark Slee43b6c632007-02-07 00:54:17 +0000357 TTransport* trans_;
Mark Slee4af6ed72006-10-25 19:02:49 +0000358
359 private:
Mark Sleee8540632006-05-30 09:24:40 +0000360 TProtocol() {}
361};
362
Mark Slee4af6ed72006-10-25 19:02:49 +0000363/**
364 * Constructs input and output protocol objects given transports.
365 */
366class TProtocolFactory {
367 public:
368 TProtocolFactory() {}
369
370 virtual ~TProtocolFactory() {}
371
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000372 virtual boost::shared_ptr<TProtocol> getProtocol(boost::shared_ptr<TTransport> trans) = 0;
Mark Slee4af6ed72006-10-25 19:02:49 +0000373};
374
T Jake Lucianib5e62212009-01-31 22:36:20 +0000375}}} // apache::thrift::protocol
Marc Slemko6f038a72006-08-03 18:58:09 +0000376
Mark Sleef5f2be42006-09-05 21:05:31 +0000377#endif // #define _THRIFT_PROTOCOL_TPROTOCOL_H_ 1