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

#ifndef __java_util_zip_ZipEntry__
#define __java_util_zip_ZipEntry__

#pragma interface

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


class java::util::zip::ZipEntry : public ::java::lang::Object
{

public:
  ZipEntry(::java::lang::String *);
  ZipEntry(::java::util::zip::ZipEntry *);
public: // actually package-private
  ZipEntry(::java::util::zip::ZipEntry *, ::java::lang::String *);
  virtual void setDOSTime(jint);
  virtual jint getDOSTime();
public:
  virtual ::java::lang::Object * clone();
  virtual ::java::lang::String * getName();
  virtual void setTime(jlong);
  virtual jlong getTime();
  virtual void setSize(jlong);
  virtual jlong getSize();
  virtual void setCompressedSize(jlong);
  virtual jlong getCompressedSize();
  virtual void setCrc(jlong);
  virtual jlong getCrc();
  virtual void setMethod(jint);
  virtual jint getMethod();
  virtual void setExtra(JArray< jbyte > *);
private:
  void parseExtra();
public:
  virtual JArray< jbyte > * getExtra();
  virtual void setComment(::java::lang::String *);
  virtual ::java::lang::String * getComment();
  virtual jboolean isDirectory();
  virtual ::java::lang::String * toString();
  virtual jint hashCode();
private:
  static const jbyte KNOWN_SIZE = 1;
  static const jbyte KNOWN_CSIZE = 2;
  static const jbyte KNOWN_CRC = 4;
  static const jbyte KNOWN_TIME = 8;
  static const jbyte KNOWN_DOSTIME = 16;
  static const jbyte KNOWN_EXTRA = 32;
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) name;
  jint size;
  jlong compressedSize;
  jint crc;
  ::java::lang::String * comment;
  jbyte method;
  jbyte known;
  jint dostime;
  jlong time;
  JArray< jbyte > * extra;
public: // actually package-private
  jint flags;
  jint offset;
public:
  static const jint STORED = 0;
  static const jint DEFLATED = 8;
  static ::java::lang::Class class$;
};

#endif // __java_util_zip_ZipEntry__
