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

#ifndef __gnu_xml_stream_XIncludeFilter__
#define __gnu_xml_stream_XIncludeFilter__

#pragma interface

#include <javax/xml/stream/util/ReaderDelegate.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace stream
      {
          class XIncludeFilter;
      }
    }
  }
  namespace java
  {
    namespace net
    {
        class URLConnection;
    }
  }
  namespace javax
  {
    namespace xml
    {
      namespace namespace
      {
          class QName;
      }
      namespace parsers
      {
          class DocumentBuilder;
      }
      namespace stream
      {
          class XMLStreamReader;
      }
    }
  }
  namespace org
  {
    namespace w3c
    {
      namespace dom
      {
          class Document;
          class Node;
        namespace traversal
        {
            class DocumentTraversal;
            class TreeWalker;
        }
        namespace xpath
        {
            class XPathEvaluator;
            class XPathResult;
        }
      }
    }
  }
}

class gnu::xml::stream::XIncludeFilter : public ::javax::xml::stream::util::ReaderDelegate
{

public: // actually package-private
  XIncludeFilter(::javax::xml::stream::XMLStreamReader *, ::java::lang::String *, jboolean, jboolean, jboolean);
public:
  virtual jint getAttributeCount();
  virtual ::java::lang::String * getAttributeLocalName(jint);
  virtual ::java::lang::String * getAttributeNamespace(jint);
  virtual ::java::lang::String * getAttributePrefix(jint);
  virtual ::javax::xml::namespace::QName * getAttributeName(jint);
  virtual ::java::lang::String * getAttributeType(jint);
  virtual jboolean isAttributeSpecified(jint);
  virtual ::java::lang::String * getAttributeValue(jint);
  virtual ::java::lang::String * getAttributeValue(::java::lang::String *, ::java::lang::String *);
  virtual ::java::lang::String * getElementText();
  virtual jint getEventType();
  virtual ::java::lang::String * getLocalName();
  virtual ::javax::xml::namespace::QName * getName();
  virtual ::java::lang::String * getNamespaceURI();
  virtual ::java::lang::String * getPIData();
  virtual ::java::lang::String * getPITarget();
  virtual ::java::lang::String * getPrefix();
  virtual ::java::lang::String * getText();
  virtual JArray< jchar > * getTextCharacters();
  virtual jint getTextCharacters(jint, JArray< jchar > *, jint, jint);
  virtual jint getTextLength();
  virtual jint getTextStart();
  virtual jboolean hasNext();
  virtual jint next();
public: // actually package-private
  virtual jboolean isSpace(JArray< jchar > *, jint);
  virtual ::java::lang::String * getBaseURI();
  virtual jboolean includeResource(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual ::java::net::URLConnection * getURLConnection(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual ::org::w3c::dom::Document * getDocument(::org::w3c::dom::Node *);
  virtual ::javax::xml::parsers::DocumentBuilder * getDocumentBuilder();
  virtual ::org::w3c::dom::traversal::DocumentTraversal * getDocumentTraversal(::org::w3c::dom::Document *);
  virtual ::org::w3c::dom::xpath::XPathEvaluator * getXPathEvaluator(::org::w3c::dom::Document *);
  static ::java::lang::String * getParameter(::java::lang::String *, ::java::lang::String *);
  static ::java::lang::String * XINCLUDE_NS_URI;
  static const jint SHOW_FLAGS = 221;
  ::java::lang::String * __attribute__((aligned(__alignof__( ::javax::xml::stream::util::ReaderDelegate)))) systemId;
  jboolean namespaceAware;
  jboolean validating;
  jboolean expandERefs;
  ::java::lang::String * href;
  jint event;
  jboolean included;
  ::org::w3c::dom::xpath::XPathResult * result;
  jint snapshotIndex;
  ::org::w3c::dom::Node * current;
  ::org::w3c::dom::traversal::TreeWalker * walker;
  ::java::util::HashSet * seen;
  jboolean backtracking;
  jboolean lookahead;
  ::java::io::Reader * includedText;
  JArray< jchar > * buf;
  jint len;
  jboolean inInclude;
  jboolean inFallback;
  jboolean seenFallback;
  ::javax::xml::parsers::DocumentBuilder * builder;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_stream_XIncludeFilter__
