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

#ifndef __gnu_xml_stream_XMLStreamWriterImpl__
#define __gnu_xml_stream_XMLStreamWriterImpl__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace stream
      {
          class XMLStreamWriterImpl;
      }
    }
  }
  namespace javax
  {
    namespace xml
    {
      namespace namespace$
      {
          class NamespaceContext;
      }
    }
  }
  namespace org
  {
    namespace xml
    {
      namespace sax
      {
        namespace helpers
        {
            class NamespaceSupport;
        }
      }
    }
  }
}

class gnu::xml::stream::XMLStreamWriterImpl : public ::java::lang::Object
{

public: // actually protected
  XMLStreamWriterImpl(::java::io::Writer *, ::java::lang::String *, jboolean);
private:
  void endStartElement();
public:
  virtual void writeStartElement(::java::lang::String *);
  virtual void writeStartElement(::java::lang::String *, ::java::lang::String *);
public: // actually protected
  virtual ::java::lang::String * createPrefix(::java::lang::String *);
public:
  virtual void writeStartElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void writeEmptyElement(::java::lang::String *, ::java::lang::String *);
  virtual void writeEmptyElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void writeEmptyElement(::java::lang::String *);
  virtual void writeEndElement();
  virtual void writeEndDocument();
  virtual void close();
  virtual void flush();
  virtual void writeAttribute(::java::lang::String *, ::java::lang::String *);
  virtual void writeAttribute(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void writeAttribute(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void writeNamespace(::java::lang::String *, ::java::lang::String *);
private:
  void writeNamespaceImpl(::java::lang::String *, ::java::lang::String *);
public:
  virtual void writeDefaultNamespace(::java::lang::String *);
  virtual void writeComment(::java::lang::String *);
  virtual void writeProcessingInstruction(::java::lang::String *);
  virtual void writeProcessingInstruction(::java::lang::String *, ::java::lang::String *);
  virtual void writeCData(::java::lang::String *);
  virtual void writeDTD(::java::lang::String *);
  virtual void writeEntityRef(::java::lang::String *);
  virtual void writeStartDocument();
  virtual void writeStartDocument(::java::lang::String *);
  virtual void writeStartDocument(::java::lang::String *, ::java::lang::String *);
  virtual void writeCharacters(::java::lang::String *);
  virtual void writeCharacters(JArray< jchar > *, jint, jint);
  virtual ::java::lang::String * getPrefix(::java::lang::String *);
  virtual void setPrefix(::java::lang::String *, ::java::lang::String *);
  virtual void setDefaultNamespace(::java::lang::String *);
  virtual void setNamespaceContext(::javax::xml::namespace$::NamespaceContext *);
  virtual ::javax::xml::namespace$::NamespaceContext * getNamespaceContext();
  virtual ::java::lang::Object * getProperty(::java::lang::String *);
private:
  void writeEncoded(::java::lang::String *, jboolean);
  void writeEncodedWithRestrictedChars(::java::lang::String *, jboolean);
  jboolean isName(::java::lang::String *);
  jboolean isPrefix(::java::lang::String *);
  jboolean isNCName(::java::lang::String *);
  jboolean isChars(::java::lang::String *);
  jboolean isURI(::java::lang::String *);
public: // actually protected
  ::java::io::Writer * __attribute__((aligned(__alignof__( ::java::lang::Object)))) writer;
  ::java::lang::String * encoding;
  jboolean prefixDefaulting;
  ::javax::xml::namespace$::NamespaceContext * namespaceContext;
private:
  ::java::util::LinkedList * elements;
  jboolean inStartElement;
  jboolean emptyElement;
  ::org::xml::sax::helpers::NamespaceSupport * namespaces;
  jint count;
  jboolean xml11;
  jboolean hasXML11RestrictedChars;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_stream_XMLStreamWriterImpl__
