Skip to content

Commit 88f9ba7

Browse files
committed
Pull out writing portions of the archive in DirectZipWriter to protected methods
1 parent 4f42427 commit 88f9ba7

File tree

1 file changed

+60
-51
lines changed

1 file changed

+60
-51
lines changed

src/main/java/software/coley/lljzip/format/write/DirectZipWriter.java

Lines changed: 60 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -21,68 +21,77 @@ public class DirectZipWriter implements ZipWriter {
2121
@Override
2222
public void write(@Nonnull ZipArchive archive, @Nonnull OutputStream os) throws IOException {
2323
// Write local file headers.
24-
for (final LocalFileHeader fileHeader : archive.getLocalFiles()) {
25-
writeIntLE(os, ZipPatterns.LOCAL_FILE_HEADER_QUAD);
26-
writeShortLE(os, fileHeader.getVersionNeededToExtract());
27-
writeShortLE(os, fileHeader.getGeneralPurposeBitFlag());
28-
writeShortLE(os, fileHeader.getCompressionMethod());
29-
writeShortLE(os, fileHeader.getLastModFileTime());
30-
writeShortLE(os, fileHeader.getLastModFileDate());
31-
writeIntLE(os, fileHeader.getCrc32());
32-
writeIntLE(os, (int) fileHeader.getCompressedSize());
33-
writeIntLE(os, (int) fileHeader.getUncompressedSize());
34-
writeShortLE(os, fileHeader.getFileNameLength());
35-
writeShortLE(os, fileHeader.getExtraFieldLength());
36-
os.write(MemorySegmentUtil.toByteArray(fileHeader.getFileName()));
37-
os.write(MemorySegmentUtil.toByteArray(fileHeader.getExtraField()));
38-
os.write(MemorySegmentUtil.toByteArray(fileHeader.getFileData()));
39-
}
24+
for (final LocalFileHeader fileHeader : archive.getLocalFiles())
25+
writeLocalFile(fileHeader, os);
4026

4127
// Write central directory file headers.
42-
for (final CentralDirectoryFileHeader directory : archive.getCentralDirectories()) {
43-
writeIntLE(os, ZipPatterns.CENTRAL_DIRECTORY_FILE_HEADER_QUAD);
44-
writeShortLE(os, directory.getVersionMadeBy());
45-
writeShortLE(os, directory.getVersionNeededToExtract());
46-
writeShortLE(os, directory.getGeneralPurposeBitFlag());
47-
writeShortLE(os, directory.getCompressionMethod());
48-
writeShortLE(os, directory.getLastModFileTime());
49-
writeShortLE(os, directory.getLastModFileDate());
50-
writeIntLE(os, directory.getCrc32());
51-
writeIntLE(os, (int) directory.getCompressedSize());
52-
writeIntLE(os, (int) directory.getUncompressedSize());
53-
writeShortLE(os, directory.getFileNameLength());
54-
writeShortLE(os, directory.getExtraFieldLength());
55-
writeShortLE(os, directory.getFileCommentLength());
56-
writeShortLE(os, directory.getDiskNumberStart());
57-
writeShortLE(os, directory.getInternalFileAttributes());
58-
writeIntLE(os, directory.getExternalFileAttributes());
59-
writeIntLE(os, (int) directory.getRelativeOffsetOfLocalHeader());
60-
os.write(MemorySegmentUtil.toByteArray(directory.getFileName()));
61-
os.write(MemorySegmentUtil.toByteArray(directory.getExtraField()));
62-
os.write(MemorySegmentUtil.toByteArray(directory.getFileComment()));
63-
}
28+
for (final CentralDirectoryFileHeader directory : archive.getCentralDirectories())
29+
writeCentralDirectory(directory, os);
6430

6531
// Write end of central directory record.
6632
final EndOfCentralDirectory end = archive.getEnd();
67-
if (end != null) {
68-
writeIntLE(os, ZipPatterns.END_OF_CENTRAL_DIRECTORY_QUAD);
69-
writeShortLE(os, end.getDiskNumber());
70-
writeShortLE(os, end.getCentralDirectoryStartDisk());
71-
writeShortLE(os, end.getCentralDirectoryStartOffset());
72-
writeShortLE(os, end.getNumEntries());
73-
writeIntLE(os, (int) end.getCentralDirectorySize());
74-
writeIntLE(os, (int) end.getCentralDirectoryOffset());
75-
writeShortLE(os, end.getZipCommentLength());
76-
os.write(MemorySegmentUtil.toByteArray(end.getZipComment()));
77-
}
33+
if (end != null)
34+
writeEnd(end, os);
7835
}
7936

80-
private static void writeShortLE(OutputStream os, int value) throws IOException {
37+
protected void writeLocalFile(@Nonnull LocalFileHeader fileHeader, @Nonnull OutputStream os) throws IOException {
38+
writeIntLE(os, ZipPatterns.LOCAL_FILE_HEADER_QUAD);
39+
writeShortLE(os, fileHeader.getVersionNeededToExtract());
40+
writeShortLE(os, fileHeader.getGeneralPurposeBitFlag());
41+
writeShortLE(os, fileHeader.getCompressionMethod());
42+
writeShortLE(os, fileHeader.getLastModFileTime());
43+
writeShortLE(os, fileHeader.getLastModFileDate());
44+
writeIntLE(os, fileHeader.getCrc32());
45+
writeIntLE(os, (int) fileHeader.getCompressedSize());
46+
writeIntLE(os, (int) fileHeader.getUncompressedSize());
47+
writeShortLE(os, fileHeader.getFileNameLength());
48+
writeShortLE(os, fileHeader.getExtraFieldLength());
49+
os.write(MemorySegmentUtil.toByteArray(fileHeader.getFileName()));
50+
os.write(MemorySegmentUtil.toByteArray(fileHeader.getExtraField()));
51+
os.write(MemorySegmentUtil.toByteArray(fileHeader.getFileData()));
52+
}
53+
54+
protected void writeCentralDirectory(@Nonnull CentralDirectoryFileHeader directory, @Nonnull OutputStream os) throws IOException {
55+
writeIntLE(os, ZipPatterns.CENTRAL_DIRECTORY_FILE_HEADER_QUAD);
56+
writeShortLE(os, directory.getVersionMadeBy());
57+
writeShortLE(os, directory.getVersionNeededToExtract());
58+
writeShortLE(os, directory.getGeneralPurposeBitFlag());
59+
writeShortLE(os, directory.getCompressionMethod());
60+
writeShortLE(os, directory.getLastModFileTime());
61+
writeShortLE(os, directory.getLastModFileDate());
62+
writeIntLE(os, directory.getCrc32());
63+
writeIntLE(os, (int) directory.getCompressedSize());
64+
writeIntLE(os, (int) directory.getUncompressedSize());
65+
writeShortLE(os, directory.getFileNameLength());
66+
writeShortLE(os, directory.getExtraFieldLength());
67+
writeShortLE(os, directory.getFileCommentLength());
68+
writeShortLE(os, directory.getDiskNumberStart());
69+
writeShortLE(os, directory.getInternalFileAttributes());
70+
writeIntLE(os, directory.getExternalFileAttributes());
71+
writeIntLE(os, (int) directory.getRelativeOffsetOfLocalHeader());
72+
os.write(MemorySegmentUtil.toByteArray(directory.getFileName()));
73+
os.write(MemorySegmentUtil.toByteArray(directory.getExtraField()));
74+
os.write(MemorySegmentUtil.toByteArray(directory.getFileComment()));
75+
}
76+
77+
protected void writeEnd(@Nonnull EndOfCentralDirectory end, @Nonnull OutputStream os) throws IOException {
78+
writeIntLE(os, ZipPatterns.END_OF_CENTRAL_DIRECTORY_QUAD);
79+
writeShortLE(os, end.getDiskNumber());
80+
writeShortLE(os, end.getCentralDirectoryStartDisk());
81+
writeShortLE(os, end.getCentralDirectoryStartOffset());
82+
writeShortLE(os, end.getNumEntries());
83+
writeIntLE(os, (int) end.getCentralDirectorySize());
84+
writeIntLE(os, (int) end.getCentralDirectoryOffset());
85+
writeShortLE(os, end.getZipCommentLength());
86+
os.write(MemorySegmentUtil.toByteArray(end.getZipComment()));
87+
}
88+
89+
protected static void writeShortLE(OutputStream os, int value) throws IOException {
8190
os.write(value & 0xFF);
8291
os.write((value >> 8) & 0xFF);
8392
}
8493

85-
private static void writeIntLE(OutputStream os, int value) throws IOException {
94+
protected static void writeIntLE(OutputStream os, int value) throws IOException {
8695
os.write(value & 0xFF);
8796
os.write((value >> 8) & 0xFF);
8897
os.write((value >> 16) & 0xFF);

0 commit comments

Comments
 (0)