#ifndef _client_ClientQueue_h
#define _client_ClientQueue_h

/*
 *
 * 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 <string>

namespace qpid {
namespace client {

    /**
     * A 'handle' used to represent an AMQP queue in the Channel
     * methods. Creating an instance of this class does not cause the
     * queue to be created on the broker. Rather, an instance of this
     * class should be passed to Channel::declareQueue() to ensure
     * that the queue exists or is created.
     * 
     * Queues hold messages and allow clients to consume
     * (see Channel::consume()) or get (see Channel::get()) those messags. A
     * queue receives messages by being bound to one or more Exchange;
     * messages published to that exchange may then be routed to the
     * queue based on the details of the binding and the type of the
     * exchange (see Channel::bind()).
     * 
     * Queues are identified by a name. They can be exclusive (in which
     * case they can only be used in the context of the connection
     * over which they were declared, and are deleted when then
     * connection closes), or they can be shared. Shared queues can be
     * auto deleted when they have no consumers.
     * 
     * We use the term 'temporary queue' to refer to an exclusive
     * queue.
     * 
     * \ingroup clientapi
     */
    class Queue{
	std::string name;
        const bool autodelete;
        const bool exclusive;
        bool durable;

    public:

        /**
         * Creates an unnamed, non-durable, temporary queue. A name
         * will be assigned to this queue instance by a call to
         * Channel::declareQueue().
         */
	Queue();
        /**
         * Creates a shared, non-durable, queue with a given name,
         * that will not be autodeleted.
         * 
         * @param name the name of the queue
         */
	Queue(std::string name);
        /**
         * Creates a non-durable queue with a given name.
         * 
         * @param name the name of the queue
         * 
         * @param temp if true the queue will be a temporary queue, if
         * false it will be shared and not autodeleted.
         */
	Queue(std::string name, bool temp);
        /**
         * This constructor allows the autodelete, exclusive and
         * durable propeties to be explictly set. Note however that if
         * exclusive is true, autodelete has no meaning as exclusive
         * queues are always destroyed when the connection that
         * created them is closed.
         */
	Queue(std::string name, bool autodelete, bool exclusive, bool durable);
	const std::string& getName() const;
	void setName(const std::string&);
        bool isAutoDelete() const;
        bool isExclusive() const;
        bool isDurable() const;
        void setDurable(bool durable);
    };

}
}

#endif  /*!_client_ClientQueue_h*/
