| #ifndef _client_Connection_ |
| #define _client_Connection_ |
| |
| /* |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 <map> |
| #include <string> |
| #include <boost/shared_ptr.hpp> |
| |
| #include "amqp_types.h" |
| #include <QpidError.h> |
| #include <Connector.h> |
| #include <sys/ShutdownHandler.h> |
| #include <sys/TimeoutHandler.h> |
| |
| |
| #include "framing/amqp_types.h" |
| #include <framing/amqp_framing.h> |
| #include <ClientExchange.h> |
| #include <IncomingMessage.h> |
| #include <ClientMessage.h> |
| #include <MessageListener.h> |
| #include <ClientQueue.h> |
| #include <ResponseHandler.h> |
| #include <AMQP_HighestVersion.h> |
| #include "ClientChannel.h" |
| |
| namespace qpid { |
| |
| /** |
| * The client namespace contains all classes that make up a client |
| * implementation of the AMQP protocol. The key classes that form |
| * the basis of the client API to be used by applications are |
| * Connection and Channel. |
| */ |
| namespace client { |
| |
| class Channel; |
| |
| /** |
| * \internal provide access to selected private channel functions |
| * for the Connection without making it a friend of the entire channel. |
| */ |
| class ConnectionForChannel : |
| public framing::InputHandler, |
| public framing::OutputHandler, |
| public sys::TimeoutHandler, |
| public sys::ShutdownHandler |
| |
| { |
| private: |
| friend class Channel; |
| virtual void erase(framing::ChannelId) = 0; |
| }; |
| |
| |
| /** |
| * \defgroup clientapi Application API for an AMQP client |
| */ |
| |
| /** |
| * Represents a connection to an AMQP broker. All communication is |
| * initiated by establishing a connection, then opening one or |
| * more Channels over that connection. |
| * |
| * \ingroup clientapi |
| */ |
| class Connection : public ConnectionForChannel |
| { |
| typedef std::map<framing::ChannelId, Channel*> ChannelMap; |
| |
| framing::ChannelId channelIdCounter; |
| static const std::string OK; |
| |
| framing::ProtocolVersion version; |
| const uint32_t max_frame_size; |
| ChannelMap channels; |
| Connector defaultConnector; |
| Connector* connector; |
| framing::OutputHandler* out; |
| volatile bool isOpen; |
| Channel channel0; |
| bool debug; |
| |
| void erase(framing::ChannelId); |
| void channelException( |
| Channel&, framing::AMQMethodBody*, const QpidError&); |
| |
| // TODO aconway 2007-01-26: too many friendships, untagle these classes. |
| friend class Channel; |
| |
| public: |
| /** |
| * Creates a connection object, but does not open the |
| * connection. |
| * |
| * @param _version the version of the protocol to connect with |
| * |
| * @param debug turns on tracing for the connection |
| * (i.e. prints details of the frames sent and received to std |
| * out). Optional and defaults to false. |
| * |
| * @param max_frame_size the maximum frame size that the |
| * client will accept. Optional and defaults to 65536. |
| */ |
| Connection(bool debug = false, uint32_t max_frame_size = 65536, |
| framing::ProtocolVersion=framing::highestProtocolVersion); |
| ~Connection(); |
| |
| /** |
| * Opens a connection to a broker. |
| * |
| * @param host the host on which the broker is running |
| * |
| * @param port the port on the which the broker is listening |
| * |
| * @param uid the userid to connect with |
| * |
| * @param pwd the password to connect with (currently SASL |
| * PLAIN is the only authentication method supported so this |
| * is sent in clear text) |
| * |
| * @param virtualhost the AMQP virtual host to use (virtual |
| * hosts, where implemented(!), provide namespace partitioning |
| * within a single broker). |
| */ |
| void open(const std::string& host, int port = 5672, |
| const std::string& uid = "guest", |
| const std::string& pwd = "guest", |
| const std::string& virtualhost = "/"); |
| |
| /** |
| * Close the connection with optional error information for the peer. |
| * |
| * Any further use of this connection (without reopening it) will |
| * not succeed. |
| */ |
| void close(framing::ReplyCode=200, const std::string& msg=OK, |
| framing::ClassId = 0, framing::MethodId = 0); |
| |
| /** |
| * Associate a Channel with this connection and open it for use. |
| * |
| * In AMQP channels are like multi-plexed 'sessions' of work over |
| * a connection. Almost all the interaction with AMQP is done over |
| * a channel. |
| * |
| * @param connection the connection object to be associated with |
| * the channel. Call Channel::close() to close the channel. |
| */ |
| void openChannel(Channel&); |
| |
| |
| // TODO aconway 2007-01-26: can these be private? |
| void send(framing::AMQFrame*); |
| void received(framing::AMQFrame*); |
| void idleOut(); |
| void idleIn(); |
| void shutdown(); |
| |
| /**\internal used for testing */ |
| void setConnector(Connector& connector); |
| |
| /** |
| * @return the maximum frame size in use on this connection |
| */ |
| inline uint32_t getMaxFrameSize(){ return max_frame_size; } |
| |
| /** @return protocol version in use on this connection. */ |
| framing::ProtocolVersion getVersion() const { return version; } |
| }; |
| |
| }} // namespace qpid::client |
| |
| |
| #endif |