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

#ifndef __gnu_xml_aelfred2_SAXDriver$Adapter__
#define __gnu_xml_aelfred2_SAXDriver$Adapter__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace aelfred2
      {
          class SAXDriver$Adapter;
      }
    }
  }
  namespace org
  {
    namespace xml
    {
      namespace sax
      {
          class Attributes;
          class DocumentHandler;
          class Locator;
      }
    }
  }
}

class gnu::xml::aelfred2::SAXDriver$Adapter : public ::java::lang::Object
{

public: // actually package-private
  SAXDriver$Adapter(::org::xml::sax::DocumentHandler *);
public:
  virtual void setDocumentLocator(::org::xml::sax::Locator *);
  virtual void startDocument();
  virtual void processingInstruction(::java::lang::String *, ::java::lang::String *);
  virtual void startPrefixMapping(::java::lang::String *, ::java::lang::String *);
  virtual void startElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::org::xml::sax::Attributes *);
  virtual void characters(JArray< jchar > *, jint, jint);
  virtual void ignorableWhitespace(JArray< jchar > *, jint, jint);
  virtual void skippedEntity(::java::lang::String *);
  virtual void endElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void endPrefixMapping(::java::lang::String *);
  virtual void endDocument();
private:
  ::org::xml::sax::DocumentHandler * __attribute__((aligned(__alignof__( ::java::lang::Object)))) docHandler;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_aelfred2_SAXDriver$Adapter__
