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

#ifndef __gnu_xml_libxmlj_dom_GnomeDocumentBuilder__
#define __gnu_xml_libxmlj_dom_GnomeDocumentBuilder__

#pragma interface

#include <javax/xml/parsers/DocumentBuilder.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace libxmlj
      {
        namespace dom
        {
            class GnomeDocumentBuilder;
        }
      }
    }
  }
  namespace org
  {
    namespace w3c
    {
      namespace dom
      {
          class DOMImplementation;
          class Document;
          class DocumentType;
      }
    }
    namespace xml
    {
      namespace sax
      {
          class EntityResolver;
          class ErrorHandler;
          class InputSource;
      }
    }
  }
}

class gnu::xml::libxmlj::dom::GnomeDocumentBuilder : public ::javax::xml::parsers::DocumentBuilder
{

public:
  GnomeDocumentBuilder();
  GnomeDocumentBuilder(jboolean, jboolean, jboolean);
  virtual ::org::w3c::dom::DOMImplementation * getDOMImplementation();
  virtual jboolean isNamespaceAware();
  virtual jboolean isValidating();
  virtual ::org::w3c::dom::Document * newDocument();
  virtual ::org::w3c::dom::Document * parse(::org::xml::sax::InputSource *);
private:
  ::org::w3c::dom::Document * parseStream(::java::io::InputStream *, JArray< jbyte > *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, jboolean, jboolean, jboolean, jboolean, jboolean);
public:
  virtual void setEntityResolver(::org::xml::sax::EntityResolver *);
  virtual void setErrorHandler(::org::xml::sax::ErrorHandler *);
  virtual jboolean hasFeature(::java::lang::String *, ::java::lang::String *);
  virtual ::java::lang::Object * getFeature(::java::lang::String *, ::java::lang::String *);
  virtual ::org::w3c::dom::Document * createDocument(::java::lang::String *, ::java::lang::String *, ::org::w3c::dom::DocumentType *);
  virtual ::org::w3c::dom::DocumentType * createDocumentType(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
private:
  void setDocumentLocator(::java::lang::Object *, ::java::lang::Object *);
  ::java::io::InputStream * resolveEntity(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  void warning(::java::lang::String *, jint, jint, ::java::lang::String *, ::java::lang::String *);
  void error(::java::lang::String *, jint, jint, ::java::lang::String *, ::java::lang::String *);
  void fatalError(::java::lang::String *, jint, jint, ::java::lang::String *, ::java::lang::String *);
  jboolean __attribute__((aligned(__alignof__( ::javax::xml::parsers::DocumentBuilder)))) validate;
  jboolean coalesce;
  jboolean expandEntities;
  ::org::xml::sax::EntityResolver * entityResolver;
  ::org::xml::sax::ErrorHandler * errorHandler;
  jboolean seenFatalError;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_libxmlj_dom_GnomeDocumentBuilder__
