11package software .coley .llzip .part ;
22
3+ import software .coley .llzip .ZipCompressions ;
34import software .coley .llzip .util .ByteData ;
45
56import java .util .NavigableSet ;
1415 */
1516public class JvmLocalFileHeader extends LocalFileHeader {
1617 private final NavigableSet <Long > offsets ;
18+ private long offset ;
19+ private boolean foundPk ;
20+ private ByteData data ;
1721
1822 /**
1923 * @param offsets
@@ -27,12 +31,30 @@ public JvmLocalFileHeader(NavigableSet<Long> offsets) {
2731 public void read (ByteData data , long offset ) {
2832 super .read (data , offset );
2933 // JVM file data reading does NOT use the compressed/uncompressed fields.
30- // Instead, it scans data until the next header/EOF .
34+ // Instead, it scans data until the next header.
3135 offset += MIN_FIXED_SIZE + getFileNameLength () + getExtraFieldLength ();
36+ this .offset = offset ;
3237 Long nextOffset = offsets .ceiling (offset );
33- if (nextOffset != null )
38+ if (nextOffset != null ) {
3439 setFileData (data .slice (offset , nextOffset ));
35- else
36- setFileData (data .slice (offset , data .length ()));
40+ foundPk = true ;
41+ } else {
42+ this .data = data ;
43+ }
44+ }
45+
46+ @ Override
47+ public void link (CentralDirectoryFileHeader directoryFileHeader ) {
48+ super .link (directoryFileHeader );
49+ if (!foundPk ) {
50+ int fileDataLength ;
51+ if (getCompressionMethod () == ZipCompressions .STORED ) {
52+ fileDataLength = directoryFileHeader .getUncompressedSize ();
53+ } else {
54+ fileDataLength = directoryFileHeader .getCompressedSize ();
55+ }
56+ setFileData (data .sliceOf (offset , fileDataLength ));
57+ data = null ;
58+ }
3759 }
3860}
0 commit comments