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

#ifndef __gnu_xml_dom_DomDoctype__
#define __gnu_xml_dom_DomDoctype__

#pragma interface

#include <gnu/xml/dom/DomExtern.h>
extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace dom
      {
          class DTDAttributeTypeInfo;
          class DTDElementTypeInfo;
          class DomDoctype;
          class DomDocument;
          class DomNamedNodeMap;
      }
    }
  }
  namespace org
  {
    namespace w3c
    {
      namespace dom
      {
          class DOMImplementation;
          class Entity;
          class NamedNodeMap;
          class Node;
          class Notation;
      }
    }
  }
}

class gnu::xml::dom::DomDoctype : public ::gnu::xml::dom::DomExtern
{

public: // actually protected
  DomDoctype(::org::w3c::dom::DOMImplementation *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
public:
  DomDoctype(::gnu::xml::dom::DomDocument *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual ::java::lang::String * getName();
  virtual ::org::w3c::dom::NamedNodeMap * getEntities();
  virtual ::org::w3c::dom::Entity * declareEntity(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual ::org::w3c::dom::NamedNodeMap * getNotations();
  virtual ::org::w3c::dom::Notation * declareNotation(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual ::java::lang::String * getInternalSubset();
  virtual ::java::lang::String * getBaseURI();
  virtual void makeReadonly();
public: // actually package-private
  virtual void setOwner(::gnu::xml::dom::DomDocument *);
public:
  virtual jboolean supports(::java::lang::String *, ::java::lang::String *);
  virtual ::org::w3c::dom::DOMImplementation * getImplementation();
  virtual void elementDecl(::java::lang::String *, ::java::lang::String *);
public: // actually package-private
  virtual ::gnu::xml::dom::DTDElementTypeInfo * getElementTypeInfo(::java::lang::String *);
public:
  virtual void attributeDecl(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
public: // actually package-private
  virtual ::gnu::xml::dom::DTDAttributeTypeInfo * getAttributeTypeInfo(::java::lang::String *, ::java::lang::String *);
  virtual jboolean hasIds();
public:
  virtual jboolean isSameNode(::org::w3c::dom::Node *);
  virtual ::java::lang::Object * clone();
private:
  ::gnu::xml::dom::DomNamedNodeMap * __attribute__((aligned(__alignof__( ::gnu::xml::dom::DomExtern)))) notations;
  ::gnu::xml::dom::DomNamedNodeMap * entities;
  ::org::w3c::dom::DOMImplementation * implementation;
  ::java::lang::String * subset;
  ::java::util::HashMap * elements;
  jboolean ids;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_dom_DomDoctype__
