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

#ifndef __java_io_File__
#define __java_io_File__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace net
    {
        class URI;
        class URL;
    }
  }
}

class java::io::File : public ::java::lang::Object
{

  jlong attr(jint);
  jboolean access(jint);
  jboolean stat(jint);
  static void init_native();
public:
  virtual jboolean canRead();
  virtual jboolean canWrite();
  virtual jboolean canExecute();
private:
  jboolean performCreate();
public:
  virtual jboolean createNewFile();
private:
  jboolean performDelete();
public:
  virtual jboolean delete$();
  virtual jboolean equals(::java::lang::Object *);
private:
  jboolean internalExists();
public:
  virtual jboolean exists();
  File(::java::lang::String *);
private:
  ::java::lang::String * normalizePath(::java::lang::String *);
public:
  File(::java::lang::String *, ::java::lang::String *);
  File(::java::io::File *, ::java::lang::String *);
  File(::java::net::URI *);
  virtual ::java::lang::String * getAbsolutePath();
  virtual ::java::io::File * getAbsoluteFile();
  virtual ::java::lang::String * getCanonicalPath();
  virtual ::java::io::File * getCanonicalFile();
  virtual ::java::lang::String * getName();
  virtual ::java::lang::String * getParent();
  virtual ::java::io::File * getParentFile();
  virtual ::java::lang::String * getPath();
  virtual jint hashCode();
  virtual jboolean isAbsolute();
private:
  jboolean internalIsDirectory();
public:
  virtual jboolean isDirectory();
  virtual jboolean isFile();
  virtual jboolean isHidden();
  virtual jlong lastModified();
  virtual jlong length();
private:
  JArray< ::java::lang::Object * > * performList(::java::io::FilenameFilter *, ::java::io::FileFilter *, ::java::lang::Class *);
public:
  virtual JArray< ::java::lang::String * > * list(::java::io::FilenameFilter *);
  virtual JArray< ::java::lang::String * > * list();
  virtual JArray< ::java::io::File * > * listFiles();
  virtual JArray< ::java::io::File * > * listFiles(::java::io::FilenameFilter *);
  virtual JArray< ::java::io::File * > * listFiles(::java::io::FileFilter *);
  virtual ::java::lang::String * toString();
  virtual ::java::net::URI * toURI();
  virtual ::java::net::URL * toURL();
private:
  jboolean performMkdir();
public:
  virtual jboolean mkdir();
private:
  static jboolean mkdirs(::java::io::File *);
public:
  virtual jboolean mkdirs();
private:
  static ::java::lang::String * nextValue();
public:
  static ::java::io::File * createTempFile(::java::lang::String *, ::java::lang::String *, ::java::io::File *);
private:
  jboolean setFilePermissions(jboolean, jboolean, jint);
public:
  virtual jboolean setReadable(jboolean);
  virtual jboolean setReadable(jboolean, jboolean);
  virtual jboolean setWritable(jboolean);
  virtual jboolean setWritable(jboolean, jboolean);
  virtual jboolean setExecutable(jboolean);
  virtual jboolean setExecutable(jboolean, jboolean);
private:
  jboolean performSetReadOnly();
public:
  virtual jboolean setReadOnly();
private:
  static JArray< ::java::io::File * > * performListRoots();
public:
  static JArray< ::java::io::File * > * listRoots();
  static ::java::io::File * createTempFile(::java::lang::String *, ::java::lang::String *);
  virtual jint File$compareTo(::java::io::File *);
private:
  jboolean performRenameTo(::java::io::File *);
public:
  virtual jboolean renameTo(::java::io::File *);
private:
  jboolean performSetLastModified(jlong);
public:
  virtual jboolean setLastModified(jlong);
private:
  void checkWrite();
  void checkRead();
  void checkExec();
public:
  virtual void deleteOnExit();
private:
  void writeObject(::java::io::ObjectOutputStream *);
  void readObject(::java::io::ObjectInputStream *);
public:
  virtual jint compareTo(::java::lang::Object *);
private:
  static const jlong serialVersionUID = 301077366599181567LL;
  static const jint READ = 0;
  static const jint WRITE = 1;
  static const jint EXISTS = 2;
  static const jint EXEC = 3;
  static const jint DIRECTORY = 0;
  static const jint ISFILE = 1;
  static const jint ISHIDDEN = 2;
  static const jint MODIFIED = 0;
  static const jint LENGTH = 1;
public:
  static ::java::lang::String * separator;
private:
  static ::java::lang::String * dupSeparator;
public:
  static jchar separatorChar;
  static ::java::lang::String * pathSeparator;
  static jchar pathSeparatorChar;
public: // actually package-private
  static ::java::lang::String * tmpdir;
  static jint maxPathLen;
  static jboolean caseSensitive;
private:
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) path;
  static jlong counter;
public:
  static ::java::lang::Class class$;
};

#endif // __java_io_File__
