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

#ifndef __javax_net_ssl_KeyManagerFactory__
#define __javax_net_ssl_KeyManagerFactory__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace security
    {
        class KeyStore;
        class Provider;
    }
  }
  namespace javax
  {
    namespace net
    {
      namespace ssl
      {
          class KeyManager;
          class KeyManagerFactory;
          class KeyManagerFactorySpi;
          class ManagerFactoryParameters;
      }
    }
  }
}

class javax::net::ssl::KeyManagerFactory : public ::java::lang::Object
{

public: // actually protected
  KeyManagerFactory(::javax::net::ssl::KeyManagerFactorySpi *, ::java::security::Provider *, ::java::lang::String *);
public:
  static ::java::lang::String * getDefaultAlgorithm();
  static ::javax::net::ssl::KeyManagerFactory * getInstance(::java::lang::String *);
  static ::javax::net::ssl::KeyManagerFactory * getInstance(::java::lang::String *, ::java::lang::String *);
  static ::javax::net::ssl::KeyManagerFactory * getInstance(::java::lang::String *, ::java::security::Provider *);
  virtual ::java::lang::String * getAlgorithm();
  virtual JArray< ::javax::net::ssl::KeyManager * > * getKeyManagers();
  virtual ::java::security::Provider * getProvider();
  virtual void init(::javax::net::ssl::ManagerFactoryParameters *);
  virtual void init(::java::security::KeyStore *, JArray< jchar > *);
private:
  static ::java::lang::String * KEY_MANAGER_FACTORY;
  static ::java::lang::String * DEFAULT_ALGORITHM;
  ::javax::net::ssl::KeyManagerFactorySpi * __attribute__((aligned(__alignof__( ::java::lang::Object)))) kmfSpi;
  ::java::security::Provider * provider;
  ::java::lang::String * algorithm;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_net_ssl_KeyManagerFactory__
