1212import net .lingala .zip4j .zip .CompressionMethod ;
1313import net .lingala .zip4j .zip .EncryptionMethod ;
1414
15- import java .io .File ;
16-
1715public class FileHeaderFactory {
1816
1917 public FileHeader generateFileHeader (ZipParameters zipParameters , boolean isSplitZip , int currentDiskNumberStart ,
20- String fileNameCharset , File sourceFile ) throws ZipException {
18+ String fileNameCharset ) throws ZipException {
2119
2220 FileHeader fileHeader = new FileHeader ();
2321 fileHeader .setSignature ((int ) InternalZipConstants .CENSIG );
@@ -36,27 +34,21 @@ public FileHeader generateFileHeader(ZipParameters zipParameters, boolean isSpli
3634 fileHeader .setEncryptionMethod (zipParameters .getEncryptionMethod ());
3735 }
3836
39- String fileName = getFileName (zipParameters , fileHeader , sourceFile );
37+ String fileName = validateAndGetFileName (zipParameters . getFileNameInZip () );
4038 fileHeader .setFileName (fileName );
4139 fileHeader .setFileNameLength (determineFileNameLength (fileName , fileNameCharset ));
42- fileHeader .setDiskNumberStart (isSplitZip ? currentDiskNumberStart : 0 );
43-
44- byte [] externalFileAttrs = {(byte ) getFileAttributes (zipParameters .isSourceExternalStream (), sourceFile ), 0 , 0 , 0 };
45- fileHeader .setExternalFileAttr (externalFileAttrs );
46-
47- fileHeader .setDirectory (isDirectory (fileName , zipParameters .isSourceExternalStream (), sourceFile ));
40+ fileHeader .setDiskNumberStart (isSplitZip ? currentDiskNumberStart : 0 );
4841
49- if (fileHeader .isDirectory ()) {
50- fileHeader .setCompressedSize (0 );
51- fileHeader .setUncompressedSize (0 );
42+ if (zipParameters .getLastModifiedFileTime () > 0 ) {
43+ fileHeader .setLastModifiedTime ((int ) Zip4jUtil .javaToDosTime (zipParameters .getLastModifiedFileTime ()));
5244 } else {
53- if (!zipParameters .isSourceExternalStream ()) {
54- long fileSize = Zip4jUtil .getFileLengh (sourceFile );
55- fileHeader .setCompressedSize (calculateCompressedSize (zipParameters , fileSize ));
56- fileHeader .setUncompressedSize (fileSize );
57- }
45+ fileHeader .setLastModifiedTime ((int ) Zip4jUtil .javaToDosTime (System .currentTimeMillis ()));
5846 }
5947
48+ //TODO add file atttributes for interally added files
49+ fileHeader .setExternalFileAttr (new byte [] {0 , 0 , 0 , 0 });
50+ fileHeader .setDirectory (Zip4jUtil .isZipEntryDirectory (fileName ));
51+
6052 if (zipParameters .isEncryptFiles () && zipParameters .getEncryptionMethod () == EncryptionMethod .ZIP_STANDARD ) {
6153 fileHeader .setCrc32 (zipParameters .getSourceFileCRC ());
6254 }
@@ -101,23 +93,11 @@ private byte[] determineGeneralPurposeBitFlag(String fileNameCharset, boolean is
10193 return generalPurposeBitFlag ;
10294 }
10395
104- private String getFileName (ZipParameters zipParameters , FileHeader fileHeader , File sourceFile ) throws ZipException {
105- String fileName ;
106- if (zipParameters .isSourceExternalStream ()) {
107- fileHeader .setLastModifiedTime ((int ) Zip4jUtil .javaToDosTime (System .currentTimeMillis ()));
108- if (!Zip4jUtil .isStringNotNullAndNotEmpty (zipParameters .getFileNameInZip ())) {
109- throw new ZipException ("fileNameInZip is null or empty" );
110- }
111- fileName = zipParameters .getFileNameInZip ();
112- } else {
113- fileHeader .setLastModifiedTime ((int ) Zip4jUtil .javaToDosTime ((Zip4jUtil .getLastModifiedFileTime (
114- sourceFile , zipParameters .getTimeZone ()))));
115- fileHeader .setUncompressedSize (sourceFile .length ());
116- fileName = Zip4jUtil .getRelativeFileName (
117- sourceFile .getAbsolutePath (), zipParameters .getRootFolderInZip (), zipParameters .getDefaultFolderPath ());
96+ private String validateAndGetFileName (String fileNameInZip ) throws ZipException {
97+ if (!Zip4jUtil .isStringNotNullAndNotEmpty (fileNameInZip )) {
98+ throw new ZipException ("fileNameInZip is null or empty" );
11899 }
119-
120- return fileName ;
100+ return fileNameInZip ;
121101 }
122102
123103 private AESExtraDataRecord generateAESExtraDataRecord (ZipParameters parameters ) throws ZipException {
@@ -163,54 +143,10 @@ private int[] generateGeneralPurposeBitArray(boolean isEncrypted, CompressionMet
163143 return generalPurposeBits ;
164144 }
165145
166- private int getFileAttributes (boolean isSourceExternalStream , File file ) {
167- if (isSourceExternalStream || !file .exists ()) {
168- return 0 ;
169- }
170-
171- if (file .isDirectory ()) {
172- if (file .isHidden ()) {
173- return InternalZipConstants .FOLDER_MODE_HIDDEN ;
174- } else {
175- return InternalZipConstants .FOLDER_MODE_NONE ;
176- }
177- } else {
178- if (!file .canWrite () && file .isHidden ()) {
179- return InternalZipConstants .FILE_MODE_READ_ONLY_HIDDEN ;
180- } else if (!file .canWrite ()) {
181- return InternalZipConstants .FILE_MODE_READ_ONLY ;
182- } else if (file .isHidden ()) {
183- return InternalZipConstants .FILE_MODE_HIDDEN ;
184- } else {
185- return InternalZipConstants .FILE_MODE_NONE ;
186- }
187- }
188- }
189-
190- private long calculateCompressedSize (ZipParameters zipParameters , long fileSize ) {
191- if (zipParameters .getCompressionMethod () == CompressionMethod .STORE ) {
192- if (zipParameters .getEncryptionMethod () == EncryptionMethod .ZIP_STANDARD ) {
193- return fileSize + InternalZipConstants .STD_DEC_HDR_SIZE ;
194- } else if (zipParameters .getEncryptionMethod () == EncryptionMethod .AES ) {
195- return fileSize + zipParameters .getAesKeyStrength ().getSaltLength ()
196- + InternalZipConstants .AES_AUTH_LENGTH + 2 ; //2 is password verifier
197- }
198- }
199- return 0 ;
200- }
201-
202146 private int determineFileNameLength (String fileName , String fileNameCharset ) throws ZipException {
203147 if (Zip4jUtil .isStringNotNullAndNotEmpty (fileNameCharset )) {
204148 return Zip4jUtil .getEncodedStringLength (fileName , fileNameCharset );
205149 }
206150 return Zip4jUtil .getEncodedStringLength (fileName );
207151 }
208-
209- private boolean isDirectory (String fileName , boolean isSourceExternalStream , File sourceFile ) {
210- if (isSourceExternalStream ) {
211- return fileName .endsWith ("/" ) || fileName .endsWith ("\\ " );
212- } else {
213- return sourceFile .isDirectory ();
214- }
215- }
216152}
0 commit comments