
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __gnu_java_net_protocol_http_HTTPConnection__
#define __gnu_java_net_protocol_http_HTTPConnection__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace net
      {
        namespace protocol
        {
          namespace http
          {
              class CookieManager;
              class HTTPConnection;
              class HTTPConnection$Pool;
              class Request;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace net
    {
        class Socket;
    }
  }
  namespace javax
  {
    namespace net
    {
      namespace ssl
      {
          class HandshakeCompletedListener;
          class SSLSocketFactory;
      }
    }
  }
}

class gnu::java::net::protocol::http::HTTPConnection : public ::java::lang::Object
{

public:
  HTTPConnection(::java::lang::String *);
  HTTPConnection(::java::lang::String *, jboolean);
  HTTPConnection(::java::lang::String *, jboolean, jint, jint);
  HTTPConnection(::java::lang::String *, jint);
  HTTPConnection(::java::lang::String *, jint, jboolean);
  HTTPConnection(::java::lang::String *, jint, jboolean, jint, jint);
  virtual ::java::lang::String * getHostName();
  virtual jint getPort();
  virtual jboolean isSecure();
  virtual ::java::lang::String * getVersion();
  virtual void setVersion(jint, jint);
  virtual void setProxy(::java::lang::String *, jint);
  virtual jboolean isUsingProxy();
  virtual void setCookieManager(::gnu::java::net::protocol::http::CookieManager *);
  virtual ::gnu::java::net::protocol::http::CookieManager * getCookieManager();
public: // actually package-private
  virtual void setPool(::gnu::java::net::protocol::http::HTTPConnection$Pool *);
  virtual void release();
public:
  virtual ::gnu::java::net::protocol::http::Request * newRequest(::java::lang::String *, ::java::lang::String *);
  virtual void close();
public: // actually protected
  virtual ::java::net::Socket * getSocket();
public: // actually package-private
  virtual ::javax::net::ssl::SSLSocketFactory * getSSLSocketFactory();
  virtual void setSSLSocketFactory(::javax::net::ssl::SSLSocketFactory *);
public: // actually protected
  virtual ::java::io::InputStream * getInputStream();
  virtual ::java::io::OutputStream * getOutputStream();
  virtual void closeConnection();
  virtual ::java::lang::String * getURI();
public: // actually package-private
  virtual jint getNonceCount(::java::lang::String *);
  virtual void incrementNonce(::java::lang::String *);
  virtual void addHandshakeCompletedListener(::javax::net::ssl::HandshakeCompletedListener *);
  virtual void removeHandshakeCompletedListener(::javax::net::ssl::HandshakeCompletedListener *);
public:
  static const jint HTTP_PORT = 80;
  static const jint HTTPS_PORT = 443;
private:
  static ::java::lang::String * userAgent;
public: // actually protected
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) hostname;
  jint port;
  jboolean secure;
  jint connectionTimeout;
  jint timeout;
  ::java::lang::String * proxyHostname;
  jint proxyPort;
  jint majorVersion;
  jint minorVersion;
private:
  ::java::util::List * handshakeCompletedListeners;
public: // actually protected
  ::java::net::Socket * socket;
private:
  ::javax::net::ssl::SSLSocketFactory * sslSocketFactory;
public: // actually protected
  ::java::io::InputStream * in;
  ::java::io::OutputStream * out;
private:
  ::java::util::Map * nonceCounts;
public: // actually protected
  ::gnu::java::net::protocol::http::CookieManager * cookieManager;
private:
  ::gnu::java::net::protocol::http::HTTPConnection$Pool * pool;
public: // actually package-private
  jint useCount;
  jlong timeLastUsed;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_net_protocol_http_HTTPConnection__
