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

#ifndef __gnu_javax_net_ssl_provider_CertificateStatusRequest__
#define __gnu_javax_net_ssl_provider_CertificateStatusRequest__

#pragma interface

#include <gnu/javax/net/ssl/provider/Extension$Value.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace javax
    {
      namespace net
      {
        namespace ssl
        {
          namespace provider
          {
              class CertificateStatusRequest;
              class CertificateStatusType;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace nio
    {
        class ByteBuffer;
    }
  }
}

class gnu::javax::net::ssl::provider::CertificateStatusRequest : public ::gnu::javax::net::ssl::provider::Extension$Value
{

public:
  CertificateStatusRequest(::java::nio::ByteBuffer *);
  CertificateStatusRequest(::gnu::javax::net::ssl::provider::CertificateStatusType *, ::java::util::List *, JArray< jbyte > *);
  virtual jint length();
  virtual ::java::nio::ByteBuffer * buffer();
  virtual ::gnu::javax::net::ssl::provider::CertificateStatusType * statusType();
  virtual jint size();
  virtual JArray< jbyte > * responderId(jint);
  virtual JArray< jbyte > * requestExtensions();
  virtual void setStatusType(::gnu::javax::net::ssl::provider::CertificateStatusType *);
  virtual void setRequestIdListLength(jint);
  virtual void putRequestId(jint, JArray< jbyte > *);
  virtual void setRequestExtensions(jint, JArray< jbyte > *);
  virtual ::java::util::Iterator * iterator();
  virtual ::java::lang::String * toString();
  virtual ::java::lang::String * toString(::java::lang::String *);
private:
  ::java::nio::ByteBuffer * __attribute__((aligned(__alignof__( ::gnu::javax::net::ssl::provider::Extension$Value)))) buffer__;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_javax_net_ssl_provider_CertificateStatusRequest__
