00001 #ifndef _AMQMethodBody_
00002 #define _AMQMethodBody_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <iostream>
00025 #include "amqp_types.h"
00026 #include "AMQBody.h"
00027 #include "Buffer.h"
00028 #include "qpid/framing/AMQP_ServerOperations.h"
00029 #include "MethodContext.h"
00030
00031 namespace qpid {
00032 namespace framing {
00033
00034 class AMQP_MethodVersionMap;
00035
00036 class AMQMethodBody : public AMQBody
00037 {
00038 public:
00039 typedef boost::shared_ptr<AMQMethodBody> shared_ptr;
00040
00041 static shared_ptr create(
00042 AMQP_MethodVersionMap& map, ProtocolVersion version, Buffer& buf);
00043
00044 ProtocolVersion version;
00045 uint8_t type() const { return METHOD_BODY; }
00046 AMQMethodBody(uint8_t major, uint8_t minor) : version(major, minor) {}
00047 AMQMethodBody(ProtocolVersion ver) : version(ver) {}
00048 virtual ~AMQMethodBody() {}
00049 void decode(Buffer&, uint32_t);
00050
00051 virtual MethodId amqpMethodId() const = 0;
00052 virtual ClassId amqpClassId() const = 0;
00053
00054 virtual void invoke(AMQP_ServerOperations&, const MethodContext&);
00055
00056 template <class T> bool isA() {
00057 return amqpClassId()==T::CLASS_ID && amqpMethodId()==T::METHOD_ID;
00058 }
00059
00061 virtual RequestId getRequestId() const { return 0; }
00062
00063 virtual bool isRequest() const { return false; }
00064 virtual bool isResponse() const { return false; }
00065
00066 protected:
00067 static uint32_t baseSize() { return 4; }
00068
00069 struct ClassMethodId {
00070 uint16_t classId;
00071 uint16_t methodId;
00072 void decode(Buffer& b);
00073 };
00074
00075 void encodeId(Buffer& buffer) const;
00076 virtual void encodeContent(Buffer& buffer) const = 0;
00077 virtual void decodeContent(Buffer& buffer) = 0;
00078 };
00079
00080
00081 }}
00082
00083
00084 #endif