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

#ifndef __java_security_cert_X509CertSelector__
#define __java_security_cert_X509CertSelector__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace security
      {
          class OID;
        namespace x509
        {
          namespace ext
          {
              class GeneralName;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace math
    {
        class BigInteger;
    }
    namespace security
    {
        class PublicKey;
      namespace cert
      {
          class Certificate;
          class X509CertSelector;
          class X509Certificate;
      }
      namespace spec
      {
          class X509EncodedKeySpec;
      }
    }
  }
  namespace javax
  {
    namespace security
    {
      namespace auth
      {
        namespace x500
        {
            class X500Principal;
        }
      }
    }
  }
}

class java::security::cert::X509CertSelector : public ::java::lang::Object
{

  static jboolean checkOid(JArray< jint > *);
  static ::gnu::java::security::x509::ext::GeneralName * makeName(jint, ::java::lang::String *);
public:
  X509CertSelector();
  virtual void addPathToName(jint, JArray< jbyte > *);
  virtual void addPathToName(jint, ::java::lang::String *);
  virtual void addSubjectAlternativeName(jint, JArray< jbyte > *);
  virtual void addSubjectAlternativeName(jint, ::java::lang::String *);
  virtual ::java::lang::Object * clone();
  virtual JArray< jbyte > * getAuthorityKeyIdentifier();
  virtual jint getBasicConstraints();
  virtual ::java::security::cert::X509Certificate * getCertificate();
  virtual ::java::util::Date * getCertificateValid();
  virtual ::java::util::Set * getExtendedKeyUsage();
  virtual JArray< jbyte > * getIssuerAsBytes();
  virtual ::java::lang::String * getIssuerAsString();
  virtual JArray< jboolean > * getKeyUsage();
  virtual jboolean getMatchAllSubjectAltNames();
  virtual JArray< jbyte > * getNameConstraints();
  virtual ::java::util::Collection * getPathToNames();
  virtual ::java::util::Set * getPolicy();
  virtual ::java::util::Date * getPrivateKeyValid();
  virtual ::java::math::BigInteger * getSerialNumber();
  virtual ::java::util::Collection * getSubjectAlternativeNames();
  virtual JArray< jbyte > * getSubjectAsBytes();
  virtual ::java::lang::String * getSubjectAsString();
  virtual JArray< jbyte > * getSubjectKeyIdentifier();
  virtual ::java::security::PublicKey * getSubjectPublicKey();
  virtual ::java::lang::String * getSubjectPublicKeyAlgID();
  virtual jboolean match(::java::security::cert::Certificate *);
  virtual void setAuthorityKeyIdentifier(JArray< jbyte > *);
  virtual void setBasicConstraints(jint);
  virtual void setCertificate(::java::security::cert::X509Certificate *);
  virtual void setCertificateValid(::java::util::Date *);
  virtual void setExtendedKeyUsage(::java::util::Set *);
  virtual void setIssuer(JArray< jbyte > *);
  virtual void setIssuer(::java::lang::String *);
  virtual void setKeyUsage(JArray< jboolean > *);
  virtual void setMatchAllSubjectAltNames(jboolean);
  virtual void setNameConstraints(JArray< jbyte > *);
  virtual void setPathToNames(::java::util::Collection *);
  virtual void setPolicy(::java::util::Set *);
  virtual void setPrivateKeyValid(::java::util::Date *);
  virtual void setSerialNumber(::java::math::BigInteger *);
  virtual void setSubject(JArray< jbyte > *);
  virtual void setSubject(::java::lang::String *);
  virtual void setSubjectAlternativeNames(::java::util::Collection *);
  virtual void setSubjectKeyIdentifier(JArray< jbyte > *);
  virtual void setSubjectPublicKey(JArray< jbyte > *);
  virtual void setSubjectPublicKey(::java::security::PublicKey *);
  virtual void setSubjectPublicKeyAlgID(::java::lang::String *);
  virtual ::java::lang::String * toString();
public: // actually package-private
  static JArray< jint > * $SWITCH_TABLE$gnu$java$security$x509$ext$GeneralName$Kind();
private:
  static ::java::lang::String * AUTH_KEY_ID;
  static ::java::lang::String * SUBJECT_KEY_ID;
  static ::java::lang::String * NAME_CONSTRAINTS_ID;
  jint __attribute__((aligned(__alignof__( ::java::lang::Object)))) basicConstraints;
  ::java::security::cert::X509Certificate * cert;
  ::java::math::BigInteger * serialNo;
  ::javax::security::auth::x500::X500Principal * issuer;
  ::javax::security::auth::x500::X500Principal * subject;
  JArray< jbyte > * subjectKeyId;
  JArray< jbyte > * authKeyId;
  JArray< jboolean > * keyUsage;
  ::java::util::Date * certValid;
  ::gnu::java::security::OID * sigId;
  ::java::security::PublicKey * subjectKey;
  ::java::security::spec::X509EncodedKeySpec * subjectKeySpec;
  ::java::util::Set * keyPurposeSet;
  ::java::util::List * altNames;
  jboolean matchAllNames;
  JArray< jbyte > * nameConstraints;
  ::java::util::Set * policy;
  ::java::util::List * pathToNames;
  static JArray< jint > * $SWITCH_TABLE$gnu$java$security$x509$ext$GeneralName$Kind__;
public:
  static ::java::lang::Class class$;
};

#endif // __java_security_cert_X509CertSelector__
