1 /*
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  */
19 
20 #ifndef _THRIFT_PROTOCOL_TVIRTUALPROTOCOL_H_
21 #define _THRIFT_PROTOCOL_TVIRTUALPROTOCOL_H_ 1
22 
23 #include <thrift/protocol/TProtocol.h>
24 
25 namespace apache {
26 namespace thrift {
27 namespace protocol {
28 
29 using apache::thrift::transport::TTransport;
30 
31 /**
32  * Helper class that provides default implementations of TProtocol methods.
33  *
34  * This class provides default implementations of the non-virtual TProtocol
35  * methods.  It exists primarily so TVirtualProtocol can derive from it.  It
36  * prevents TVirtualProtocol methods from causing infinite recursion if the
37  * non-virtual methods are not overridden by the TVirtualProtocol subclass.
38  *
39  * You probably don't want to use this class directly.  Use TVirtualProtocol
40  * instead.
41  */
42 class TProtocolDefaults : public TProtocol {
43 public:
readMessageBegin(std::string & name,TMessageType & messageType,int32_t & seqid)44   uint32_t readMessageBegin(std::string& name, TMessageType& messageType, int32_t& seqid) {
45     (void)name;
46     (void)messageType;
47     (void)seqid;
48     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
49                              "this protocol does not support reading (yet).");
50   }
51 
readMessageEnd()52   uint32_t readMessageEnd() {
53     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
54                              "this protocol does not support reading (yet).");
55   }
56 
readStructBegin(std::string & name)57   uint32_t readStructBegin(std::string& name) {
58     (void)name;
59     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
60                              "this protocol does not support reading (yet).");
61   }
62 
readStructEnd()63   uint32_t readStructEnd() {
64     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
65                              "this protocol does not support reading (yet).");
66   }
67 
readFieldBegin(std::string & name,TType & fieldType,int16_t & fieldId)68   uint32_t readFieldBegin(std::string& name, TType& fieldType, int16_t& fieldId) {
69     (void)name;
70     (void)fieldType;
71     (void)fieldId;
72     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
73                              "this protocol does not support reading (yet).");
74   }
75 
readFieldEnd()76   uint32_t readFieldEnd() {
77     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
78                              "this protocol does not support reading (yet).");
79   }
80 
readMapBegin(TType & keyType,TType & valType,uint32_t & size)81   uint32_t readMapBegin(TType& keyType, TType& valType, uint32_t& size) {
82     (void)keyType;
83     (void)valType;
84     (void)size;
85     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
86                              "this protocol does not support reading (yet).");
87   }
88 
readMapEnd()89   uint32_t readMapEnd() {
90     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
91                              "this protocol does not support reading (yet).");
92   }
93 
readListBegin(TType & elemType,uint32_t & size)94   uint32_t readListBegin(TType& elemType, uint32_t& size) {
95     (void)elemType;
96     (void)size;
97     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
98                              "this protocol does not support reading (yet).");
99   }
100 
readListEnd()101   uint32_t readListEnd() {
102     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
103                              "this protocol does not support reading (yet).");
104   }
105 
readSetBegin(TType & elemType,uint32_t & size)106   uint32_t readSetBegin(TType& elemType, uint32_t& size) {
107     (void)elemType;
108     (void)size;
109     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
110                              "this protocol does not support reading (yet).");
111   }
112 
readSetEnd()113   uint32_t readSetEnd() {
114     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
115                              "this protocol does not support reading (yet).");
116   }
117 
readBool(bool & value)118   uint32_t readBool(bool& value) {
119     (void)value;
120     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
121                              "this protocol does not support reading (yet).");
122   }
123 
readBool(std::vector<bool>::reference value)124   uint32_t readBool(std::vector<bool>::reference value) {
125     (void)value;
126     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
127                              "this protocol does not support reading (yet).");
128   }
129 
readByte(int8_t & byte)130   uint32_t readByte(int8_t& byte) {
131     (void)byte;
132     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
133                              "this protocol does not support reading (yet).");
134   }
135 
readI16(int16_t & i16)136   uint32_t readI16(int16_t& i16) {
137     (void)i16;
138     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
139                              "this protocol does not support reading (yet).");
140   }
141 
readI32(int32_t & i32)142   uint32_t readI32(int32_t& i32) {
143     (void)i32;
144     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
145                              "this protocol does not support reading (yet).");
146   }
147 
readI64(int64_t & i64)148   uint32_t readI64(int64_t& i64) {
149     (void)i64;
150     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
151                              "this protocol does not support reading (yet).");
152   }
153 
readDouble(double & dub)154   uint32_t readDouble(double& dub) {
155     (void)dub;
156     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
157                              "this protocol does not support reading (yet).");
158   }
159 
readString(std::string & str)160   uint32_t readString(std::string& str) {
161     (void)str;
162     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
163                              "this protocol does not support reading (yet).");
164   }
165 
readBinary(std::string & str)166   uint32_t readBinary(std::string& str) {
167     (void)str;
168     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
169                              "this protocol does not support reading (yet).");
170   }
171 
writeMessageBegin(const std::string & name,const TMessageType messageType,const int32_t seqid)172   uint32_t writeMessageBegin(const std::string& name,
173                              const TMessageType messageType,
174                              const int32_t seqid) {
175     (void)name;
176     (void)messageType;
177     (void)seqid;
178     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
179                              "this protocol does not support writing (yet).");
180   }
181 
writeMessageEnd()182   uint32_t writeMessageEnd() {
183     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
184                              "this protocol does not support writing (yet).");
185   }
186 
writeStructBegin(const char * name)187   uint32_t writeStructBegin(const char* name) {
188     (void)name;
189     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
190                              "this protocol does not support writing (yet).");
191   }
192 
writeStructEnd()193   uint32_t writeStructEnd() {
194     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
195                              "this protocol does not support writing (yet).");
196   }
197 
writeFieldBegin(const char * name,const TType fieldType,const int16_t fieldId)198   uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId) {
199     (void)name;
200     (void)fieldType;
201     (void)fieldId;
202     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
203                              "this protocol does not support writing (yet).");
204   }
205 
writeFieldEnd()206   uint32_t writeFieldEnd() {
207     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
208                              "this protocol does not support writing (yet).");
209   }
210 
writeFieldStop()211   uint32_t writeFieldStop() {
212     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
213                              "this protocol does not support writing (yet).");
214   }
215 
writeMapBegin(const TType keyType,const TType valType,const uint32_t size)216   uint32_t writeMapBegin(const TType keyType, const TType valType, const uint32_t size) {
217     (void)keyType;
218     (void)valType;
219     (void)size;
220     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
221                              "this protocol does not support writing (yet).");
222   }
223 
writeMapEnd()224   uint32_t writeMapEnd() {
225     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
226                              "this protocol does not support writing (yet).");
227   }
228 
writeListBegin(const TType elemType,const uint32_t size)229   uint32_t writeListBegin(const TType elemType, const uint32_t size) {
230     (void)elemType;
231     (void)size;
232     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
233                              "this protocol does not support writing (yet).");
234   }
235 
writeListEnd()236   uint32_t writeListEnd() {
237     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
238                              "this protocol does not support writing (yet).");
239   }
240 
writeSetBegin(const TType elemType,const uint32_t size)241   uint32_t writeSetBegin(const TType elemType, const uint32_t size) {
242     (void)elemType;
243     (void)size;
244     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
245                              "this protocol does not support writing (yet).");
246   }
247 
writeSetEnd()248   uint32_t writeSetEnd() {
249     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
250                              "this protocol does not support writing (yet).");
251   }
252 
writeBool(const bool value)253   uint32_t writeBool(const bool value) {
254     (void)value;
255     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
256                              "this protocol does not support writing (yet).");
257   }
258 
writeByte(const int8_t byte)259   uint32_t writeByte(const int8_t byte) {
260     (void)byte;
261     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
262                              "this protocol does not support writing (yet).");
263   }
264 
writeI16(const int16_t i16)265   uint32_t writeI16(const int16_t i16) {
266     (void)i16;
267     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
268                              "this protocol does not support writing (yet).");
269   }
270 
writeI32(const int32_t i32)271   uint32_t writeI32(const int32_t i32) {
272     (void)i32;
273     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
274                              "this protocol does not support writing (yet).");
275   }
276 
writeI64(const int64_t i64)277   uint32_t writeI64(const int64_t i64) {
278     (void)i64;
279     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
280                              "this protocol does not support writing (yet).");
281   }
282 
writeDouble(const double dub)283   uint32_t writeDouble(const double dub) {
284     (void)dub;
285     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
286                              "this protocol does not support writing (yet).");
287   }
288 
writeString(const std::string & str)289   uint32_t writeString(const std::string& str) {
290     (void)str;
291     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
292                              "this protocol does not support writing (yet).");
293   }
294 
writeBinary(const std::string & str)295   uint32_t writeBinary(const std::string& str) {
296     (void)str;
297     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
298                              "this protocol does not support writing (yet).");
299   }
300 
skip(TType type)301   uint32_t skip(TType type) { return ::apache::thrift::protocol::skip(*this, type); }
302 
303 protected:
TProtocolDefaults(std::shared_ptr<TTransport> ptrans)304   TProtocolDefaults(std::shared_ptr<TTransport> ptrans) : TProtocol(ptrans) {}
305 };
306 
307 /**
308  * Concrete TProtocol classes should inherit from TVirtualProtocol
309  * so they don't have to manually override virtual methods.
310  */
311 template <class Protocol_, class Super_ = TProtocolDefaults>
312 class TVirtualProtocol : public Super_ {
313 public:
314   /**
315    * Writing functions.
316    */
317 
writeMessageBegin_virt(const std::string & name,const TMessageType messageType,const int32_t seqid)318   uint32_t writeMessageBegin_virt(const std::string& name,
319                                           const TMessageType messageType,
320                                           const int32_t seqid) override {
321     return static_cast<Protocol_*>(this)->writeMessageBegin(name, messageType, seqid);
322   }
323 
writeMessageEnd_virt()324   uint32_t writeMessageEnd_virt() override {
325     return static_cast<Protocol_*>(this)->writeMessageEnd();
326   }
327 
writeStructBegin_virt(const char * name)328   uint32_t writeStructBegin_virt(const char* name) override {
329     return static_cast<Protocol_*>(this)->writeStructBegin(name);
330   }
331 
writeStructEnd_virt()332   uint32_t writeStructEnd_virt() override { return static_cast<Protocol_*>(this)->writeStructEnd(); }
333 
writeFieldBegin_virt(const char * name,const TType fieldType,const int16_t fieldId)334   uint32_t writeFieldBegin_virt(const char* name,
335                                         const TType fieldType,
336                                         const int16_t fieldId) override {
337     return static_cast<Protocol_*>(this)->writeFieldBegin(name, fieldType, fieldId);
338   }
339 
writeFieldEnd_virt()340   uint32_t writeFieldEnd_virt() override { return static_cast<Protocol_*>(this)->writeFieldEnd(); }
341 
writeFieldStop_virt()342   uint32_t writeFieldStop_virt() override { return static_cast<Protocol_*>(this)->writeFieldStop(); }
343 
writeMapBegin_virt(const TType keyType,const TType valType,const uint32_t size)344   uint32_t writeMapBegin_virt(const TType keyType,
345                                       const TType valType,
346                                       const uint32_t size) override {
347     return static_cast<Protocol_*>(this)->writeMapBegin(keyType, valType, size);
348   }
349 
writeMapEnd_virt()350   uint32_t writeMapEnd_virt() override { return static_cast<Protocol_*>(this)->writeMapEnd(); }
351 
writeListBegin_virt(const TType elemType,const uint32_t size)352   uint32_t writeListBegin_virt(const TType elemType, const uint32_t size) override {
353     return static_cast<Protocol_*>(this)->writeListBegin(elemType, size);
354   }
355 
writeListEnd_virt()356   uint32_t writeListEnd_virt() override { return static_cast<Protocol_*>(this)->writeListEnd(); }
357 
writeSetBegin_virt(const TType elemType,const uint32_t size)358   uint32_t writeSetBegin_virt(const TType elemType, const uint32_t size) override {
359     return static_cast<Protocol_*>(this)->writeSetBegin(elemType, size);
360   }
361 
writeSetEnd_virt()362   uint32_t writeSetEnd_virt() override { return static_cast<Protocol_*>(this)->writeSetEnd(); }
363 
writeBool_virt(const bool value)364   uint32_t writeBool_virt(const bool value) override {
365     return static_cast<Protocol_*>(this)->writeBool(value);
366   }
367 
writeByte_virt(const int8_t byte)368   uint32_t writeByte_virt(const int8_t byte) override {
369     return static_cast<Protocol_*>(this)->writeByte(byte);
370   }
371 
writeI16_virt(const int16_t i16)372   uint32_t writeI16_virt(const int16_t i16) override {
373     return static_cast<Protocol_*>(this)->writeI16(i16);
374   }
375 
writeI32_virt(const int32_t i32)376   uint32_t writeI32_virt(const int32_t i32) override {
377     return static_cast<Protocol_*>(this)->writeI32(i32);
378   }
379 
writeI64_virt(const int64_t i64)380   uint32_t writeI64_virt(const int64_t i64) override {
381     return static_cast<Protocol_*>(this)->writeI64(i64);
382   }
383 
writeDouble_virt(const double dub)384   uint32_t writeDouble_virt(const double dub) override {
385     return static_cast<Protocol_*>(this)->writeDouble(dub);
386   }
387 
writeString_virt(const std::string & str)388   uint32_t writeString_virt(const std::string& str) override {
389     return static_cast<Protocol_*>(this)->writeString(str);
390   }
391 
writeBinary_virt(const std::string & str)392   uint32_t writeBinary_virt(const std::string& str) override {
393     return static_cast<Protocol_*>(this)->writeBinary(str);
394   }
395 
396   /**
397    * Reading functions
398    */
399 
readMessageBegin_virt(std::string & name,TMessageType & messageType,int32_t & seqid)400   uint32_t readMessageBegin_virt(std::string& name,
401                                          TMessageType& messageType,
402                                          int32_t& seqid) override {
403     return static_cast<Protocol_*>(this)->readMessageBegin(name, messageType, seqid);
404   }
405 
readMessageEnd_virt()406   uint32_t readMessageEnd_virt() override { return static_cast<Protocol_*>(this)->readMessageEnd(); }
407 
readStructBegin_virt(std::string & name)408   uint32_t readStructBegin_virt(std::string& name) override {
409     return static_cast<Protocol_*>(this)->readStructBegin(name);
410   }
411 
readStructEnd_virt()412   uint32_t readStructEnd_virt() override { return static_cast<Protocol_*>(this)->readStructEnd(); }
413 
readFieldBegin_virt(std::string & name,TType & fieldType,int16_t & fieldId)414   uint32_t readFieldBegin_virt(std::string& name, TType& fieldType, int16_t& fieldId) override {
415     return static_cast<Protocol_*>(this)->readFieldBegin(name, fieldType, fieldId);
416   }
417 
readFieldEnd_virt()418   uint32_t readFieldEnd_virt() override { return static_cast<Protocol_*>(this)->readFieldEnd(); }
419 
readMapBegin_virt(TType & keyType,TType & valType,uint32_t & size)420   uint32_t readMapBegin_virt(TType& keyType, TType& valType, uint32_t& size) override {
421     return static_cast<Protocol_*>(this)->readMapBegin(keyType, valType, size);
422   }
423 
readMapEnd_virt()424   uint32_t readMapEnd_virt() override { return static_cast<Protocol_*>(this)->readMapEnd(); }
425 
readListBegin_virt(TType & elemType,uint32_t & size)426   uint32_t readListBegin_virt(TType& elemType, uint32_t& size) override {
427     return static_cast<Protocol_*>(this)->readListBegin(elemType, size);
428   }
429 
readListEnd_virt()430   uint32_t readListEnd_virt() override { return static_cast<Protocol_*>(this)->readListEnd(); }
431 
readSetBegin_virt(TType & elemType,uint32_t & size)432   uint32_t readSetBegin_virt(TType& elemType, uint32_t& size) override {
433     return static_cast<Protocol_*>(this)->readSetBegin(elemType, size);
434   }
435 
readSetEnd_virt()436   uint32_t readSetEnd_virt() override { return static_cast<Protocol_*>(this)->readSetEnd(); }
437 
readBool_virt(bool & value)438   uint32_t readBool_virt(bool& value) override {
439     return static_cast<Protocol_*>(this)->readBool(value);
440   }
441 
readBool_virt(std::vector<bool>::reference value)442   uint32_t readBool_virt(std::vector<bool>::reference value) override {
443     return static_cast<Protocol_*>(this)->readBool(value);
444   }
445 
readByte_virt(int8_t & byte)446   uint32_t readByte_virt(int8_t& byte) override {
447     return static_cast<Protocol_*>(this)->readByte(byte);
448   }
449 
readI16_virt(int16_t & i16)450   uint32_t readI16_virt(int16_t& i16) override {
451     return static_cast<Protocol_*>(this)->readI16(i16);
452   }
453 
readI32_virt(int32_t & i32)454   uint32_t readI32_virt(int32_t& i32) override {
455     return static_cast<Protocol_*>(this)->readI32(i32);
456   }
457 
readI64_virt(int64_t & i64)458   uint32_t readI64_virt(int64_t& i64) override {
459     return static_cast<Protocol_*>(this)->readI64(i64);
460   }
461 
readDouble_virt(double & dub)462   uint32_t readDouble_virt(double& dub) override {
463     return static_cast<Protocol_*>(this)->readDouble(dub);
464   }
465 
readString_virt(std::string & str)466   uint32_t readString_virt(std::string& str) override {
467     return static_cast<Protocol_*>(this)->readString(str);
468   }
469 
readBinary_virt(std::string & str)470   uint32_t readBinary_virt(std::string& str) override {
471     return static_cast<Protocol_*>(this)->readBinary(str);
472   }
473 
skip_virt(TType type)474   uint32_t skip_virt(TType type) override { return static_cast<Protocol_*>(this)->skip(type); }
475 
476   /*
477    * Provide a default skip() implementation that uses non-virtual read
478    * methods.
479    *
480    * Note: subclasses that use TVirtualProtocol to derive from another protocol
481    * implementation (i.e., not TProtocolDefaults) should beware that this may
482    * override any non-default skip() implementation provided by the parent
483    * transport class.  They may need to explicitly redefine skip() to call the
484    * correct parent implementation, if desired.
485    */
skip(TType type)486   uint32_t skip(TType type) {
487     auto* const prot = static_cast<Protocol_*>(this);
488     return ::apache::thrift::protocol::skip(*prot, type);
489   }
490 
491   /*
492    * Provide a default readBool() implementation for use with
493    * std::vector<bool>, that behaves the same as reading into a normal bool.
494    *
495    * Subclasses can override this if desired, but there normally shouldn't
496    * be a need to.
497    */
readBool(std::vector<bool>::reference value)498   uint32_t readBool(std::vector<bool>::reference value) {
499     bool b = false;
500     uint32_t ret = static_cast<Protocol_*>(this)->readBool(b);
501     value = b;
502     return ret;
503   }
504   using Super_::readBool; // so we don't hide readBool(bool&)
505 
506 protected:
TVirtualProtocol(std::shared_ptr<TTransport> ptrans)507   TVirtualProtocol(std::shared_ptr<TTransport> ptrans) : Super_(ptrans) {}
508 };
509 }
510 }
511 } // apache::thrift::protocol
512 
513 #endif // #define _THRIFT_PROTOCOL_TVIRTUALPROTOCOL_H_ 1
514