23 #ifndef _SANDESH_PROTOCOL_TPROTOCOL_H_
24 #define _SANDESH_PROTOCOL_TPROTOCOL_H_ 1
27 #include <sandesh/transport/TTransport.h>
29 #include <boost/shared_ptr.hpp>
30 #include <boost/static_assert.hpp>
31 #include <boost/uuid/uuid.hpp>
32 #include <boost/uuid/string_generator.hpp>
33 #include <boost/asio/ip/address.hpp>
35 namespace contrail {
namespace sandesh {
namespace protocol {
46 template <
typename To,
typename From>
48 BOOST_STATIC_ASSERT(
sizeof(From) ==
sizeof(To));
78 #ifdef HAVE_SYS_PARAM_H
79 #include <sys/param.h>
83 # if defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
84 # define __BYTE_ORDER BYTE_ORDER
85 # define __LITTLE_ENDIAN LITTLE_ENDIAN
86 # define __BIG_ENDIAN BIG_ENDIAN
88 # include <boost/config.hpp>
89 # include <boost/detail/endian.hpp>
90 # define __BYTE_ORDER BOOST_BYTE_ORDER
91 # ifdef BOOST_LITTLE_ENDIAN
92 # define __LITTLE_ENDIAN __BYTE_ORDER
93 # define __BIG_ENDIAN 0
95 # define __LITTLE_ENDIAN 0
96 # define __BIG_ENDIAN __BYTE_ORDER
101 #if __BYTE_ORDER == __BIG_ENDIAN
102 # define ntohll(n) (n)
103 # define htonll(n) (n)
104 # if defined(__GNUC__) && defined(__GLIBC__)
105 # include <byteswap.h>
106 # define htolell(n) bswap_64(n)
107 # define letohll(n) bswap_64(n)
109 # define bswap_64(n) \
110 ( (((n) & 0xff00000000000000ull) >> 56) \
111 | (((n) & 0x00ff000000000000ull) >> 40) \
112 | (((n) & 0x0000ff0000000000ull) >> 24) \
113 | (((n) & 0x000000ff00000000ull) >> 8) \
114 | (((n) & 0x00000000ff000000ull) << 8) \
115 | (((n) & 0x0000000000ff0000ull) << 24) \
116 | (((n) & 0x000000000000ff00ull) << 40) \
117 | (((n) & 0x00000000000000ffull) << 56) )
118 # define htolell(n) bswap_64(n)
119 # define letohll(n) bswap_64(n)
121 #elif __BYTE_ORDER == __LITTLE_ENDIAN
122 # define htolell(n) (n)
123 # define letohll(n) (n)
124 # if defined(__GNUC__) && defined(__GLIBC__)
125 # include <byteswap.h>
126 # define ntohll(n) bswap_64(n)
127 # define htonll(n) bswap_64(n)
129 # define ntohll(n) ( (((uint64_t)ntohl(n)) << 32) + ntohl(n >> 32) )
130 # define htonll(n) ( (((uint64_t)htonl(n)) << 32) + htonl(n >> 32) )
133 # error "Can't define htonll or ntohll!"
186 template <
class Protocol_>
192 return prot.readBool(boolv);
197 return prot.readByte(bytev);
202 return prot.readI16(i16);
207 return prot.readI32(i32);
212 return prot.readI64(i64);
217 return prot.readU16(u16);
222 return prot.readU32(u32);
227 return prot.readU64(u64);
232 return prot.readIPV4(ip4);
236 boost::asio::ip::address ipaddress;
237 return prot.readIPADDR(ipaddress);
242 return prot.readDouble(dub);
247 return prot.readBinary(str);
252 return prot.readXML(str);
257 return prot.readUUID(uuid);
266 if ((ret = prot.readStructBegin(name)) < 0) {
271 if ((ret = prot.readFieldBegin(name, ftype, fid)) < 0) {
278 if ((ret =
skip(prot, ftype)) < 0) {
282 if ((ret = prot.readFieldEnd()) < 0) {
287 if ((ret = prot.readStructEnd()) < 0) {
300 if ((ret = prot.readSandeshBegin(name)) < 0) {
305 if ((ret = prot.readFieldBegin(name, ftype, fid)) < 0) {
312 if ((ret =
skip(prot, ftype)) < 0) {
316 if ((ret = prot.readFieldEnd()) < 0) {
321 if ((ret = prot.readSandeshEnd()) < 0) {
334 if ((ret = prot.readMapBegin(keyType, valType, size)) < 0) {
338 for (i = 0; i < size; i++) {
339 if ((ret =
skip(prot, keyType)) < 0) {
343 if ((ret =
skip(prot, valType)) < 0) {
348 if ((ret = prot.readMapEnd()) < 0) {
360 if ((ret = prot.readSetBegin(elemType, size)) < 0) {
364 for (i = 0; i < size; i++) {
365 if ((ret =
skip(prot, elemType)) < 0) {
370 if ((ret = prot.readSetEnd()) < 0) {
382 if ((ret = prot.readListBegin(elemType, size)) < 0) {
386 for (i = 0; i < size; i++) {
387 if ((ret =
skip(prot, elemType)) < 0) {
392 if ((ret = prot.readListEnd()) < 0) {
428 const int32_t seqid) = 0;
446 const TType fieldType,
447 const int16_t fieldId,
448 const std::map<std::string, std::string> *
const amap) = 0;
456 const uint32_t size) = 0;
461 const uint32_t size) = 0;
466 const uint32_t size) = 0;
488 virtual int32_t
writeIPADDR_virt(
const boost::asio::ip::address& ipaddress) = 0;
502 const int32_t seqid) {
535 const TType fieldType,
536 const int16_t fieldId,
537 const std::map<std::string, std::string> *
const amap = NULL) {
551 const uint32_t size) {
659 int16_t& fieldId) = 0;
681 virtual int32_t
readBool_virt(std::vector<bool>::reference value) = 0;
699 virtual int32_t
readIPADDR_virt(boost::asio::ip::address& ipaddress) = 0;
844 int32_t
readBool(std::vector<bool>::reference value) {
882 virtual boost::shared_ptr<TProtocol>
getProtocol(boost::shared_ptr<TTransport> trans) = 0;
887 #endif // #define _SANDESH_PROTOCOL_TPROTOCOL_H_ 1
virtual boost::shared_ptr< TProtocol > getProtocol(boost::shared_ptr< TTransport > trans)=0
int32_t writeListBegin(const TType elemType, const uint32_t size)
int32_t writeString(const std::string &str)
int32_t readU16(uint16_t &u16)
virtual int32_t readBool_virt(bool &value)=0
int32_t writeMapBegin(const TType keyType, const TType valType, const uint32_t size)
int32_t readSandeshBegin(std::string &name)
virtual int32_t readByte_virt(int8_t &byte)=0
virtual int32_t readSandeshEnd_virt()=0
int32_t writeXML(const std::string &str)
virtual int32_t writeMessageEnd_virt()=0
int32_t readBool(std::vector< bool >::reference value)
int32_t writeContainerElementEnd()
int32_t writeBool(const bool value)
int32_t readI64(int64_t &i64)
virtual int32_t readMessageBegin_virt(std::string &name, TMessageType &messageType, int32_t &seqid)=0
int32_t writeContainerElementBegin()
int32_t writeIPV4(const uint32_t ip4)
int32_t writeSandeshEnd()
virtual int32_t readFieldBegin_virt(std::string &name, TType &fieldType, int16_t &fieldId)=0
virtual int32_t readUUID_virt(boost::uuids::uuid &uuid)=0
virtual int32_t writeIPV4_virt(const uint32_t ip4)=0
int32_t writeIPADDR(const boost::asio::ip::address &ipaddress)
virtual int32_t readI64_virt(int64_t &i64)=0
int32_t writeMessageBegin(const std::string &name, const TMessageType messageType, const int32_t seqid)
int32_t readUUID(boost::uuids::uuid &uuid)
virtual int32_t writeListEnd_virt()=0
int32_t writeU16(const uint16_t u16)
int32_t readContainerElementEnd()
virtual int32_t writeContainerElementEnd_virt()=0
virtual int32_t writeStructEnd_virt()=0
int32_t readMapBegin(TType &keyType, TType &valType, uint32_t &size)
virtual int32_t readU64_virt(uint64_t &u64)=0
int32_t writeBinary(const std::string &str)
int32_t writeUUID(const boost::uuids::uuid &uuid)
virtual int32_t readListBegin_virt(TType &elemType, uint32_t &size)=0
int32_t readDouble(double &dub)
virtual int32_t readU16_virt(uint16_t &u16)=0
virtual int32_t readI32_virt(int32_t &i32)=0
int32_t readIPADDR(boost::asio::ip::address &ipaddress)
int32_t readByte(int8_t &byte)
int32_t readSetBegin(TType &elemType, uint32_t &size)
int32_t writeMessageEnd()
int32_t readMessageBegin(std::string &name, TMessageType &messageType, int32_t &seqid)
int32_t writeU32(const uint32_t u32)
virtual int32_t writeMessageBegin_virt(const std::string &name, const TMessageType messageType, const int32_t seqid)=0
virtual int32_t readIPV4_virt(uint32_t &ip4)=0
virtual int32_t readFieldEnd_virt()=0
virtual int32_t readSetBegin_virt(TType &elemType, uint32_t &size)=0
int32_t writeDouble(const double dub)
int32_t readBinary(std::string &str)
virtual int32_t writeFieldEnd_virt()=0
virtual int32_t readContainerElementEnd_virt()=0
int32_t writeSandeshBegin(const char *name)
virtual int32_t writeI32_virt(const int32_t i32)=0
virtual int32_t readSetEnd_virt()=0
virtual int32_t writeByte_virt(const int8_t byte)=0
virtual int32_t readListEnd_virt()=0
virtual int32_t readU32_virt(uint32_t &u32)=0
virtual int32_t writeSandeshBegin_virt(const char *name)=0
virtual int32_t writeString_virt(const std::string &str)=0
virtual int32_t writeStructBegin_virt(const char *name)=0
int32_t readBool(bool &value)
virtual int32_t writeI64_virt(const int64_t i64)=0
static To bitwise_cast(From from)
virtual int32_t writeSandeshEnd_virt()=0
virtual ~TProtocolFactory()
int32_t writeStructBegin(const char *name)
int32_t writeI32(const int32_t i32)
virtual int32_t writeIPADDR_virt(const boost::asio::ip::address &ipaddress)=0
virtual int32_t writeSetBegin_virt(const TType elemType, const uint32_t size)=0
virtual int32_t writeFieldBegin_virt(const char *name, const TType fieldType, const int16_t fieldId, const std::map< std::string, std::string > *const amap)=0
int32_t readFieldBegin(std::string &name, TType &fieldType, int16_t &fieldId)
int32_t readIPV4(uint32_t &ip4)
virtual int32_t readStructBegin_virt(std::string &name)=0
virtual int32_t writeBinary_virt(const std::string &str)=0
virtual int32_t writeDouble_virt(const double dub)=0
virtual int32_t readMessageEnd_virt()=0
int32_t readXML(std::string &str)
int32_t readString(std::string &str)
int32_t writeSetBegin(const TType elemType, const uint32_t size)
virtual int32_t readXML_virt(std::string &str)=0
virtual int32_t writeUUID_virt(const boost::uuids::uuid &uuid)=0
virtual int32_t writeU16_virt(const uint16_t u16)=0
virtual int32_t readString_virt(std::string &str)=0
virtual int32_t writeSetEnd_virt()=0
virtual int32_t writeU64_virt(const uint64_t u64)=0
virtual int32_t readBinary_virt(std::string &str)=0
virtual int32_t writeListBegin_virt(const TType elemType, const uint32_t size)=0
TProtocol(boost::shared_ptr< TTransport > ptrans)
virtual int32_t readStructEnd_virt()=0
virtual int32_t readContainerElementBegin_virt()=0
int32_t readI16(int16_t &i16)
virtual int32_t skip_virt(TType type)
int32_t writeFieldBegin(const char *name, const TType fieldType, const int16_t fieldId, const std::map< std::string, std::string > *const amap=NULL)
virtual int32_t writeBool_virt(const bool value)=0
boost::shared_ptr< TTransport > getTransport()
int32_t writeU64(const uint64_t u64)
virtual int32_t readDouble_virt(double &dub)=0
virtual int32_t writeContainerElementBegin_virt()=0
virtual int32_t writeMapBegin_virt(const TType keyType, const TType valType, const uint32_t size)=0
virtual int32_t readSandeshBegin_virt(std::string &name)=0
virtual int32_t readIPADDR_virt(boost::asio::ip::address &ipaddress)=0
virtual int32_t readMapBegin_virt(TType &keyType, TType &valType, uint32_t &size)=0
virtual int32_t readMapEnd_virt()=0
virtual int32_t writeU32_virt(const uint32_t u32)=0
int32_t readListBegin(TType &elemType, uint32_t &size)
int32_t readI32(int32_t &i32)
int32_t writeI16(const int16_t i16)
int32_t writeI64(const int64_t i64)
int32_t readContainerElementBegin()
int32_t readStructBegin(std::string &name)
int32_t writeByte(const int8_t byte)
virtual int32_t writeXML_virt(const std::string &str)=0
int32_t readU32(uint32_t &u32)
int32_t readU64(uint64_t &u64)
virtual int32_t readI16_virt(int16_t &i16)=0
int32_t skip(Protocol_ &prot, TType type)
virtual int32_t writeI16_virt(const int16_t i16)=0
virtual int32_t writeMapEnd_virt()=0
virtual int32_t writeFieldStop_virt()=0
boost::shared_ptr< TTransport > ptrans_