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

#ifndef __gnu_java_beans_decoder_DummyHandler__
#define __gnu_java_beans_decoder_DummyHandler__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace beans
      {
        namespace decoder
        {
            class Context;
            class DummyHandler;
            class ElementHandler;
        }
      }
    }
  }
  namespace java
  {
    namespace beans
    {
        class ExceptionListener;
    }
  }
  namespace org
  {
    namespace xml
    {
      namespace sax
      {
          class Attributes;
      }
    }
  }
}

class gnu::java::beans::decoder::DummyHandler : public ::java::lang::Object
{

public: // actually package-private
  DummyHandler();
public:
  virtual void start(::org::xml::sax::Attributes *, ::java::beans::ExceptionListener *);
  virtual void end(::java::beans::ExceptionListener *);
  virtual void characters(JArray< jchar > *, jint, jint);
  virtual jboolean isSubelementAllowed(::java::lang::String *);
  virtual ::java::lang::Class * instantiateClass(::java::lang::String *);
  virtual void notifyStatement(::java::beans::ExceptionListener *);
  virtual jboolean hasFailed();
  virtual ::gnu::java::beans::decoder::Context * getContext();
  virtual void notifyContextFailed();
  virtual void putObject(::java::lang::String *, ::java::lang::Object *);
  virtual ::java::lang::Object * getObject(::java::lang::String *);
  virtual ::gnu::java::beans::decoder::ElementHandler * getParent();
private:
  void fail();
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_beans_decoder_DummyHandler__
