00001 #ifndef QPID_FRAMING_AMQHEADERBODY_H
00002 #define QPID_FRAMING_AMQHEADERBODY_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "amqp_types.h"
00025 #include "AMQBody.h"
00026 #include "Buffer.h"
00027 #include "qpid/framing/DeliveryProperties.h"
00028 #include "qpid/framing/MessageProperties.h"
00029 #include <iostream>
00030
00031 #include <boost/optional.hpp>
00032
00033
00034 namespace qpid {
00035 namespace framing {
00036
00037 enum DeliveryMode { TRANSIENT = 1, PERSISTENT = 2};
00038
00039 class AMQHeaderBody : public AMQBody
00040 {
00041 template <class T> struct OptProps { boost::optional<T> props; };
00042 template <class Base, class T>
00043 struct PropSet : public Base, public OptProps<T> {
00044 uint32_t size() const {
00045 const boost::optional<T>& p=this->OptProps<T>::props;
00046 return (p ? p->size() : 0) + Base::size();
00047 }
00048 void encode(Buffer& buffer) const {
00049 const boost::optional<T>& p=this->OptProps<T>::props;
00050 if (p) p->encode(buffer);
00051 Base::encode(buffer);
00052 }
00053 bool decode(Buffer& buffer, uint32_t size, uint16_t type) {
00054 boost::optional<T>& p=this->OptProps<T>::props;
00055 if (type == T::TYPE) {
00056 p=T();
00057 p->decodeStructBody(buffer, size);
00058 return true;
00059 }
00060 else
00061 return Base::decode(buffer, size, type);
00062 }
00063 void print(std::ostream& out) const {
00064 const boost::optional<T>& p=this->OptProps<T>::props;
00065 if (p) out << *p;
00066 Base::print(out);
00067 }
00068 };
00069
00070 struct Empty {
00071 uint32_t size() const { return 0; }
00072 void encode(Buffer&) const {};
00073 bool decode(Buffer&, uint32_t, uint16_t) const { return false; };
00074 void print(std::ostream&) const {}
00075 };
00076
00077
00078 typedef PropSet<PropSet<Empty, DeliveryProperties>, MessageProperties> Properties;
00079
00080 Properties properties;
00081
00082 public:
00083
00084 inline uint8_t type() const { return HEADER_BODY; }
00085
00086 uint32_t size() const;
00087 void encode(Buffer& buffer) const;
00088 void decode(Buffer& buffer, uint32_t size);
00089 uint64_t getContentLength() const;
00090 void print(std::ostream& out) const;
00091 void accept(AMQBodyConstVisitor&) const;
00092
00093 template <class T> T* get(bool create) {
00094 boost::optional<T>& p=properties.OptProps<T>::props;
00095 if (create && !p) p=T();
00096 return p.get_ptr();
00097 }
00098
00099 template <class T> const T* get() const {
00100 return properties.OptProps<T>::props.get_ptr();
00101 }
00102 };
00103
00104 }}
00105
00106
00107
00108 #endif