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

#ifndef __java_security_cert_PKIXParameters__
#define __java_security_cert_PKIXParameters__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace security
    {
        class KeyStore;
      namespace cert
      {
          class CertSelector;
          class CertStore;
          class PKIXCertPathChecker;
          class PKIXParameters;
      }
    }
  }
}

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

public:
  PKIXParameters(::java::security::KeyStore *);
  PKIXParameters(::java::util::Set *);
private:
  PKIXParameters();
  PKIXParameters(::java::security::cert::PKIXParameters *);
public:
  virtual ::java::util::Set * getTrustAnchors();
  virtual void setTrustAnchors(::java::util::Set *);
  virtual ::java::util::Set * getInitialPolicies();
  virtual void setInitialPolicies(::java::util::Set *);
  virtual void addCertStore(::java::security::cert::CertStore *);
  virtual ::java::util::List * getCertStores();
  virtual void setCertStores(::java::util::List *);
  virtual jboolean isRevocationEnabled();
  virtual void setRevocationEnabled(jboolean);
  virtual jboolean isExplicitPolicyRequired();
  virtual void setExplicitPolicyRequired(jboolean);
  virtual jboolean isPolicyMappingInhibited();
  virtual void setPolicyMappingInhibited(jboolean);
  virtual jboolean isAnyPolicyInhibited();
  virtual void setAnyPolicyInhibited(jboolean);
  virtual jboolean getPolicyQualifiersRejected();
  virtual void setPolicyQualifiersRejected(jboolean);
  virtual ::java::util::Date * getDate();
  virtual void setDate(::java::util::Date *);
  virtual void addCertPathChecker(::java::security::cert::PKIXCertPathChecker *);
  virtual ::java::util::List * getCertPathCheckers();
  virtual void setCertPathCheckers(::java::util::List *);
  virtual ::java::lang::String * getSigProvider();
  virtual void setSigProvider(::java::lang::String *);
  virtual ::java::security::cert::CertSelector * getTargetCertConstraints();
  virtual void setTargetCertConstraints(::java::security::cert::CertSelector *);
  virtual ::java::lang::Object * clone();
  virtual ::java::lang::String * toString();
private:
  ::java::util::Set * __attribute__((aligned(__alignof__( ::java::lang::Object)))) trustAnchors;
  ::java::util::Set * initPolicies;
  ::java::util::List * certStores;
  ::java::util::List * pathCheckers;
  jboolean revocationEnabled;
  jboolean exPolicyRequired;
  jboolean policyMappingInhibited;
  jboolean anyPolicyInhibited;
  jboolean policyQualRejected;
  ::java::util::Date * date;
  ::java::lang::String * sigProvider;
  ::java::security::cert::CertSelector * targetConstraints;
public:
  static ::java::lang::Class class$;
};

#endif // __java_security_cert_PKIXParameters__
