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

#ifndef __java_util_logging_FileHandler__
#define __java_util_logging_FileHandler__

#pragma interface

#include <java/util/logging/StreamHandler.h>

class java::util::logging::FileHandler : public ::java::util::logging::StreamHandler
{

public:
  FileHandler();
  FileHandler(::java::lang::String *);
  FileHandler(::java::lang::String *, jboolean);
  FileHandler(::java::lang::String *, jint, jint);
  FileHandler(::java::lang::String *, jint, jint, jboolean);
private:
  ::java::io::OutputStream * createFileStream(::java::lang::String *, jint, jint, jboolean, jint);
  static ::java::lang::String * replaceFileNameEscapes(::java::lang::String *, jint, jint, jint);
public:
  virtual void publish(::java::util::logging::LogRecord *);
private:
  void rotate();
  static jboolean has(::java::lang::String *, jchar);
  static ::java::lang::String * PROPERTY_PREFIX;
  static ::java::lang::String * PATTERN_KEY;
  static ::java::lang::String * DEFAULT_PATTERN;
  static ::java::lang::String * LIMIT_KEY;
  static const jint DEFAULT_LIMIT = 0;
  static ::java::lang::String * COUNT_KEY;
  static const jint DEFAULT_COUNT = 1;
  static ::java::lang::String * APPEND_KEY;
  static const jboolean DEFAULT_APPEND = 0;
  jint __attribute__((aligned(__alignof__( ::java::util::logging::StreamHandler)))) limit;
  jint count;
  ::java::lang::String * pattern;
  jboolean append;
public: // actually package-private
  jlong written;
private:
  ::java::util::LinkedList * logFiles;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_logging_FileHandler__
