1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43:
44:
52: public class ZipEntry implements ZipConstants, Cloneable
53: {
54: private static final int KNOWN_SIZE = 1;
55: private static final int KNOWN_CSIZE = 2;
56: private static final int KNOWN_CRC = 4;
57: private static final int KNOWN_TIME = 8;
58: private static final int KNOWN_EXTRA = 16;
59:
60: private static Calendar cal;
61:
62: private String name;
63: private int size;
64: private long compressedSize = -1;
65: private int crc;
66: private int dostime;
67: private short known = 0;
68: private short method = -1;
69: private byte[] extra = null;
70: private String comment = null;
71:
72: int flags;
73: int offset;
74:
75:
78: public static final int STORED = 0;
79:
82: public static final int DEFLATED = 8;
83:
84:
92: public ZipEntry(String name)
93: {
94: int length = name.length();
95: if (length > 65535)
96: throw new IllegalArgumentException("name length is " + length);
97: this.name = name;
98: }
99:
100:
104: public ZipEntry(ZipEntry e)
105: {
106: this(e, e.name);
107: }
108:
109: ZipEntry(ZipEntry e, String name)
110: {
111: this.name = name;
112: known = e.known;
113: size = e.size;
114: compressedSize = e.compressedSize;
115: crc = e.crc;
116: dostime = e.dostime;
117: method = e.method;
118: extra = e.extra;
119: comment = e.comment;
120: }
121:
122: final void setDOSTime(int dostime)
123: {
124: this.dostime = dostime;
125: known |= KNOWN_TIME;
126: }
127:
128: final int getDOSTime()
129: {
130: if ((known & KNOWN_TIME) == 0)
131: return 0;
132: else
133: return dostime;
134: }
135:
136:
139:
142: public Object clone()
143: {
144: try
145: {
146:
147: ZipEntry clone = (ZipEntry) super.clone();
148: if (extra != null)
149: clone.extra = (byte[]) extra.clone();
150: return clone;
151: }
152: catch (CloneNotSupportedException ex)
153: {
154: throw new InternalError();
155: }
156: }
157:
158:
162: public String getName()
163: {
164: return name;
165: }
166:
167:
171: public void setTime(long time)
172: {
173: Calendar cal = getCalendar();
174: synchronized (cal)
175: {
176: cal.setTime(new Date(time));
177: dostime = (cal.get(Calendar.YEAR) - 1980 & 0x7f) << 25
178: | (cal.get(Calendar.MONTH) + 1) << 21
179: | (cal.get(Calendar.DAY_OF_MONTH)) << 16
180: | (cal.get(Calendar.HOUR_OF_DAY)) << 11
181: | (cal.get(Calendar.MINUTE)) << 5
182: | (cal.get(Calendar.SECOND)) >> 1;
183: }
184: this.known |= KNOWN_TIME;
185: }
186:
187:
191: public long getTime()
192: {
193: if ((known & KNOWN_TIME) == 0)
194: return -1;
195:
196:
197: parseExtra ();
198:
199: int sec = 2 * (dostime & 0x1f);
200: int min = (dostime >> 5) & 0x3f;
201: int hrs = (dostime >> 11) & 0x1f;
202: int day = (dostime >> 16) & 0x1f;
203: int mon = ((dostime >> 21) & 0xf) - 1;
204: int year = ((dostime >> 25) & 0x7f) + 1980;
205:
206: try
207: {
208: cal = getCalendar();
209: synchronized (cal)
210: {
211: cal.set(year, mon, day, hrs, min, sec);
212: return cal.getTime().getTime();
213: }
214: }
215: catch (RuntimeException ex)
216: {
217:
218: known &= ~KNOWN_TIME;
219: return -1;
220: }
221: }
222:
223: private static synchronized Calendar getCalendar()
224: {
225: if (cal == null)
226: cal = Calendar.getInstance();
227:
228: return cal;
229: }
230:
231:
235: public void setSize(long size)
236: {
237: if ((size & 0xffffffff00000000L) != 0)
238: throw new IllegalArgumentException();
239: this.size = (int) size;
240: this.known |= KNOWN_SIZE;
241: }
242:
243:
247: public long getSize()
248: {
249: return (known & KNOWN_SIZE) != 0 ? size & 0xffffffffL : -1L;
250: }
251:
252:
255: public void setCompressedSize(long csize)
256: {
257: this.compressedSize = csize;
258: }
259:
260:
264: public long getCompressedSize()
265: {
266: return compressedSize;
267: }
268:
269:
273: public void setCrc(long crc)
274: {
275: if ((crc & 0xffffffff00000000L) != 0)
276: throw new IllegalArgumentException();
277: this.crc = (int) crc;
278: this.known |= KNOWN_CRC;
279: }
280:
281:
285: public long getCrc()
286: {
287: return (known & KNOWN_CRC) != 0 ? crc & 0xffffffffL : -1L;
288: }
289:
290:
297: public void setMethod(int method)
298: {
299: if (method != ZipOutputStream.STORED
300: && method != ZipOutputStream.DEFLATED)
301: throw new IllegalArgumentException();
302: this.method = (short) method;
303: }
304:
305:
309: public int getMethod()
310: {
311: return method;
312: }
313:
314:
318: public void setExtra(byte[] extra)
319: {
320: if (extra == null)
321: {
322: this.extra = null;
323: return;
324: }
325: if (extra.length > 0xffff)
326: throw new IllegalArgumentException();
327: this.extra = extra;
328: }
329:
330: private void parseExtra()
331: {
332:
333: if ((known & KNOWN_EXTRA) != 0)
334: return;
335:
336: if (extra == null)
337: {
338: known |= KNOWN_EXTRA;
339: return;
340: }
341:
342: try
343: {
344: int pos = 0;
345: while (pos < extra.length)
346: {
347: int sig = (extra[pos++] & 0xff)
348: | (extra[pos++] & 0xff) << 8;
349: int len = (extra[pos++] & 0xff)
350: | (extra[pos++] & 0xff) << 8;
351: if (sig == 0x5455)
352: {
353:
354: int flags = extra[pos];
355: if ((flags & 1) != 0)
356: {
357: long time = ((extra[pos+1] & 0xff)
358: | (extra[pos+2] & 0xff) << 8
359: | (extra[pos+3] & 0xff) << 16
360: | (extra[pos+4] & 0xff) << 24);
361: setTime(time);
362: }
363: }
364: pos += len;
365: }
366: }
367: catch (ArrayIndexOutOfBoundsException ex)
368: {
369:
370: return;
371: }
372:
373: known |= KNOWN_EXTRA;
374: }
375:
376:
380: public byte[] getExtra()
381: {
382: return extra;
383: }
384:
385:
389: public void setComment(String comment)
390: {
391: if (comment != null && comment.length() > 0xffff)
392: throw new IllegalArgumentException();
393: this.comment = comment;
394: }
395:
396:
400: public String getComment()
401: {
402: return comment;
403: }
404:
405:
409: public boolean isDirectory()
410: {
411: int nlen = name.length();
412: return nlen > 0 && name.charAt(nlen - 1) == '/';
413: }
414:
415:
419: public String toString()
420: {
421: return name;
422: }
423:
424:
428: public int hashCode()
429: {
430: return name.hashCode();
431: }
432: }