OSDN Git Service

Add new source files
[armadillo/armadillo1.git] / src / jp / sfjp / armadillo / archive / zip / ZipEndEntry.java
1 package jp.sfjp.armadillo.archive.zip;
2
3 import java.io.*;
4 import java.util.*;
5 import java.util.zip.*;
6 import jp.sfjp.armadillo.io.*;
7
8 final class ZipEndEntry {
9
10     int signature;
11     short disknum;
12     short disknumCEN;
13     short countDiskCENs;
14     short countCENs;
15     int sizeCENs;
16     int offsetStartCEN;
17     short commentlen;
18     byte[] comment;
19
20     static ZipEndEntry create(long offset, List<ZipEntry> entries) throws IOException {
21         // End of central dir header (END)
22         final int signature; // end of central dir signature
23         final short disknum; // number of this disk
24         final short disknumCEN; // number of the disk with the start of the central directory
25         final short countDiskCENs; // total number of entries in the central directory on this disk
26         final short countCENs; // total number of entries in the central directory
27         final int sizeCENs; // size of the central directory
28         final int offsetStartCEN; // offset of start of central directory with respect to the starting disk number
29         final short commentlen; // .ZIP file comment length
30         final byte[] comment; // .ZIP file comment
31         // ---
32         final int iEntryCount = entries.size();
33         if (iEntryCount > 0xFFFF)
34             throw new ZipException("overflow: entry-count=" + iEntryCount);
35         final short entryCount = (short)(iEntryCount & 0xFFFF);
36         if (offset > 0xFFFFFFFFL)
37             throw new ZipException("overflow: offset=" + offset);
38         assert offset >= 0L;
39         final long p = offset;
40         ZipHeader header = new ZipHeader();
41         VolumetricOutputStream vos = new VolumetricOutputStream();
42         for (final ZipEntry entry : entries)
43             header.writeCEN(vos, entry);
44         final long lsizeCENs = vos.getSize();
45         if (lsizeCENs > 0xFFFFFFFFL)
46             throw new ZipException("overflow: size of CEN headers=" + lsizeCENs);
47         // ... prepared
48         signature = ZipHeader.SIGN_END;
49         disknum = 0; // not supported
50         disknumCEN = 0; // not supported
51         countDiskCENs = entryCount; // ignore disk number
52         countCENs = entryCount;
53         sizeCENs = (int)(lsizeCENs & 0xFFFFFFFFL);
54         offsetStartCEN = (int)(p & 0xFFFFFFFF);
55         commentlen = 0; // not supported
56         comment = new byte[0]; // not supported
57         ZipEndEntry entry = new ZipEndEntry();
58         entry.signature = signature;
59         entry.disknum = disknum;
60         entry.disknumCEN = disknumCEN;
61         entry.countDiskCENs = countDiskCENs;
62         entry.countCENs = countCENs;
63         entry.sizeCENs = sizeCENs;
64         entry.offsetStartCEN = offsetStartCEN;
65         entry.commentlen = commentlen;
66         entry.comment = comment;
67         return entry;
68     }
69
70 }