00001 #ifndef QPID_FRAMING_AMQCOMMANDCONTROLBODY_H
00002 #define QPID_FRAMING_AMQCOMMANDCONTROLBODY_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "qpid/amqp_0_10/helpers.h"
00026 #include "qpid/framing/AMQBody.h"
00027
00028 namespace qpid {
00029 namespace framing {
00030
00035 template <class T> class AMQCommandControlBody : public AMQBody, public T
00036 {
00037 public:
00038 virtual uint8_t type() const { return 100+T::SEGMENT_TYPE; }
00039
00040 virtual void encode(Buffer& buffer) const {
00041 Codec::encode(buffer.getIterator(), static_cast<const T&>(*this));
00042 }
00043 virtual void decode(Buffer& buffer, uint32_t=0) {
00044 Codec::decode(buffer.getIterator(), static_cast<T&>(*this));
00045 }
00046 virtual uint32_t size() const {
00047 Codec::size(buffer.getIterator(), static_cast<const T&>(*this));
00048 }
00049
00050 virtual void print(std::ostream& out) const {
00051 out << static_cast<const T&>(*this) << endl;
00052 }
00053 virtual void AMQBody::accept(AMQBodyConstVisitor&) const { assert(0); }
00054 };
00055
00056 class CommandBody : public AMQCommandControlBody<amqp_0_10::Command> {
00057 using Command::accept;
00058 virtual Command* getCommand() { return this; }
00059 virtual const Command* getCommand() const { return this; }
00060 };
00061
00062 class ControlBody : public AMQCommandControlBody<amqp_0_10::Control> {
00063 using Control::accept;
00064 virtual Control* getControl() { return this; }
00065 virtual const Control* getControl() const { return this; }
00066 };
00067
00068 }}
00069
00070 #endif