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