From e183227707d150b1f42e750df0e90cd7dac8744e Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Wed, 29 Aug 2007 23:27:40 +0000 Subject: * src/qpid/broker/Session.h, .cpp: Session holds all state of a session including handlers created for that session. Session is not directly associated with a channel. * src/qpid/broker/SessionAdapter.h, .cpp: SessionAdapter is bound to a channel managed by the Connection. It can be attached to and detatched from a Session. * src/qpid/broker/Connection.cpp, .h: Use SessionAdapter. * src/qpid/framing/Handler.h: Removed use of shared_ptr. Handlers belong either to a Session or a Connection and are destroyed with it. * src/qpid/framing/InputHandler.h, OutputHandler.h: Both now inherit from FrameHandler and can be used as FrameHandlers. Intermediate step to removing them entirely. * src/qpid/broker/ConnectionAdapter.h: * src/qpid/client/ConnectionHandler.h: * src/qpid/framing/ChannelAdapter.cpp, .h: Minor changes required by Handler changes. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@570982 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/framing/ChannelAdapter.cpp | 20 ++++---- cpp/src/qpid/framing/ChannelAdapter.h | 14 +++-- cpp/src/qpid/framing/Handler.h | 91 +++++++++++++++++++++++++++------ cpp/src/qpid/framing/InputHandler.h | 18 ++----- cpp/src/qpid/framing/OutputHandler.h | 18 ++----- 5 files changed, 98 insertions(+), 63 deletions(-) (limited to 'cpp/src/qpid/framing') diff --git a/cpp/src/qpid/framing/ChannelAdapter.cpp b/cpp/src/qpid/framing/ChannelAdapter.cpp index 86b60d896b..027679228a 100644 --- a/cpp/src/qpid/framing/ChannelAdapter.cpp +++ b/cpp/src/qpid/framing/ChannelAdapter.cpp @@ -31,28 +31,24 @@ using boost::format; namespace qpid { namespace framing { -/** Framehandler that feeds into the channel. */ -struct ChannelAdapter::ChannelAdapterHandler : public FrameHandler { - ChannelAdapterHandler(ChannelAdapter& channel_) : channel(channel_) {} - void handle(AMQFrame& frame) { channel.handleBody(frame.getBody()); } - ChannelAdapter& channel; -}; +ChannelAdapter::Handler::Handler(ChannelAdapter& c) : parent(c) {} +void ChannelAdapter::Handler::handle(AMQFrame& f) { parent.handleBody(f.getBody()); } -void ChannelAdapter::init(ChannelId i, OutputHandler& out, ProtocolVersion v) +ChannelAdapter::ChannelAdapter() : handler(*this), id(0) {} + +void ChannelAdapter::init(ChannelId i, OutputHandler& out, ProtocolVersion v) { assertChannelNotOpen(); id = i; version = v; - - handlers.in = make_shared_ptr(new ChannelAdapterHandler(*this)); - handlers.out= make_shared_ptr(new OutputHandlerFrameHandler(out)); + handlers.reset(&handler, &out); } void ChannelAdapter::send(const AMQBody& body) { assertChannelOpen(); AMQFrame frame(getId(), body); - handlers.out->handle(frame); + handlers.out(frame); } void ChannelAdapter::assertMethodOk(AMQMethodBody& method) const { @@ -73,4 +69,6 @@ void ChannelAdapter::assertChannelNotOpen() const { 504, format("Channel %d is already open.") % getId()); } +void ChannelAdapter::handle(AMQFrame& f) { handleBody(f.getBody()); } + }} // namespace qpid::framing diff --git a/cpp/src/qpid/framing/ChannelAdapter.h b/cpp/src/qpid/framing/ChannelAdapter.h index 729f5e7b47..82f7115001 100644 --- a/cpp/src/qpid/framing/ChannelAdapter.h +++ b/cpp/src/qpid/framing/ChannelAdapter.h @@ -55,7 +55,7 @@ class ChannelAdapter : protected BodyHandler { /** *@param output Processed frames are forwarded to this handler. */ - ChannelAdapter() : id(0) {} + ChannelAdapter(); virtual ~ChannelAdapter() {} /** Initialize the channel adapter. */ @@ -69,7 +69,8 @@ class ChannelAdapter : protected BodyHandler { virtual void send(const AMQBody& body); virtual bool isOpen() const = 0; - + + void handle(AMQFrame& f); protected: void assertMethodOk(AMQMethodBody& method) const; void assertChannelOpen() const; @@ -78,9 +79,12 @@ class ChannelAdapter : protected BodyHandler { virtual void handleMethod(AMQMethodBody*) = 0; private: - class ChannelAdapterHandler; - friend class ChannelAdapterHandler; - + struct Handler : public FrameHandler { + Handler(ChannelAdapter&); + void handle(AMQFrame&); + ChannelAdapter& parent; + }; + Handler handler; ChannelId id; ProtocolVersion version; FrameHandler::Chains handlers; diff --git a/cpp/src/qpid/framing/Handler.h b/cpp/src/qpid/framing/Handler.h index 2f09911325..be49570f9b 100644 --- a/cpp/src/qpid/framing/Handler.h +++ b/cpp/src/qpid/framing/Handler.h @@ -27,33 +27,90 @@ namespace qpid { namespace framing { -/** Interface for handler for values of type T. - * Handlers can be linked into chains via the next pointer. - */ -template struct Handler { - typedef T ParamType; - typedef shared_ptr Chain; +/** Generic handler that can be linked into chains. */ +template +struct Handler { + typedef T HandledType; + + Handler(Handler* next_=0) : next(next_) {} + virtual ~Handler() {} + virtual void handle(T) = 0; + + /** Allow functor syntax for calling handle */ + void operator()(T t) { handle(t); } + - /** Handler chains for incoming and outgoing traffic. */ + /** Pointer to next handler in a linked list. */ + Handler* next; + + /** A Chain is a handler that forwards to a modifiable + * linked list of handlers. + */ + struct Chain : public Handler { + Chain(Handler* first) : Handler(first) {} + void operator=(Handler* h) { next = h; } + void handle(T t) { (*next)(t); } + // TODO aconway 2007-08-29: chain modifier ops here. + }; + + /** In/out pair of handler chains. */ struct Chains { - Chains() {} - Chains(Chain i, Chain o) : in(i), out(o) {} - Chains(Handler* i, Handler* o) : in(i), out(o) {} + Chains(Handler* in_=0, Handler* out_=0) : in(in_), out(out_) {} + void reset(Handler* in_=0, Handler* out_=0) { in = in_; out = out_; } Chain in; Chain out; }; - Handler() {} - Handler(Chain next_) : next(next_) {} - virtual ~Handler() {} + /** Adapt any void(T) functor as a Handler. + * Functor(f) will copy f. + * Functor(f) will only take a reference to x. + */ + template class Functor : public Handler { + public: + Functor(F f, Handler* next=0) : Handler(next), functor(f) {} + void handle(T t) { functor(t); } + private: + F functor; + }; - virtual void handle(T) = 0; + /** Adapt a member function of X as a Handler. + * MemFun will copy x. + * MemFun will only take a reference to x. + */ + template + class MemFun : public Handler { + public: + MemFun(X x, Handler* next=0) : Handler(next), object(x) {} + void handle(T t) { object.*M(t); } + private: + X object; + }; + + /** Support for implementing an in-out handler pair as a single class. + * Public interface is Handler::Chains pair, but implementation + * overrides handleIn, handleOut functions in a single class. + */ + class InOutHandler { + public: + virtual ~InOutHandler() {} + + InOutHandler() : + in(*this, &InOutHandler::handleIn), + out(*this, &InOutHandler::handleOut) {} + + MemFun in; + MemFun out; + + protected: + virtual void handleIn(T) = 0; + virtual void handleOut(T) = 0; + private: + }; - /** Next handler. Public so chains can be modified by altering next. */ - Chain next; }; -}} +}} #endif /*!QPID_FRAMING_HANDLER_H*/ +// diff --git a/cpp/src/qpid/framing/InputHandler.h b/cpp/src/qpid/framing/InputHandler.h index 48a96803da..99e4e774e1 100644 --- a/cpp/src/qpid/framing/InputHandler.h +++ b/cpp/src/qpid/framing/InputHandler.h @@ -27,24 +27,12 @@ namespace qpid { namespace framing { -class InputHandler : private boost::noncopyable { +// FIXME aconway 2007-08-29: Eliminate, replace with FrameHandler. +class InputHandler : public FrameHandler { public: virtual ~InputHandler() {} virtual void received(AMQFrame&) = 0; -}; - -/** FrameHandler that delegates to an InputHandler */ -struct InputHandlerFrameHandler : public FrameHandler { - InputHandlerFrameHandler(InputHandler& in_) : in(in_) {} - void handle(ParamType frame) { in.received(frame); } - InputHandler& in; -}; - -/** InputHandler that delegates to a FrameHandler */ -struct FrameHandlerInputHandler : public InputHandler { - FrameHandlerInputHandler(shared_ptr h) : handler(h) {} - void received(AMQFrame& frame) { handler->handle(frame); } - FrameHandler::Chain handler; + void handle(AMQFrame& f) { received(f); } }; }} diff --git a/cpp/src/qpid/framing/OutputHandler.h b/cpp/src/qpid/framing/OutputHandler.h index 89917ac3df..925ff88b12 100644 --- a/cpp/src/qpid/framing/OutputHandler.h +++ b/cpp/src/qpid/framing/OutputHandler.h @@ -27,24 +27,12 @@ namespace qpid { namespace framing { -class OutputHandler : private boost::noncopyable { +// FIXME aconway 2007-08-29: Replace with FrameHandler. +class OutputHandler : public FrameHandler { public: virtual ~OutputHandler() {} virtual void send(AMQFrame&) = 0; -}; - -/** OutputHandler that delegates to a FrameHandler */ -struct FrameHandlerOutputHandler : public OutputHandler { - FrameHandlerOutputHandler(shared_ptr h) : handler(h) {} - void received(AMQFrame& frame) { handler->handle(frame); } - FrameHandler::Chain handler; -}; - -/** FrameHandler that delegates to an OutputHandler */ -struct OutputHandlerFrameHandler : public FrameHandler { - OutputHandlerFrameHandler(OutputHandler& out_) : out(out_) {} - void handle(ParamType frame) { out.send(frame); } - OutputHandler& out; + void handle(AMQFrame& f) { send(f); } }; -- cgit v1.2.1