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

#ifndef __gnu_xml_pipeline_DomConsumer$Handler__
#define __gnu_xml_pipeline_DomConsumer$Handler__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace pipeline
      {
          class DomConsumer;
          class DomConsumer$Handler;
      }
    }
  }
  namespace org
  {
    namespace w3c
    {
      namespace dom
      {
          class DOMImplementation;
          class Document;
          class Element;
          class Node;
          class Text;
      }
    }
    namespace xml
    {
      namespace sax
      {
          class Attributes;
          class Locator;
        namespace helpers
        {
            class AttributesImpl;
        }
      }
    }
  }
}

class gnu::xml::pipeline::DomConsumer$Handler : public ::java::lang::Object
{

public: // actually protected
  DomConsumer$Handler(::gnu::xml::pipeline::DomConsumer *);
private:
  void fatal(::java::lang::String *, ::java::lang::Exception *);
public: // actually package-private
  virtual ::org::w3c::dom::Document * clearDocument();
public: // actually protected
  virtual ::org::w3c::dom::Document * getDocument();
  virtual ::org::w3c::dom::Node * getTop();
public:
  virtual void setDocumentLocator(::org::xml::sax::Locator *);
  virtual void startDocument();
  virtual void endDocument();
  virtual void processingInstruction(::java::lang::String *, ::java::lang::String *);
public: // actually protected
  virtual ::org::w3c::dom::Text * createText(jboolean, JArray< jchar > *, jint, jint);
public:
  virtual void characters(JArray< jchar > *, jint, jint);
  virtual void skippedEntity(::java::lang::String *);
  virtual void startPrefixMapping(::java::lang::String *, ::java::lang::String *);
  virtual void endPrefixMapping(::java::lang::String *);
  virtual void startElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::org::xml::sax::Attributes *);
private:
  void populateAttributes(::org::w3c::dom::Element *, ::org::xml::sax::Attributes *);
  ::java::lang::String * getPrefix(::java::lang::String *);
  ::java::lang::String * getNamespace(::java::lang::String *, ::org::xml::sax::Attributes *);
public:
  virtual void endElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void ignorableWhitespace(JArray< jchar > *, jint, jint);
  virtual void startCDATA();
  virtual void endCDATA();
  virtual void startDTD(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void endDTD();
  virtual void comment(JArray< jchar > *, jint, jint);
  virtual jboolean canPopulateEntityRefs();
  virtual void startEntity(::java::lang::String *);
  virtual void endEntity(::java::lang::String *);
  virtual void notationDecl(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void unparsedEntityDecl(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void elementDecl(::java::lang::String *, ::java::lang::String *);
  virtual void attributeDecl(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void internalEntityDecl(::java::lang::String *, ::java::lang::String *);
  virtual void externalEntityDecl(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
private:
  void namespaceError(::java::lang::String *);
public: // actually protected
  ::gnu::xml::pipeline::DomConsumer * __attribute__((aligned(__alignof__( ::java::lang::Object)))) consumer;
private:
  ::org::w3c::dom::DOMImplementation * impl;
  ::org::w3c::dom::Document * document;
  jboolean isL2;
  ::org::xml::sax::Locator * locator;
  ::org::w3c::dom::Node * top;
  jboolean inCDATA;
  jboolean mergeCDATA;
  jboolean inDTD;
  ::java::lang::String * currentEntity;
  jboolean recreatedAttrs;
  ::org::xml::sax::helpers::AttributesImpl * attributes;
public: // actually package-private
  static ::java::lang::String * xmlnsURI;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_pipeline_DomConsumer$Handler__
