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

#ifndef __gnu_javax_net_ssl_Session__
#define __gnu_javax_net_ssl_Session__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace javax
    {
      namespace net
      {
        namespace ssl
        {
            class Session;
            class Session$ID;
        }
      }
    }
  }
  namespace java
  {
    namespace security
    {
        class Principal;
        class SecureRandom;
      namespace cert
      {
          class Certificate;
      }
    }
  }
  namespace javax
  {
    namespace crypto
    {
        class SealedObject;
    }
    namespace net
    {
      namespace ssl
      {
          class SSLSessionContext;
      }
    }
    namespace security
    {
      namespace cert
      {
          class X509Certificate;
      }
    }
  }
}

class gnu::javax::net::ssl::Session : public ::java::lang::Object
{

public: // actually protected
  Session();
public:
  virtual void access();
  virtual jint getApplicationBufferSize();
  virtual ::java::lang::String * getCipherSuite();
  virtual jlong getCreationTime();
  virtual JArray< jbyte > * getId();
  virtual ::gnu::javax::net::ssl::Session$ID * id();
  virtual jlong getLastAccessedTime();
  virtual JArray< ::java::security::cert::Certificate * > * getLocalCertificates();
  virtual ::java::security::Principal * getLocalPrincipal();
  virtual jint getPacketBufferSize();
  virtual JArray< ::java::security::cert::Certificate * > * getPeerCertificates();
  virtual JArray< ::javax::security::cert::X509Certificate * > * getPeerCertificateChain();
  virtual ::java::lang::String * getPeerHost();
  virtual jint getPeerPort();
  virtual ::java::security::Principal * getPeerPrincipal();
  virtual ::javax::net::ssl::SSLSessionContext * getSessionContext();
  virtual JArray< ::java::lang::String * > * getValueNames();
  virtual ::java::lang::Object * getValue(::java::lang::String *);
  virtual void invalidate();
  virtual jboolean isValid();
  virtual void putValue(::java::lang::String *, ::java::lang::Object *);
  virtual void removeValue(::java::lang::String *);
  virtual jboolean isTruncatedMac();
  virtual void prepare(JArray< jchar > *) = 0;
  virtual void repair(JArray< jchar > *) = 0;
  virtual ::javax::crypto::SealedObject * privateData() = 0;
  virtual void setPrivateData(::javax::crypto::SealedObject *) = 0;
  virtual ::java::lang::String * getProtocol() = 0;
public: // actually protected
  jlong __attribute__((aligned(__alignof__( ::java::lang::Object)))) creationTime;
  jlong lastAccessedTime;
  jint applicationBufferSize;
  ::gnu::javax::net::ssl::Session$ID * sessionId;
  JArray< ::java::security::cert::Certificate * > * localCerts;
  JArray< ::java::security::cert::Certificate * > * peerCerts;
  JArray< ::javax::security::cert::X509Certificate * > * peerCertChain;
  ::java::lang::String * peerHost;
  jint peerPort;
  jboolean peerVerified;
  ::java::util::HashMap * values;
  jboolean valid;
  jboolean truncatedMac;
  ::java::security::SecureRandom * random;
  ::javax::net::ssl::SSLSessionContext * context;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_javax_net_ssl_Session__
