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

#ifndef __java_security_cert_CertStore__
#define __java_security_cert_CertStore__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace security
    {
        class Provider;
      namespace cert
      {
          class CRLSelector;
          class CertSelector;
          class CertStore;
          class CertStoreParameters;
          class CertStoreSpi;
      }
    }
  }
}

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

public: // actually protected
  CertStore(::java::security::cert::CertStoreSpi *, ::java::security::Provider *, ::java::lang::String *, ::java::security::cert::CertStoreParameters *);
public:
  static ::java::lang::String * getDefaultType();
  static ::java::security::cert::CertStore * getInstance(::java::lang::String *, ::java::security::cert::CertStoreParameters *);
  static ::java::security::cert::CertStore * getInstance(::java::lang::String *, ::java::security::cert::CertStoreParameters *, ::java::lang::String *);
  static ::java::security::cert::CertStore * getInstance(::java::lang::String *, ::java::security::cert::CertStoreParameters *, ::java::security::Provider *);
  virtual ::java::lang::String * getType();
  virtual ::java::security::Provider * getProvider();
  virtual ::java::security::cert::CertStoreParameters * getCertStoreParameters();
  virtual ::java::util::Collection * getCertificates(::java::security::cert::CertSelector *);
  virtual ::java::util::Collection * getCRLs(::java::security::cert::CRLSelector *);
private:
  static ::java::lang::String * CERT_STORE;
  ::java::security::cert::CertStoreSpi * __attribute__((aligned(__alignof__( ::java::lang::Object)))) storeSpi;
  ::java::security::Provider * provider;
  ::java::lang::String * type;
  ::java::security::cert::CertStoreParameters * params;
public:
  static ::java::lang::Class class$;
};

#endif // __java_security_cert_CertStore__
