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

#ifndef __gnu_xml_util_XMLWriter__
#define __gnu_xml_util_XMLWriter__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace util
      {
          class XMLWriter;
      }
    }
  }
  namespace org
  {
    namespace xml
    {
      namespace sax
      {
          class Attributes;
          class ErrorHandler;
          class Locator;
      }
    }
  }
}

class gnu::xml::util::XMLWriter : public ::java::lang::Object
{

  static jboolean isLineEnd(::java::lang::String *);
public:
  XMLWriter();
  XMLWriter(::java::io::OutputStream *);
  XMLWriter(::java::io::Writer *);
  XMLWriter(::java::io::Writer *, ::java::lang::String *);
private:
  void setEncoding(::java::lang::String *);
public:
  virtual void setWriter(::java::io::Writer *, ::java::lang::String *);
  virtual void setEOL(::java::lang::String *);
  virtual void setErrorHandler(::org::xml::sax::ErrorHandler *);
public: // actually protected
  virtual void fatal(::java::lang::String *, ::java::lang::Exception *);
public:
  virtual void setXhtml(jboolean);
  virtual jboolean isXhtml();
  virtual void setExpandingEntities(jboolean);
  virtual jboolean isExpandingEntities();
  virtual void setPrettyPrinting(jboolean);
  virtual jboolean isPrettyPrinting();
  virtual void setCanonical(jboolean);
  virtual jboolean isCanonical();
  virtual void flush();
  virtual void write(::java::lang::String *);
  virtual void writeElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::org::xml::sax::Attributes *, ::java::lang::String *);
  virtual void writeElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::org::xml::sax::Attributes *, jint);
  virtual void setDocumentLocator(::org::xml::sax::Locator *);
  virtual void startDocument();
  virtual void endDocument();
private:
  static jboolean isEmptyElementTag(::java::lang::String *);
  static jboolean indentBefore(::java::lang::String *);
  static jboolean spaceBefore(::java::lang::String *);
  static jboolean spacePreserve(::java::lang::String *);
public:
  virtual void startPrefixMapping(::java::lang::String *, ::java::lang::String *);
  virtual void endPrefixMapping(::java::lang::String *);
private:
  void writeStartTag(::java::lang::String *, ::org::xml::sax::Attributes *, jboolean);
public:
  virtual void startElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::org::xml::sax::Attributes *);
  virtual void writeEmptyElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::org::xml::sax::Attributes *);
  virtual void endElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void characters(JArray< jchar > *, jint, jint);
  virtual void ignorableWhitespace(JArray< jchar > *, jint, jint);
  virtual void processingInstruction(::java::lang::String *, ::java::lang::String *);
  virtual void skippedEntity(::java::lang::String *);
  virtual void startCDATA();
  virtual void endCDATA();
  virtual void startDTD(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void endDTD();
  virtual void startEntity(::java::lang::String *);
  virtual void endEntity(::java::lang::String *);
  virtual void comment(JArray< jchar > *, jint, jint);
  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 attributeDecl(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void elementDecl(::java::lang::String *, ::java::lang::String *);
  virtual void externalEntityDecl(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void internalEntityDecl(::java::lang::String *, ::java::lang::String *);
private:
  void writeQuotedValue(::java::lang::String *, jint);
  void escapeChars(JArray< jchar > *, jint, jint, jint);
  void newline();
  void doIndent();
  void rawWrite(jchar);
  void rawWrite(::java::lang::String *);
  void rawWrite(JArray< jchar > *, jint, jint);
  static const jint CTX_ENTITY = 1;
  static const jint CTX_ATTRIBUTE = 2;
  static const jint CTX_CONTENT = 3;
  static const jint CTX_UNPARSED = 4;
  static const jint CTX_NAME = 5;
  static ::java::lang::String * sysEOL;
  ::java::io::Writer * __attribute__((aligned(__alignof__( ::java::lang::Object)))) out;
  jboolean inCDATA;
  jint elementNestLevel;
  ::java::lang::String * eol;
  jshort dangerMask;
  ::java::lang::StringBuffer * stringBuf;
  ::org::xml::sax::Locator * locator;
  ::org::xml::sax::ErrorHandler * errHandler;
  jboolean expandingEntities;
  jint entityNestLevel;
  jboolean xhtml;
  jboolean startedDoctype;
  ::java::lang::String * encoding;
  jboolean canonical;
  jboolean inDoctype;
  jboolean inEpilogue;
  jboolean prettyPrinting;
  jint column;
  jboolean noWrap;
  ::java::util::Stack * space;
  static const jint lineLength = 75;
  static ::java::lang::String * xhtmlFullDTD;
  static JArray< ::java::lang::String * > * HTMLlat1x;
  static JArray< ::java::lang::String * > * HTMLsymbolx_GR;
  static JArray< ::java::lang::String * > * HTMLsymbolx_gr;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_util_XMLWriter__
