#ifndef QPID_MESSAGING_AMQP_CONNECTIONCONTEXT_H
#define QPID_MESSAGING_AMQP_CONNECTIONCONTEXT_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 <deque>
#include <map>
#include <memory>
#include <string>
#include <boost/shared_ptr.hpp>
#include "qpid/Url.h"
#include "qpid/messaging/ConnectionOptions.h"
#include "qpid/sys/AtomicValue.h"
#include "qpid/sys/ConnectionCodec.h"
#include "qpid/sys/Monitor.h"
#include "qpid/types/Variant.h"
#include "qpid/messaging/amqp/TransportContext.h"

struct pn_connection_t;
struct pn_link_t;
struct pn_session_t;
struct pn_transport_t;


namespace qpid {
namespace framing {
class ProtocolVersion;
}
namespace messaging {
class Duration;
class Message;
namespace amqp {

class DriverImpl;
class ReceiverContext;
class Sasl;
class SessionContext;
class SenderContext;
class Transport;

/**
 *
 */
class ConnectionContext : public qpid::sys::ConnectionCodec, public qpid::messaging::ConnectionOptions, public TransportContext
{
  public:
    ConnectionContext(const std::string& url, const qpid::types::Variant::Map& options);
    ~ConnectionContext();
    void open();
    bool isOpen() const;
    void close();
    boost::shared_ptr<SessionContext> newSession(bool transactional, const std::string& name);
    boost::shared_ptr<SessionContext> getSession(const std::string& name) const;
    void endSession(boost::shared_ptr<SessionContext>);
    void attach(boost::shared_ptr<SessionContext>, boost::shared_ptr<SenderContext>);
    void attach(boost::shared_ptr<SessionContext>, boost::shared_ptr<ReceiverContext>);
    void send(boost::shared_ptr<SenderContext> ctxt, const qpid::messaging::Message& message, bool sync);
    bool fetch(boost::shared_ptr<SessionContext> ssn, boost::shared_ptr<ReceiverContext> lnk, qpid::messaging::Message& message, qpid::messaging::Duration timeout);
    bool get(boost::shared_ptr<SessionContext> ssn, boost::shared_ptr<ReceiverContext> lnk, qpid::messaging::Message& message, qpid::messaging::Duration timeout);
    void acknowledge(boost::shared_ptr<SessionContext> ssn, qpid::messaging::Message* message, bool cumulative);

    void setOption(const std::string& name, const qpid::types::Variant& value);
    std::string getAuthenticatedUsername();

    void setCapacity(boost::shared_ptr<SenderContext>, uint32_t);
    uint32_t getCapacity(boost::shared_ptr<SenderContext>);
    uint32_t getUnsettled(boost::shared_ptr<SenderContext>);

    void setCapacity(boost::shared_ptr<ReceiverContext>, uint32_t);
    uint32_t getCapacity(boost::shared_ptr<ReceiverContext>);
    uint32_t getAvailable(boost::shared_ptr<ReceiverContext>);
    uint32_t getUnsettled(boost::shared_ptr<ReceiverContext>);


    void activateOutput();
    qpid::sys::Codec& getCodec();
    //ConnectionCodec interface:
    std::size_t decode(const char* buffer, std::size_t size);
    std::size_t encode(char* buffer, std::size_t size);
    bool canEncode();
    void closed();
    bool isClosed() const;
    framing::ProtocolVersion getVersion() const;
    //additionally, Transport needs:
    void opened();//signal successful connection

  private:
    typedef std::map<std::string, boost::shared_ptr<SessionContext> > SessionMap;
    qpid::Url url;

    boost::shared_ptr<DriverImpl> driver;
    boost::shared_ptr<Transport> transport;

    pn_transport_t* engine;
    pn_connection_t* connection;
    SessionMap sessions;
    mutable qpid::sys::Monitor lock;
    bool writeHeader;
    bool readHeader;
    bool haveOutput;
    std::string id;
    enum {
        DISCONNECTED,
        CONNECTING,
        CONNECTED
    } state;
    std::auto_ptr<Sasl> sasl;
    class CodecSwitch : public qpid::sys::Codec
    {
      public:
        CodecSwitch(ConnectionContext&);
        std::size_t decode(const char* buffer, std::size_t size);
        std::size_t encode(char* buffer, std::size_t size);
        bool canEncode();
      private:
        ConnectionContext& parent;
    };
    CodecSwitch codecSwitch;

    void wait();
    void wakeupDriver();
    void attach(pn_session_t*, pn_link_t*, int credit=0);

    std::size_t readProtocolHeader(const char* buffer, std::size_t size);
    std::size_t writeProtocolHeader(char* buffer, std::size_t size);
    std::string getError();
    bool useSasl();
};

}}} // namespace qpid::messaging::amqp

#endif  /*!QPID_MESSAGING_AMQP_CONNECTIONCONTEXT_H*/
