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

#ifndef __java_util_logging_Handler__
#define __java_util_logging_Handler__

#pragma interface

#include <java/lang/Object.h>

class java::util::logging::Handler : public ::java::lang::Object
{

public: // actually protected
  Handler();
public:
  virtual void publish(::java::util::logging::LogRecord *) = 0;
  virtual void flush() = 0;
  virtual void close() = 0;
  virtual ::java::util::logging::Formatter * getFormatter();
  virtual void setFormatter(::java::util::logging::Formatter *);
  virtual ::java::lang::String * getEncoding();
  virtual void setEncoding(::java::lang::String *);
  virtual ::java::util::logging::Filter * getFilter();
  virtual void setFilter(::java::util::logging::Filter *);
  virtual ::java::util::logging::ErrorManager * getErrorManager();
  virtual void setErrorManager(::java::util::logging::ErrorManager *);
public: // actually protected
  virtual void reportError(::java::lang::String *, ::java::lang::Exception *, jint);
public:
  virtual ::java::util::logging::Level * getLevel();
  virtual void setLevel(::java::util::logging::Level *);
  virtual jboolean isLoggable(::java::util::logging::LogRecord *);
public: // actually package-private
  ::java::util::logging::Formatter * __attribute__((aligned(__alignof__( ::java::lang::Object)))) formatter;
  ::java::util::logging::Filter * filter;
  ::java::util::logging::Level * level;
  ::java::util::logging::ErrorManager * errorManager;
  ::java::lang::String * encoding;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_logging_Handler__
