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

#ifndef __java_security_SecureRandom__
#define __java_security_SecureRandom__

#pragma interface

#include <java/util/Random.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace security
    {
        class Provider;
        class SecureRandom;
        class SecureRandomSpi;
    }
  }
}

class java::security::SecureRandom : public ::java::util::Random
{

public:
  SecureRandom();
  SecureRandom(JArray< jbyte > *);
public: // actually protected
  SecureRandom(::java::security::SecureRandomSpi *, ::java::security::Provider *);
private:
  SecureRandom(::java::security::SecureRandomSpi *, ::java::security::Provider *, ::java::lang::String *);
public:
  static ::java::security::SecureRandom * getInstance(::java::lang::String *);
  static ::java::security::SecureRandom * getInstance(::java::lang::String *, ::java::lang::String *);
  static ::java::security::SecureRandom * getInstance(::java::lang::String *, ::java::security::Provider *);
  virtual ::java::security::Provider * getProvider();
  virtual ::java::lang::String * getAlgorithm();
  virtual void setSeed(JArray< jbyte > *);
  virtual void setSeed(jlong);
  virtual void nextBytes(JArray< jbyte > *);
public: // actually protected
  virtual jint next(jint);
public:
  static JArray< jbyte > * getSeed(jint);
  virtual JArray< jbyte > * generateSeed(jint);
private:
  static jint generateSeed(JArray< jbyte > *);
  static jint generateSeed(JArray< jbyte > *, jint, jint);
  static ::java::lang::String * SECURE_RANDOM;
  static const jlong serialVersionUID = 4940670005562187LL;
public: // actually package-private
  jlong __attribute__((aligned(__alignof__( ::java::util::Random)))) counter;
  ::java::security::Provider * provider;
  JArray< jbyte > * randomBytes;
  jint randomBytesUsed;
  ::java::security::SecureRandomSpi * secureRandomSpi;
  JArray< jbyte > * state;
private:
  ::java::lang::String * algorithm;
  jboolean isSeeded;
  static ::java::lang::String * SECURERANDOM_SOURCE;
  static ::java::lang::String * JAVA_SECURITY_EGD;
  static ::java::util::logging::Logger * logger;
public:
  static ::java::lang::Class class$;
};

#endif // __java_security_SecureRandom__
