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

#ifndef __java_security_MessageDigest__
#define __java_security_MessageDigest__

#pragma interface

#include <java/security/MessageDigestSpi.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace nio
    {
        class ByteBuffer;
    }
    namespace security
    {
        class MessageDigest;
        class Provider;
    }
  }
}

class java::security::MessageDigest : public ::java::security::MessageDigestSpi
{

public: // actually protected
  MessageDigest(::java::lang::String *);
public:
  static ::java::security::MessageDigest * getInstance(::java::lang::String *);
  static ::java::security::MessageDigest * getInstance(::java::lang::String *, ::java::lang::String *);
  static ::java::security::MessageDigest * getInstance(::java::lang::String *, ::java::security::Provider *);
  virtual ::java::security::Provider * getProvider();
  virtual void update(jbyte);
  virtual void update(JArray< jbyte > *, jint, jint);
  virtual void update(JArray< jbyte > *);
  virtual void update(::java::nio::ByteBuffer *);
  virtual JArray< jbyte > * digest();
  virtual jint digest(JArray< jbyte > *, jint, jint);
  virtual JArray< jbyte > * digest(JArray< jbyte > *);
  virtual ::java::lang::String * toString();
  static jboolean isEqual(JArray< jbyte > *, JArray< jbyte > *);
  virtual void reset();
  virtual ::java::lang::String * getAlgorithm();
  virtual jint getDigestLength();
  virtual ::java::lang::Object * clone();
private:
  ::java::lang::String * digestToString();
  static ::java::lang::String * MESSAGE_DIGEST;
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::security::MessageDigestSpi)))) algorithm;
public: // actually package-private
  ::java::security::Provider * provider;
private:
  JArray< jbyte > * lastDigest;
public:
  static ::java::lang::Class class$;
};

#endif // __java_security_MessageDigest__
