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

#ifndef __gnu_xml_stream_XMLParser$Input__
#define __gnu_xml_stream_XMLParser$Input__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace stream
      {
          class UnicodeReader;
          class XMLParser$Input;
      }
    }
  }
}

class gnu::xml::stream::XMLParser$Input : public ::java::lang::Object
{

public: // actually package-private
  XMLParser$Input(::java::io::InputStream *, ::java::io::Reader *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, jboolean, jboolean);
public:
  virtual jint getCharacterOffset();
  virtual jint getColumnNumber();
  virtual jint getLineNumber();
  virtual ::java::lang::String * getPublicId();
  virtual ::java::lang::String * getSystemId();
public: // actually package-private
  virtual void init();
  virtual void mark(jint);
  virtual jint read();
  virtual jint read(JArray< jint > *, jint, jint);
  virtual void reset();
private:
  void detectEncoding();
  static jboolean equals(JArray< jint > *, JArray< jint > *);
public: // actually package-private
  virtual void setInputEncoding(::java::lang::String *);
  virtual void finalizeEncoding();
  jint __attribute__((aligned(__alignof__( ::java::lang::Object)))) line;
  jint markLine;
  jint column;
  jint markColumn;
  jint offset;
  jint markOffset;
  ::java::lang::String * publicId;
  ::java::lang::String * systemId;
  ::java::lang::String * name;
  jboolean report;
  jboolean normalize;
  ::java::io::InputStream * in;
  ::java::io::Reader * reader;
  ::gnu::xml::stream::UnicodeReader * unicodeReader;
  jboolean initialized;
  jboolean encodingDetected;
  ::java::lang::String * inputEncoding;
  jboolean xml11;
private:
  static JArray< jint > * SIGNATURE_UCS_4_1234;
  static JArray< jint > * SIGNATURE_UCS_4_4321;
  static JArray< jint > * SIGNATURE_UCS_4_2143;
  static JArray< jint > * SIGNATURE_UCS_4_3412;
  static JArray< jint > * SIGNATURE_UCS_2_12;
  static JArray< jint > * SIGNATURE_UCS_2_21;
  static JArray< jint > * SIGNATURE_UCS_2_12_NOBOM;
  static JArray< jint > * SIGNATURE_UCS_2_21_NOBOM;
  static JArray< jint > * SIGNATURE_UTF_8;
  static JArray< jint > * SIGNATURE_UTF_8_BOM;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_stream_XMLParser$Input__
