00001 #ifndef _ChannelAdapter_
00002 #define _ChannelAdapter_
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/shared_ptr.h"
00026 #include "BodyHandler.h"
00027 #include "Requester.h"
00028 #include "Responder.h"
00029 #include "Correlator.h"
00030 #include "amqp_types.h"
00031
00032 namespace qpid {
00033 namespace framing {
00034
00035 class MethodContext;
00036
00037
00038
00053 class ChannelAdapter : public BodyHandler {
00054 public:
00058 ChannelAdapter(ChannelId id_=0, OutputHandler* out_=0,
00059 ProtocolVersion ver=ProtocolVersion())
00060 : id(id_), out(out_), version(ver) {}
00061
00063 void init(ChannelId, OutputHandler&, ProtocolVersion);
00064
00065 ChannelId getId() const { return id; }
00066 ProtocolVersion getVersion() const { return version; }
00067
00075 RequestId send(shared_ptr<AMQBody> body,
00076 Correlator::Action action=Correlator::Action());
00077
00078
00080 RequestId send(AMQBody* body) { return send(AMQBody::shared_ptr(body)); }
00081
00082 void handleMethod(shared_ptr<AMQMethodBody>);
00083 void handleRequest(shared_ptr<AMQRequestBody>);
00084 void handleResponse(shared_ptr<AMQResponseBody>);
00085
00086 virtual bool isOpen() const = 0;
00087
00088 protected:
00089 void assertMethodOk(AMQMethodBody& method) const;
00090 void assertChannelOpen() const;
00091 void assertChannelNotOpen() const;
00092
00093 virtual void handleMethodInContext(
00094 shared_ptr<AMQMethodBody> method,
00095 const MethodContext& context) = 0;
00096
00097 RequestId getFirstAckRequest() { return requester.getFirstAckRequest(); }
00098 RequestId getLastAckRequest() { return requester.getLastAckRequest(); }
00099 RequestId getNextSendRequestId() { return requester.getNextId(); }
00100
00101 private:
00102 ChannelId id;
00103 OutputHandler* out;
00104 ProtocolVersion version;
00105 Requester requester;
00106 Responder responder;
00107 Correlator correlator;
00108 };
00109
00110 }}
00111
00112
00113 #endif