3939 */
4040public class LocalFileHeader extends AbstractZipFileHeader {
4141 protected static final int MIN_FIXED_SIZE = 30 ;
42- private transient CentralDirectoryFileHeader linkedDirectoryFileHeader ;
42+ protected transient CentralDirectoryFileHeader linkedDirectoryFileHeader ;
4343
4444 // LocalFileHeader spec (plus common elements between this and central file)
4545 protected LazyByteData fileData ;
@@ -76,18 +76,18 @@ public LocalFileHeader copy() {
7676 @ Override
7777 public void read (@ Nonnull ByteData data , long offset ) {
7878 super .read (data , offset );
79- versionNeededToExtract = ByteDataUtil .readLazyWord (data , offset , 4 );
80- generalPurposeBitFlag = ByteDataUtil .readLazyWord (data , offset , 6 );
81- compressionMethod = ByteDataUtil .readLazyWord (data , offset , 8 );
82- lastModFileTime = ByteDataUtil .readLazyWord (data , offset , 10 );
83- lastModFileDate = ByteDataUtil .readLazyWord (data , offset , 12 );
84- crc32 = ByteDataUtil .readLazyQuad (data , offset , 14 );
85- compressedSize = ByteDataUtil .readLazyMaskedLongQuad (data , offset , 18 );
86- uncompressedSize = ByteDataUtil .readLazyMaskedLongQuad (data , offset , 22 );
87- fileNameLength = ByteDataUtil .readLazyWord (data , offset , 26 );
88- extraFieldLength = ByteDataUtil .readLazyWord (data , offset , 28 );
89- fileName = ByteDataUtil .readLazySlice (data , offset , new LazyInt (() -> MIN_FIXED_SIZE ), fileNameLength );
90- extraField = ByteDataUtil .readLazySlice (data , offset , fileNameLength .add (MIN_FIXED_SIZE ), extraFieldLength );
79+ versionNeededToExtract = ByteDataUtil .readLazyWord (data , offset , 4 ). withId ( "versionNeededToExtract" ) ;
80+ generalPurposeBitFlag = ByteDataUtil .readLazyWord (data , offset , 6 ). withId ( "generalPurposeBitFlag" ) ;
81+ compressionMethod = ByteDataUtil .readLazyWord (data , offset , 8 ). withId ( "compressionMethod" ) ;
82+ lastModFileTime = ByteDataUtil .readLazyWord (data , offset , 10 ). withId ( "lastModFileTime" ) ;
83+ lastModFileDate = ByteDataUtil .readLazyWord (data , offset , 12 ). withId ( "lastModFileDate" ) ;
84+ crc32 = ByteDataUtil .readLazyQuad (data , offset , 14 ). withId ( "crc32" ) ;
85+ compressedSize = ByteDataUtil .readLazyMaskedLongQuad (data , offset , 18 ). withId ( "compressedSize" ) ;
86+ uncompressedSize = ByteDataUtil .readLazyMaskedLongQuad (data , offset , 22 ). withId ( "uncompressedSize" ) ;
87+ fileNameLength = ByteDataUtil .readLazyWord (data , offset , 26 ). withId ( "fileNameLength" ) ;
88+ extraFieldLength = ByteDataUtil .readLazyWord (data , offset , 28 ). withId ( "extraFieldLength" ) ;
89+ fileName = ByteDataUtil .readLazySlice (data , offset , new LazyInt (() -> MIN_FIXED_SIZE ), fileNameLength ). withId ( "fileName" ) ;
90+ extraField = ByteDataUtil .readLazySlice (data , offset , fileNameLength .add (MIN_FIXED_SIZE ), extraFieldLength ). withId ( "extraField" ) ;
9191 fileDataLength = new LazyLong (() -> {
9292 long fileDataLength ;
9393 if (compressionMethod .get () == STORED ) {
@@ -96,8 +96,9 @@ public void read(@Nonnull ByteData data, long offset) {
9696 fileDataLength = compressedSize .get ();
9797 }
9898 return fileDataLength ;
99- });
100- fileData = ByteDataUtil .readLazyLongSlice (data , offset , fileNameLength .add (extraFieldLength ).add (MIN_FIXED_SIZE ), fileDataLength );
99+ }).withId ("fileDataLength" );
100+ fileData = ByteDataUtil .readLazyLongSlice (data , offset ,
101+ fileNameLength .add (extraFieldLength ).add (MIN_FIXED_SIZE ), fileDataLength ).withId ("fileData" );
101102 }
102103
103104 /**
@@ -132,18 +133,22 @@ public boolean hasDifferentValuesThanCentralDirectoryHeader() {
132133 * which you may want to adopt.
133134 */
134135 public void adoptLinkedCentralDirectoryValues () {
135- if (data != null && linkedDirectoryFileHeader != null ) {
136- setVersionNeededToExtract (linkedDirectoryFileHeader .getVersionNeededToExtract ());
137- setGeneralPurposeBitFlag (linkedDirectoryFileHeader .getGeneralPurposeBitFlag ());
138- setCompressionMethod (linkedDirectoryFileHeader .getCompressionMethod ());
139- setLastModFileTime (linkedDirectoryFileHeader .getLastModFileTime ());
140- setLastModFileDate (linkedDirectoryFileHeader .getLastModFileDate ());
141- setCrc32 (linkedDirectoryFileHeader .getCrc32 ());
142- setCompressedSize (linkedDirectoryFileHeader .getCompressedSize ());
143- setUncompressedSize (linkedDirectoryFileHeader .getUncompressedSize ());
144- setFileNameLength (linkedDirectoryFileHeader .getFileNameLength ());
145- fileName = ByteDataUtil .readLazySlice (data , offset , new LazyInt (() -> MIN_FIXED_SIZE ), fileNameLength );
146- extraField = ByteDataUtil .readLazySlice (data , offset , fileNameLength .add (MIN_FIXED_SIZE ), extraFieldLength );
136+ if (linkedDirectoryFileHeader != null ) {
137+ versionNeededToExtract = linkedDirectoryFileHeader .versionNeededToExtract ;
138+ generalPurposeBitFlag = linkedDirectoryFileHeader .generalPurposeBitFlag ;
139+ compressionMethod = linkedDirectoryFileHeader .compressionMethod ;
140+ lastModFileTime = linkedDirectoryFileHeader .lastModFileTime ;
141+ lastModFileDate = linkedDirectoryFileHeader .lastModFileDate ;
142+ crc32 = linkedDirectoryFileHeader .crc32 ;
143+ compressedSize = linkedDirectoryFileHeader .compressedSize ;
144+ uncompressedSize = linkedDirectoryFileHeader .uncompressedSize ;
145+ fileNameLength = linkedDirectoryFileHeader .fileNameLength ;
146+ fileName = linkedDirectoryFileHeader .fileName ;
147+ extraField = linkedDirectoryFileHeader .extraField ;
148+ // We're using the same slices/data locations from the central directory.
149+ // If we wanted to use local data but with updated offsets from the central directory it would look like this:
150+ // fileName = ByteDataUtil.readLazySlice(data, offset, new LazyInt(() -> MIN_FIXED_SIZE), fileNameLength).withId("fileName");
151+ // extraField = ByteDataUtil.readLazySlice(data, offset, fileNameLength.add(MIN_FIXED_SIZE), extraFieldLength).withId("extraField");
147152 fileDataLength = new LazyLong (() -> {
148153 long fileDataLength ;
149154 if (compressionMethod .get () == STORED ) {
@@ -152,8 +157,9 @@ public void adoptLinkedCentralDirectoryValues() {
152157 fileDataLength = compressedSize .get ();
153158 }
154159 return fileDataLength ;
155- });
156- fileData = ByteDataUtil .readLazyLongSlice (data , offset , fileNameLength .add (extraFieldLength ).add (30 ), fileDataLength );
160+ }).withId ("fileDataLength" );
161+ if (data != null )
162+ fileData = ByteDataUtil .readLazyLongSlice (data , offset , fileNameLength .add (extraFieldLength ).add (MIN_FIXED_SIZE ), fileDataLength ).withId ("fileData" );
157163 }
158164 }
159165
@@ -163,7 +169,7 @@ public void adoptLinkedCentralDirectoryValues() {
163169 * @param endOffset New file data length.
164170 */
165171 public void setFileDataEndOffset (long endOffset ) {
166- long fileDataStartOffset = offset + fileNameLength .add (extraFieldLength ).add (30 ).get ();
172+ long fileDataStartOffset = offset + fileNameLength .add (extraFieldLength ).add (MIN_FIXED_SIZE ).get ();
167173 long length = endOffset - fileDataStartOffset ;
168174 setFileDataLength (length );
169175 }
@@ -173,15 +179,15 @@ public void setFileDataEndOffset(long endOffset) {
173179 */
174180 public void setFileDataLength (long newLength ) {
175181 fileDataLength .set (newLength );
176- fileData = ByteDataUtil .readLazyLongSlice (data , offset , fileNameLength .add (extraFieldLength ).add (30 ), newLength );
182+ fileData = ByteDataUtil .readLazyLongSlice (data , offset , fileNameLength .add (extraFieldLength ).add (MIN_FIXED_SIZE ), newLength ). withId ( "fileData" );
177183 }
178184
179185 /**
180186 * @param newLength New file data length.
181187 */
182188 public void setFileDataLength (@ Nonnull LazyLong newLength ) {
183189 fileDataLength = newLength ;
184- fileData = ByteDataUtil .readLazyLongSlice (data , offset , fileNameLength .add (extraFieldLength ).add (30 ), newLength );
190+ fileData = ByteDataUtil .readLazyLongSlice (data , offset , fileNameLength .add (extraFieldLength ).add (MIN_FIXED_SIZE ), newLength ). withId ( "fileData" );
185191 }
186192
187193 @ Override
0 commit comments