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

#ifndef __org_xml_sax_helpers_ParserAdapter__
#define __org_xml_sax_helpers_ParserAdapter__

#pragma interface

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

extern "Java"
{
  namespace org
  {
    namespace xml
    {
      namespace sax
      {
          class AttributeList;
          class ContentHandler;
          class DTDHandler;
          class EntityResolver;
          class ErrorHandler;
          class InputSource;
          class Locator;
          class Parser;
          class SAXParseException;
        namespace helpers
        {
            class AttributesImpl;
            class NamespaceSupport;
            class ParserAdapter;
            class ParserAdapter$AttributeListAdapter;
        }
      }
    }
  }
}

class org::xml::sax::helpers::ParserAdapter : public ::java::lang::Object
{

public:
  ParserAdapter();
  ParserAdapter(::org::xml::sax::Parser *);
private:
  void setup(::org::xml::sax::Parser *);
public:
  virtual void setFeature(::java::lang::String *, jboolean);
  virtual jboolean getFeature(::java::lang::String *);
  virtual void setProperty(::java::lang::String *, ::java::lang::Object *);
  virtual ::java::lang::Object * getProperty(::java::lang::String *);
  virtual void setEntityResolver(::org::xml::sax::EntityResolver *);
  virtual ::org::xml::sax::EntityResolver * getEntityResolver();
  virtual void setDTDHandler(::org::xml::sax::DTDHandler *);
  virtual ::org::xml::sax::DTDHandler * getDTDHandler();
  virtual void setContentHandler(::org::xml::sax::ContentHandler *);
  virtual ::org::xml::sax::ContentHandler * getContentHandler();
  virtual void setErrorHandler(::org::xml::sax::ErrorHandler *);
  virtual ::org::xml::sax::ErrorHandler * getErrorHandler();
  virtual void parse(::java::lang::String *);
  virtual void parse(::org::xml::sax::InputSource *);
  virtual void setDocumentLocator(::org::xml::sax::Locator *);
  virtual void startDocument();
  virtual void endDocument();
  virtual void startElement(::java::lang::String *, ::org::xml::sax::AttributeList *);
  virtual void endElement(::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 *);
private:
  void setupParser();
  JArray< ::java::lang::String * > * processName(::java::lang::String *, jboolean, jboolean);
public: // actually package-private
  virtual void reportError(::java::lang::String *);
private:
  ::org::xml::sax::SAXParseException * makeException(::java::lang::String *);
  void checkNotParsing(::java::lang::String *, ::java::lang::String *);
public: // actually package-private
  static ::org::xml::sax::helpers::AttributesImpl * access$0(::org::xml::sax::helpers::ParserAdapter *);
private:
  static ::java::lang::String * FEATURES;
  static ::java::lang::String * NAMESPACES;
  static ::java::lang::String * NAMESPACE_PREFIXES;
  static ::java::lang::String * XMLNS_URIs;
  ::org::xml::sax::helpers::NamespaceSupport * __attribute__((aligned(__alignof__( ::java::lang::Object)))) nsSupport;
  ::org::xml::sax::helpers::ParserAdapter$AttributeListAdapter * attAdapter;
  jboolean parsing;
  JArray< ::java::lang::String * > * nameParts;
  ::org::xml::sax::Parser * parser;
  ::org::xml::sax::helpers::AttributesImpl * atts;
  jboolean namespaces;
  jboolean prefixes;
  jboolean uris;
public: // actually package-private
  ::org::xml::sax::Locator * locator;
  ::org::xml::sax::EntityResolver * entityResolver;
  ::org::xml::sax::DTDHandler * dtdHandler;
  ::org::xml::sax::ContentHandler * contentHandler;
  ::org::xml::sax::ErrorHandler * errorHandler;
public:
  static ::java::lang::Class class$;
};

#endif // __org_xml_sax_helpers_ParserAdapter__
