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

#ifndef __gnu_java_security_jce_sig_SignatureAdapter__
#define __gnu_java_security_jce_sig_SignatureAdapter__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace security
      {
        namespace jce
        {
          namespace sig
          {
              class SignatureAdapter;
          }
        }
        namespace sig
        {
            class ISignature;
            class ISignatureCodec;
        }
      }
    }
  }
  namespace java
  {
    namespace security
    {
        class PrivateKey;
        class PublicKey;
        class SecureRandom;
      namespace spec
      {
          class AlgorithmParameterSpec;
      }
    }
  }
}

class gnu::java::security::jce::sig::SignatureAdapter : public ::java::security::SignatureSpi
{

public: // actually protected
  SignatureAdapter(::java::lang::String *, ::gnu::java::security::sig::ISignatureCodec *);
private:
  SignatureAdapter(::gnu::java::security::sig::ISignature *, ::gnu::java::security::sig::ISignatureCodec *);
public:
  virtual ::java::lang::Object * clone();
  virtual void engineInitVerify(::java::security::PublicKey *);
  virtual void engineInitSign(::java::security::PrivateKey *);
  virtual void engineInitSign(::java::security::PrivateKey *, ::java::security::SecureRandom *);
  virtual void engineUpdate(jbyte);
  virtual void engineUpdate(JArray< jbyte > *, jint, jint);
  virtual JArray< jbyte > * engineSign();
  virtual jint engineSign(JArray< jbyte > *, jint, jint);
  virtual jboolean engineVerify(JArray< jbyte > *);
  virtual void engineSetParameter(::java::lang::String *, ::java::lang::Object *);
  virtual void engineSetParameter(::java::security::spec::AlgorithmParameterSpec *);
  virtual ::java::lang::Object * engineGetParameter(::java::lang::String *);
private:
  static ::java::util::logging::Logger * log;
  ::gnu::java::security::sig::ISignature * __attribute__((aligned(__alignof__( ::java::security::SignatureSpi)))) adaptee;
  ::gnu::java::security::sig::ISignatureCodec * codec;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_security_jce_sig_SignatureAdapter__
