blob: b9bf0e94ef086abb1e8592119a1a035506efd755 [file] [log] [blame]
Mark Slee9f0c6512007-02-28 23:58:26 +00001// Copyright (c) 2006- Facebook
2// Distributed under the Thrift Software License
3//
4// See accompanying file LICENSE or visit the Thrift site at:
5// http://developers.facebook.com/thrift/
6
Mark Sleef5f2be42006-09-05 21:05:31 +00007#ifndef _THRIFT_PROTOCOL_TBINARYPROTOCOL_H_
8#define _THRIFT_PROTOCOL_TBINARYPROTOCOL_H_ 1
Mark Sleee8540632006-05-30 09:24:40 +00009
Marc Slemkod42a2c22006-08-10 03:30:18 +000010#include "TProtocol.h"
Marc Slemko16698852006-08-04 03:16:10 +000011
12#include <boost/shared_ptr.hpp>
Mark Sleee8540632006-05-30 09:24:40 +000013
Marc Slemko6f038a72006-08-03 18:58:09 +000014namespace facebook { namespace thrift { namespace protocol {
15
Marc Slemko16698852006-08-04 03:16:10 +000016using namespace boost;
17
Mark Sleee8540632006-05-30 09:24:40 +000018/**
19 * The default binary protocol for thrift. Writes all data in a very basic
20 * binary format, essentially just spitting out the raw bytes.
21 *
22 * @author Mark Slee <mcslee@facebook.com>
23 */
Mark Sleef9831082007-02-20 20:59:21 +000024class TBinaryProtocol : public TProtocol {
Marc Slemko0b4ffa92006-08-11 02:49:29 +000025 public:
Aditya Agarwal9abb0d62007-01-24 22:53:54 +000026 TBinaryProtocol(shared_ptr<TTransport> trans) :
Mark Sleef9831082007-02-20 20:59:21 +000027 TProtocol(trans),
28 string_limit_(0),
29 container_limit_(0),
30 string_buf_(NULL),
31 string_buf_size_(0) {}
Mark Slee4af6ed72006-10-25 19:02:49 +000032
Mark Sleef9831082007-02-20 20:59:21 +000033 TBinaryProtocol(shared_ptr<TTransport> trans,
34 int32_t string_limit,
35 int32_t container_limit) :
36 TProtocol(trans),
37 string_limit_(string_limit),
38 container_limit_(container_limit),
39 string_buf_(NULL),
40 string_buf_size_(0) {}
41
42 ~TBinaryProtocol() {
43 if (string_buf_ != NULL) {
44 free(string_buf_);
45 string_buf_size_ = 0;
46 }
47 }
48
49 void setStringSizeLimit(int32_t string_limit) {
50 string_limit_ = string_limit;
51 }
52
53 void setContainerSizeLimit(int32_t container_limit) {
54 container_limit_ = container_limit;
55 }
Mark Sleee8540632006-05-30 09:24:40 +000056
Mark Slee8d7e1f62006-06-07 06:48:56 +000057 /**
58 * Writing functions.
59 */
Mark Sleee8540632006-05-30 09:24:40 +000060
Mark Slee4af6ed72006-10-25 19:02:49 +000061 virtual uint32_t writeMessageBegin(const std::string name,
Marc Slemko16698852006-08-04 03:16:10 +000062 const TMessageType messageType,
Mark Slee4af6ed72006-10-25 19:02:49 +000063 const int32_t seqid);
Marc Slemko16698852006-08-04 03:16:10 +000064
Mark Slee4af6ed72006-10-25 19:02:49 +000065 virtual uint32_t writeMessageEnd();
Marc Slemko16698852006-08-04 03:16:10 +000066
67
Mark Slee4af6ed72006-10-25 19:02:49 +000068 uint32_t writeStructBegin(const std::string& name);
Mark Sleee8540632006-05-30 09:24:40 +000069
Mark Slee4af6ed72006-10-25 19:02:49 +000070 uint32_t writeStructEnd();
Mark Sleee8540632006-05-30 09:24:40 +000071
Mark Slee4af6ed72006-10-25 19:02:49 +000072 uint32_t writeFieldBegin(const std::string& name,
73 const TType fieldType,
74 const int16_t fieldId);
Mark Slee8d7e1f62006-06-07 06:48:56 +000075
Mark Slee4af6ed72006-10-25 19:02:49 +000076 uint32_t writeFieldEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +000077
Mark Slee4af6ed72006-10-25 19:02:49 +000078 uint32_t writeFieldStop();
Mark Slee8d7e1f62006-06-07 06:48:56 +000079
Mark Slee4af6ed72006-10-25 19:02:49 +000080 uint32_t writeMapBegin(const TType keyType,
81 const TType valType,
82 const uint32_t size);
Mark Slee8d7e1f62006-06-07 06:48:56 +000083
Mark Slee4af6ed72006-10-25 19:02:49 +000084 uint32_t writeMapEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +000085
Mark Slee4af6ed72006-10-25 19:02:49 +000086 uint32_t writeListBegin(const TType elemType,
87 const uint32_t size);
Mark Slee8d7e1f62006-06-07 06:48:56 +000088
Mark Slee4af6ed72006-10-25 19:02:49 +000089 uint32_t writeListEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +000090
Mark Slee4af6ed72006-10-25 19:02:49 +000091 uint32_t writeSetBegin(const TType elemType,
92 const uint32_t size);
Mark Slee8d7e1f62006-06-07 06:48:56 +000093
Mark Slee4af6ed72006-10-25 19:02:49 +000094 uint32_t writeSetEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +000095
Mark Slee4af6ed72006-10-25 19:02:49 +000096 uint32_t writeBool(const bool value);
Mark Slee8d7e1f62006-06-07 06:48:56 +000097
Mark Slee4af6ed72006-10-25 19:02:49 +000098 uint32_t writeByte(const int8_t byte);
Mark Slee8d7e1f62006-06-07 06:48:56 +000099
Mark Slee4af6ed72006-10-25 19:02:49 +0000100 uint32_t writeI16(const int16_t i16);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000101
Mark Slee4af6ed72006-10-25 19:02:49 +0000102 uint32_t writeI32(const int32_t i32);
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000103
Mark Slee4af6ed72006-10-25 19:02:49 +0000104 uint32_t writeI64(const int64_t i64);
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000105
Mark Slee4af6ed72006-10-25 19:02:49 +0000106 uint32_t writeDouble(const double dub);
Mark Sleec98d0502006-09-06 02:42:25 +0000107
108
Mark Slee4af6ed72006-10-25 19:02:49 +0000109 uint32_t writeString(const std::string& str);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000110
111 /**
112 * Reading functions
113 */
114
Marc Slemko16698852006-08-04 03:16:10 +0000115
Mark Slee4af6ed72006-10-25 19:02:49 +0000116 uint32_t readMessageBegin(std::string& name,
Marc Slemkoe6889de2006-08-12 00:32:53 +0000117 TMessageType& messageType,
Mark Slee4af6ed72006-10-25 19:02:49 +0000118 int32_t& seqid);
Marc Slemko16698852006-08-04 03:16:10 +0000119
Mark Slee4af6ed72006-10-25 19:02:49 +0000120 uint32_t readMessageEnd();
Marc Slemko16698852006-08-04 03:16:10 +0000121
Mark Slee4af6ed72006-10-25 19:02:49 +0000122 uint32_t readStructBegin(std::string& name);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000123
Mark Slee4af6ed72006-10-25 19:02:49 +0000124 uint32_t readStructEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +0000125
Mark Slee4af6ed72006-10-25 19:02:49 +0000126 uint32_t readFieldBegin(std::string& name,
127 TType& fieldType,
128 int16_t& fieldId);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000129
Mark Slee4af6ed72006-10-25 19:02:49 +0000130 uint32_t readFieldEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +0000131
Mark Slee4af6ed72006-10-25 19:02:49 +0000132 uint32_t readMapBegin(TType& keyType,
133 TType& valType,
134 uint32_t& size);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000135
Mark Slee4af6ed72006-10-25 19:02:49 +0000136 uint32_t readMapEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +0000137
Mark Slee4af6ed72006-10-25 19:02:49 +0000138 uint32_t readListBegin(TType& elemType,
139 uint32_t& size);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000140
Mark Slee4af6ed72006-10-25 19:02:49 +0000141 uint32_t readListEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +0000142
Mark Slee4af6ed72006-10-25 19:02:49 +0000143 uint32_t readSetBegin(TType& elemType,
144 uint32_t& size);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000145
Mark Slee4af6ed72006-10-25 19:02:49 +0000146 uint32_t readSetEnd();
Mark Slee8d7e1f62006-06-07 06:48:56 +0000147
Mark Slee4af6ed72006-10-25 19:02:49 +0000148 uint32_t readBool(bool& value);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000149
Mark Slee4af6ed72006-10-25 19:02:49 +0000150 uint32_t readByte(int8_t& byte);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000151
Mark Slee4af6ed72006-10-25 19:02:49 +0000152 uint32_t readI16(int16_t& i16);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000153
Mark Slee4af6ed72006-10-25 19:02:49 +0000154 uint32_t readI32(int32_t& i32);
Mark Slee8d7e1f62006-06-07 06:48:56 +0000155
Mark Slee4af6ed72006-10-25 19:02:49 +0000156 uint32_t readI64(int64_t& i64);
Marc Slemko0b4ffa92006-08-11 02:49:29 +0000157
Mark Slee4af6ed72006-10-25 19:02:49 +0000158 uint32_t readDouble(double& dub);
Mark Sleec98d0502006-09-06 02:42:25 +0000159
Mark Slee4af6ed72006-10-25 19:02:49 +0000160 uint32_t readString(std::string& str);
Mark Sleef9831082007-02-20 20:59:21 +0000161
162 private:
163 int32_t string_limit_;
164 int32_t container_limit_;
165
166 // Buffer for reading strings, save for the lifetime of the protocol to
167 // avoid memory churn allocating memory on every string read
168 uint8_t* string_buf_;
169 int32_t string_buf_size_;
170
Mark Slee4af6ed72006-10-25 19:02:49 +0000171};
172
173/**
174 * Constructs binary protocol handlers
175 */
176class TBinaryProtocolFactory : public TProtocolFactory {
177 public:
Mark Sleef9831082007-02-20 20:59:21 +0000178 TBinaryProtocolFactory() :
179 string_limit_(0),
180 container_limit_(0) {}
181
182 TBinaryProtocolFactory(int32_t string_limit, int32_t container_limit) :
183 string_limit_(string_limit),
184 container_limit_(container_limit) {}
Mark Slee4af6ed72006-10-25 19:02:49 +0000185
186 virtual ~TBinaryProtocolFactory() {}
187
Mark Sleef9831082007-02-20 20:59:21 +0000188 void setStringSizeLimit(int32_t string_limit) {
189 string_limit_ = string_limit;
Mark Slee4af6ed72006-10-25 19:02:49 +0000190 }
Mark Sleef9831082007-02-20 20:59:21 +0000191
192 void setContainerSizeLimit(int32_t container_limit) {
193 container_limit_ = container_limit;
194 }
195
196 boost::shared_ptr<TProtocol> getProtocol(boost::shared_ptr<TTransport> trans) {
197 return boost::shared_ptr<TProtocol>(new TBinaryProtocol(trans, string_limit_, container_limit_));
198 }
199
200 private:
201 int32_t string_limit_;
202 int32_t container_limit_;
203
Mark Sleee8540632006-05-30 09:24:40 +0000204};
205
Marc Slemko6f038a72006-08-03 18:58:09 +0000206}}} // facebook::thrift::protocol
207
Mark Sleef5f2be42006-09-05 21:05:31 +0000208#endif // #ifndef _THRIFT_PROTOCOL_TBINARYPROTOCOL_H_
209
Marc Slemko6f038a72006-08-03 18:58:09 +0000210