diff options
| author | Alan Conway <aconway@apache.org> | 2007-08-29 23:27:40 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2007-08-29 23:27:40 +0000 |
| commit | e183227707d150b1f42e750df0e90cd7dac8744e (patch) | |
| tree | a9156083c1890852c2d4013d4a856f9f28762946 /cpp/src/qpid/framing | |
| parent | 7422e57391a89bc2493cba18ca2ef0a84fec7baa (diff) | |
| download | qpid-python-e183227707d150b1f42e750df0e90cd7dac8744e.tar.gz | |
* 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
Diffstat (limited to 'cpp/src/qpid/framing')
| -rw-r--r-- | cpp/src/qpid/framing/ChannelAdapter.cpp | 20 | ||||
| -rw-r--r-- | cpp/src/qpid/framing/ChannelAdapter.h | 14 | ||||
| -rw-r--r-- | cpp/src/qpid/framing/Handler.h | 91 | ||||
| -rw-r--r-- | cpp/src/qpid/framing/InputHandler.h | 18 | ||||
| -rw-r--r-- | cpp/src/qpid/framing/OutputHandler.h | 18 |
5 files changed, 98 insertions, 63 deletions
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 <class T> struct Handler { - typedef T ParamType; - typedef shared_ptr<Handler> Chain; +/** Generic handler that can be linked into chains. */ +template <class T> +struct Handler { + typedef T HandledType; + + Handler(Handler<T>* 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<T>* next; + + /** A Chain is a handler that forwards to a modifiable + * linked list of handlers. + */ + struct Chain : public Handler<T> { + Chain(Handler<T>* first) : Handler(first) {} + void operator=(Handler<T>* 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<T>* in_=0, Handler<T>* out_=0) : in(in_), out(out_) {} + void reset(Handler<T>* in_=0, Handler<T>* 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>(f) will copy f. + * Functor<F&>(f) will only take a reference to x. + */ + template <class F> class Functor : public Handler<T> { + public: + Functor(F f, Handler<T>* next=0) : Handler<T>(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<X, X::f> will copy x. + * MemFun<X&, X::f> will only take a reference to x. + */ + template <class X, void(*M)(T)> + class MemFun : public Handler<T> { + public: + MemFun(X x, Handler<T>* 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<T>::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<InOutHandler, &InOutHandler::handleIn> in; + MemFun<InOutHandler, &InOutHandler::handleOut> 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<FrameHandler> 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<FrameHandler> 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); } }; |
