#ifndef _broker_BrokerAdapter_h #define _broker_BrokerAdapter_h /* * * Copyright (c) 2006 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include "AMQP_ServerOperations.h" #include "HandlerImpl.h" #include "MessageHandlerImpl.h" #include "Exception.h" namespace qpid { namespace broker { class Channel; class Connection; class Broker; class ChannelHandler; class ConnectionHandler; class BasicHandler; class ExchangeHandler; class QueueHandler; class TxHandler; class MessageHandler; class AccessHandler; class FileHandler; class StreamHandler; class DtxHandler; class TunnelHandler; class MessageHandlerImpl; /** * Per-channel protocol adapter. * * A container for a collection of AMQP-class adapters that translate * AMQP method bodies into calls on the core Channel, Connection and * Broker objects. Each adapter class also provides a client proxy * to send methods to the peer. * */ class BrokerAdapter : public CoreRefs, public framing::AMQP_ServerOperations { public: BrokerAdapter(Channel& ch, Connection& c, Broker& b); framing::ProtocolVersion getVersion() const; ChannelHandler* getChannelHandler() { return &channelHandler; } ConnectionHandler* getConnectionHandler() { return &connectionHandler; } BasicHandler* getBasicHandler() { return &basicHandler; } ExchangeHandler* getExchangeHandler() { return &exchangeHandler; } QueueHandler* getQueueHandler() { return &queueHandler; } TxHandler* getTxHandler() { return &txHandler; } MessageHandler* getMessageHandler() { return &messageHandler; } AccessHandler* getAccessHandler() { throw ConnectionException(540, "Access class not implemented"); } FileHandler* getFileHandler() { throw ConnectionException(540, "File class not implemented"); } StreamHandler* getStreamHandler() { throw ConnectionException(540, "Stream class not implemented"); } DtxHandler* getDtxHandler() { throw ConnectionException(540, "Dtx class not implemented"); } TunnelHandler* getTunnelHandler() { throw ConnectionException(540, "Tunnel class not implemented"); } framing::AMQP_ClientProxy& getProxy() { return proxy; } private: class ConnectionHandlerImpl : public ConnectionHandler, public HandlerImpl { public: ConnectionHandlerImpl(BrokerAdapter& parent) : HandlerImplType(parent) {} void startOk(const framing::MethodContext& context, const qpid::framing::FieldTable& clientProperties, const std::string& mechanism, const std::string& response, const std::string& locale); void secureOk(const framing::MethodContext& context, const std::string& response); void tuneOk(const framing::MethodContext& context, uint16_t channelMax, uint32_t frameMax, uint16_t heartbeat); void open(const framing::MethodContext& context, const std::string& virtualHost, const std::string& capabilities, bool insist); void close(const framing::MethodContext& context, uint16_t replyCode, const std::string& replyText, uint16_t classId, uint16_t methodId); void closeOk(const framing::MethodContext& context); }; class ChannelHandlerImpl : public ChannelHandler, public HandlerImpl { public: ChannelHandlerImpl(BrokerAdapter& parent) : HandlerImplType(parent) {} void open(const framing::MethodContext& context, const std::string& outOfBand); void flow(const framing::MethodContext& context, bool active); void flowOk(const framing::MethodContext& context, bool active); void ok( const framing::MethodContext& context ); void ping( const framing::MethodContext& context ); void pong( const framing::MethodContext& context ); void resume( const framing::MethodContext& context, const std::string& channelId ); void close(const framing::MethodContext& context, uint16_t replyCode, const std::string& replyText, uint16_t classId, uint16_t methodId); void closeOk(const framing::MethodContext& context); }; class ExchangeHandlerImpl : public ExchangeHandler, public HandlerImpl { public: ExchangeHandlerImpl(BrokerAdapter& parent) : HandlerImplType(parent) {} void declare(const framing::MethodContext& context, uint16_t ticket, const std::string& exchange, const std::string& type, bool passive, bool durable, bool autoDelete, bool internal, bool nowait, const qpid::framing::FieldTable& arguments); void delete_(const framing::MethodContext& context, uint16_t ticket, const std::string& exchange, bool ifUnused, bool nowait); }; class QueueHandlerImpl : public QueueHandler, public HandlerImpl { public: QueueHandlerImpl(BrokerAdapter& parent) : HandlerImplType(parent) {} void declare(const framing::MethodContext& context, uint16_t ticket, const std::string& queue, bool passive, bool durable, bool exclusive, bool autoDelete, bool nowait, const qpid::framing::FieldTable& arguments); void bind(const framing::MethodContext& context, uint16_t ticket, const std::string& queue, const std::string& exchange, const std::string& routingKey, bool nowait, const qpid::framing::FieldTable& arguments); void unbind(const framing::MethodContext& context, uint16_t ticket, const std::string& queue, const std::string& exchange, const std::string& routingKey, const qpid::framing::FieldTable& arguments ); void purge(const framing::MethodContext& context, uint16_t ticket, const std::string& queue, bool nowait); void delete_(const framing::MethodContext& context, uint16_t ticket, const std::string& queue, bool ifUnused, bool ifEmpty, bool nowait); }; class BasicHandlerImpl : public BasicHandler, public HandlerImpl { public: BasicHandlerImpl(BrokerAdapter& parent) : HandlerImplType(parent) {} void qos(const framing::MethodContext& context, uint32_t prefetchSize, uint16_t prefetchCount, bool global); void consume( const framing::MethodContext& context, uint16_t ticket, const std::string& queue, const std::string& consumerTag, bool noLocal, bool noAck, bool exclusive, bool nowait, const qpid::framing::FieldTable& fields); void cancel(const framing::MethodContext& context, const std::string& consumerTag, bool nowait); void publish(const framing::MethodContext& context, uint16_t ticket, const std::string& exchange, const std::string& routingKey, bool mandatory, bool immediate); void get(const framing::MethodContext& context, uint16_t ticket, const std::string& queue, bool noAck); void ack(const framing::MethodContext& context, uint64_t deliveryTag, bool multiple); void reject(const framing::MethodContext& context, uint64_t deliveryTag, bool requeue); void recover(const framing::MethodContext& context, bool requeue); }; class TxHandlerImpl : public TxHandler, public HandlerImpl { public: TxHandlerImpl(BrokerAdapter& parent) : HandlerImplType(parent) {} void select(const framing::MethodContext& context); void commit(const framing::MethodContext& context); void rollback(const framing::MethodContext& context); }; Connection& connection; BasicHandlerImpl basicHandler; ChannelHandlerImpl channelHandler; ConnectionHandlerImpl connectionHandler; ExchangeHandlerImpl exchangeHandler; MessageHandlerImpl messageHandler; QueueHandlerImpl queueHandler; TxHandlerImpl txHandler; }; }} // namespace qpid::broker #endif /*!_broker_BrokerAdapter_h*/