00001 #ifndef _AMQFrame_
00002 #define _AMQFrame_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <boost/cast.hpp>
00025
00026 #include "amqp_types.h"
00027 #include "AMQBody.h"
00028 #include "AMQDataBlock.h"
00029 #include "AMQMethodBody.h"
00030 #include "AMQHeaderBody.h"
00031 #include "AMQContentBody.h"
00032 #include "AMQHeartbeatBody.h"
00033 #include "qpid/framing/AMQP_MethodVersionMap.h"
00034 #include "qpid/framing/AMQP_HighestVersion.h"
00035 #include "Buffer.h"
00036
00037 namespace qpid {
00038 namespace framing {
00039
00040
00041 class AMQFrame : public AMQDataBlock
00042 {
00043 public:
00044 AMQFrame(ProtocolVersion _version = highestProtocolVersion);
00045 AMQFrame(ProtocolVersion _version, uint16_t channel, AMQBody* body);
00046 AMQFrame(ProtocolVersion _version, uint16_t channel, const AMQBody::shared_ptr& body);
00047 virtual ~AMQFrame();
00048 virtual void encode(Buffer& buffer);
00049 virtual bool decode(Buffer& buffer);
00050 virtual uint32_t size() const;
00051 uint16_t getChannel();
00052 AMQBody::shared_ptr getBody();
00053
00055 template <class T> boost::shared_ptr<T> castBody() {
00056 assert(dynamic_cast<T*>(getBody().get()));
00057 boost::static_pointer_cast<T>(getBody());
00058 }
00059
00060 uint32_t decodeHead(Buffer& buffer);
00061 void decodeBody(Buffer& buffer, uint32_t size);
00062
00063 private:
00064 static AMQP_MethodVersionMap versionMap;
00065 ProtocolVersion version;
00066
00067 uint16_t channel;
00068 uint8_t type;
00069 AMQBody::shared_ptr body;
00070
00071
00072 friend std::ostream& operator<<(std::ostream& out, const AMQFrame& body);
00073 };
00074
00075 }}
00076
00077
00078 #endif