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

#ifndef __gnu_xml_util_XCat__
#define __gnu_xml_util_XCat__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace util
      {
          class XCat;
          class XCat$Catalog;
      }
    }
  }
  namespace org
  {
    namespace xml
    {
      namespace sax
      {
          class ErrorHandler;
          class InputSource;
      }
    }
  }
}

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

public:
  XCat();
  XCat(::java::lang::String *);
  virtual void loadCatalog(::java::lang::String *);
  virtual ::org::xml::sax::InputSource * resolveEntity(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual ::org::xml::sax::InputSource * getExternalSubset(::java::lang::String *, ::java::lang::String *);
  virtual ::org::xml::sax::InputSource * resolveEntity(::java::lang::String *, ::java::lang::String *);
  virtual ::org::xml::sax::InputSource * resolveURI(::java::lang::String *, ::java::lang::String *);
  virtual void disableLoading();
  virtual ::org::xml::sax::ErrorHandler * getErrorHandler();
  virtual void setErrorHandler(::org::xml::sax::ErrorHandler *);
  virtual ::java::lang::String * getParserClass();
  virtual void setParserClass(::java::lang::String *);
  virtual jboolean isUnified();
  virtual void setUnified(jboolean);
  virtual jboolean isUsingPublic();
  virtual void setUsingPublic(jboolean);
private:
  static ::gnu::xml::util::XCat$Catalog * loadCatalog(::java::lang::String *, ::org::xml::sax::ErrorHandler *, ::java::lang::String *, jboolean);
  static ::java::lang::String * normalizePublicId(jboolean, ::java::lang::String *);
  static jboolean isUriExcluded(jint);
  static jint hexNibble(jint);
  static ::java::lang::String * normalizeURI(::java::lang::String *);
public: // actually package-private
  static ::java::lang::String * access$0(jboolean, ::java::lang::String *);
  static ::java::lang::String * access$1(::java::lang::String *);
  static ::gnu::xml::util::XCat$Catalog * access$2(::java::lang::String *, ::org::xml::sax::ErrorHandler *, ::java::lang::String *, jboolean);
private:
  JArray< ::gnu::xml::util::XCat$Catalog * > * __attribute__((aligned(__alignof__( ::java::lang::Object)))) catalogs;
  jboolean usingPublic;
  jboolean loadingPermitted;
  jboolean unified;
  ::java::lang::String * parserClass;
  ::org::xml::sax::ErrorHandler * errorHandler;
  static ::java::lang::String * catalogNamespace;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_util_XCat__
