39
39
*/
40
40
public class LocalFileHeader extends AbstractZipFileHeader {
41
41
protected static final int MIN_FIXED_SIZE = 30 ;
42
- private transient CentralDirectoryFileHeader linkedDirectoryFileHeader ;
42
+ protected transient CentralDirectoryFileHeader linkedDirectoryFileHeader ;
43
43
44
44
// LocalFileHeader spec (plus common elements between this and central file)
45
45
protected LazyByteData fileData ;
@@ -76,18 +76,18 @@ public LocalFileHeader copy() {
76
76
@ Override
77
77
public void read (@ Nonnull ByteData data , long offset ) {
78
78
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" ) ;
91
91
fileDataLength = new LazyLong (() -> {
92
92
long fileDataLength ;
93
93
if (compressionMethod .get () == STORED ) {
@@ -96,8 +96,9 @@ public void read(@Nonnull ByteData data, long offset) {
96
96
fileDataLength = compressedSize .get ();
97
97
}
98
98
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" );
101
102
}
102
103
103
104
/**
@@ -132,18 +133,22 @@ public boolean hasDifferentValuesThanCentralDirectoryHeader() {
132
133
* which you may want to adopt.
133
134
*/
134
135
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");
147
152
fileDataLength = new LazyLong (() -> {
148
153
long fileDataLength ;
149
154
if (compressionMethod .get () == STORED ) {
@@ -152,8 +157,9 @@ public void adoptLinkedCentralDirectoryValues() {
152
157
fileDataLength = compressedSize .get ();
153
158
}
154
159
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" );
157
163
}
158
164
}
159
165
@@ -163,7 +169,7 @@ public void adoptLinkedCentralDirectoryValues() {
163
169
* @param endOffset New file data length.
164
170
*/
165
171
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 ();
167
173
long length = endOffset - fileDataStartOffset ;
168
174
setFileDataLength (length );
169
175
}
@@ -173,15 +179,15 @@ public void setFileDataEndOffset(long endOffset) {
173
179
*/
174
180
public void setFileDataLength (long newLength ) {
175
181
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" );
177
183
}
178
184
179
185
/**
180
186
* @param newLength New file data length.
181
187
*/
182
188
public void setFileDataLength (@ Nonnull LazyLong newLength ) {
183
189
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" );
185
191
}
186
192
187
193
@ Override
0 commit comments