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

#ifndef __gnu_javax_net_ssl_provider_ServerDHE_PSKParameters__
#define __gnu_javax_net_ssl_provider_ServerDHE_PSKParameters__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace javax
    {
      namespace net
      {
        namespace ssl
        {
          namespace provider
          {
              class KeyExchangeAlgorithm;
              class ServerDHE_PSKParameters;
              class ServerDHParams;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace nio
    {
        class ByteBuffer;
    }
  }
}

class gnu::javax::net::ssl::provider::ServerDHE_PSKParameters : public ::java::lang::Object
{

public:
  ServerDHE_PSKParameters(::java::nio::ByteBuffer *);
  ServerDHE_PSKParameters(::java::lang::String *, ::gnu::javax::net::ssl::provider::ServerDHParams *);
  ServerDHE_PSKParameters(::java::lang::String *, ::java::nio::ByteBuffer *);
  virtual ::gnu::javax::net::ssl::provider::KeyExchangeAlgorithm * algorithm();
  virtual jint length();
private:
  jint hintLength();
public:
  virtual ::java::lang::String * identityHint();
  virtual ::gnu::javax::net::ssl::provider::ServerDHParams * params();
  virtual ::java::nio::ByteBuffer * buffer();
  virtual ::java::lang::String * toString();
  virtual ::java::lang::String * toString(::java::lang::String *);
private:
  ::java::nio::ByteBuffer * __attribute__((aligned(__alignof__( ::java::lang::Object)))) buffer__;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_javax_net_ssl_provider_ServerDHE_PSKParameters__
