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

#ifndef __gnu_xml_stream_EntityDeclarationImpl__
#define __gnu_xml_stream_EntityDeclarationImpl__

#pragma interface

#include <gnu/xml/stream/XMLEventImpl.h>
extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace stream
      {
          class EntityDeclarationImpl;
      }
    }
  }
  namespace javax
  {
    namespace xml
    {
      namespace stream
      {
          class Location;
      }
    }
  }
}

class gnu::xml::stream::EntityDeclarationImpl : public ::gnu::xml::stream::XMLEventImpl
{

public: // actually protected
  EntityDeclarationImpl(::javax::xml::stream::Location *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
public:
  virtual jint getEventType();
  virtual ::java::lang::String * getPublicId();
  virtual ::java::lang::String * getSystemId();
  virtual ::java::lang::String * getName();
  virtual ::java::lang::String * getNotationName();
  virtual ::java::lang::String * getReplacementText();
  virtual ::java::lang::String * getBaseURI();
  virtual void writeAsEncodedUnicode(::java::io::Writer *);
public: // actually protected
  ::java::lang::String * __attribute__((aligned(__alignof__( ::gnu::xml::stream::XMLEventImpl)))) publicId;
  ::java::lang::String * systemId;
  ::java::lang::String * name;
  ::java::lang::String * notationName;
  ::java::lang::String * replacementText;
  ::java::lang::String * baseUri;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_stream_EntityDeclarationImpl__
