blob: c7421a389cca48e1e2e848de1c0ab46a7c0154ad [file] [log] [blame]
David Reisse0e3d1b2008-04-08 05:06:45 +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
7#ifndef _THRIFT_PROTOCOL_TPROTOCOLTAP_H_
8#define _THRIFT_PROTOCOL_TPROTOCOLTAP_H_ 1
9
10#include <protocol/TOneWayProtocol.h>
11
T Jake Lucianib5e62212009-01-31 22:36:20 +000012namespace apache { namespace thrift { namespace protocol {
David Reisse0e3d1b2008-04-08 05:06:45 +000013
T Jake Lucianib5e62212009-01-31 22:36:20 +000014using apache::thrift::transport::TTransport;
David Reisse0e3d1b2008-04-08 05:06:45 +000015
16/**
17 * Puts a wiretap on a protocol object. Any reads to this class are passed
18 * through to an enclosed protocol object, but also mirrored as write to a
19 * second protocol object.
20 *
David Reisse0e3d1b2008-04-08 05:06:45 +000021 */
22class TProtocolTap : public TReadOnlyProtocol {
23 public:
24 TProtocolTap(boost::shared_ptr<TProtocol> source,
25 boost::shared_ptr<TProtocol> sink)
26 : TReadOnlyProtocol(source->getTransport(), "TProtocolTap")
27 , source_(source)
28 , sink_(sink)
29 {}
30
31 virtual uint32_t readMessageBegin(std::string& name,
32 TMessageType& messageType,
33 int32_t& seqid) {
34 uint32_t rv = source_->readMessageBegin(name, messageType, seqid);
35 sink_->writeMessageBegin(name, messageType, seqid);
36 return rv;
37 }
38
39 virtual uint32_t readMessageEnd() {
40 uint32_t rv = source_->readMessageEnd();
41 sink_->writeMessageEnd();
42 return rv;
43 }
44
45 virtual uint32_t readStructBegin(std::string& name) {
46 uint32_t rv = source_->readStructBegin(name);
David Reiss64120002008-04-29 23:12:24 +000047 sink_->writeStructBegin(name.c_str());
David Reisse0e3d1b2008-04-08 05:06:45 +000048 return rv;
49 }
50
51 virtual uint32_t readStructEnd() {
52 uint32_t rv = source_->readStructEnd();
53 sink_->writeStructEnd();
54 return rv;
55 }
56
57 virtual uint32_t readFieldBegin(std::string& name,
58 TType& fieldType,
59 int16_t& fieldId) {
60 uint32_t rv = source_->readFieldBegin(name, fieldType, fieldId);
61 if (fieldType == T_STOP) {
62 sink_->writeFieldStop();
63 } else {
David Reiss64120002008-04-29 23:12:24 +000064 sink_->writeFieldBegin(name.c_str(), fieldType, fieldId);
David Reisse0e3d1b2008-04-08 05:06:45 +000065 }
66 return rv;
67 }
68
69
70 virtual uint32_t readFieldEnd() {
71 uint32_t rv = source_->readFieldEnd();
72 sink_->writeFieldEnd();
73 return rv;
74 }
75
76 virtual uint32_t readMapBegin(TType& keyType,
77 TType& valType,
78 uint32_t& size) {
79 uint32_t rv = source_->readMapBegin(keyType, valType, size);
80 sink_->writeMapBegin(keyType, valType, size);
81 return rv;
82 }
83
84
85 virtual uint32_t readMapEnd() {
86 uint32_t rv = source_->readMapEnd();
87 sink_->writeMapEnd();
88 return rv;
89 }
90
91 virtual uint32_t readListBegin(TType& elemType,
92 uint32_t& size) {
93 uint32_t rv = source_->readListBegin(elemType, size);
94 sink_->writeListBegin(elemType, size);
95 return rv;
96 }
97
98
99 virtual uint32_t readListEnd() {
100 uint32_t rv = source_->readListEnd();
101 sink_->writeListEnd();
102 return rv;
103 }
104
105 virtual uint32_t readSetBegin(TType& elemType,
106 uint32_t& size) {
107 uint32_t rv = source_->readSetBegin(elemType, size);
108 sink_->writeSetBegin(elemType, size);
109 return rv;
110 }
111
112
113 virtual uint32_t readSetEnd() {
114 uint32_t rv = source_->readSetEnd();
115 sink_->writeSetEnd();
116 return rv;
117 }
118
119 virtual uint32_t readBool(bool& value) {
120 uint32_t rv = source_->readBool(value);
121 sink_->writeBool(value);
122 return rv;
123 }
124
125 virtual uint32_t readByte(int8_t& byte) {
126 uint32_t rv = source_->readByte(byte);
127 sink_->writeByte(byte);
128 return rv;
129 }
130
131 virtual uint32_t readI16(int16_t& i16) {
132 uint32_t rv = source_->readI16(i16);
133 sink_->writeI16(i16);
134 return rv;
135 }
136
137 virtual uint32_t readI32(int32_t& i32) {
138 uint32_t rv = source_->readI32(i32);
139 sink_->writeI32(i32);
140 return rv;
141 }
142
143 virtual uint32_t readI64(int64_t& i64) {
144 uint32_t rv = source_->readI64(i64);
145 sink_->writeI64(i64);
146 return rv;
147 }
148
149 virtual uint32_t readDouble(double& dub) {
150 uint32_t rv = source_->readDouble(dub);
151 sink_->writeDouble(dub);
152 return rv;
153 }
154
155 virtual uint32_t readString(std::string& str) {
156 uint32_t rv = source_->readString(str);
157 sink_->writeString(str);
158 return rv;
159 }
160
161 virtual uint32_t readBinary(std::string& str) {
162 uint32_t rv = source_->readBinary(str);
163 sink_->writeBinary(str);
164 return rv;
165 }
166
167 private:
168 boost::shared_ptr<TProtocol> source_;
169 boost::shared_ptr<TProtocol> sink_;
170};
171
T Jake Lucianib5e62212009-01-31 22:36:20 +0000172}}} // apache::thrift::protocol
David Reisse0e3d1b2008-04-08 05:06:45 +0000173
174#endif // #define _THRIFT_PROTOCOL_TPROTOCOLTAP_H_ 1