(CenterFileHeader header)
| 227 | } |
| 228 | |
| 229 | private void writeHeader(CenterFileHeader header) throws IOException { |
| 230 | setupNeedZip64(header); |
| 231 | |
| 232 | _writeInt(LFH_SIG); |
| 233 | _writeShort(header.version()); |
| 234 | _writeShort(header.generalPurposeFlag); |
| 235 | _writeShort(header.method); |
| 236 | _writeInt(header.time); |
| 237 | _writeInt(header.crc); |
| 238 | if (header.sizeNeedZip64) { |
| 239 | _writeUInt(MAX_ZIP_ENTRY_AND_ARCHIVE_SIZE); |
| 240 | _writeUInt(MAX_ZIP_ENTRY_AND_ARCHIVE_SIZE); |
| 241 | } else { |
| 242 | _writeUInt(header.compressedSize); |
| 243 | _writeUInt(header.size); |
| 244 | } |
| 245 | _writeShort(header.name.length); |
| 246 | |
| 247 | byte[] extra; |
| 248 | if (header.sizeNeedZip64) { |
| 249 | byte[] data = new byte[2 * 8]; |
| 250 | ZipUtil.writeLong(data, 0, header.size); |
| 251 | ZipUtil.writeLong(data, 8, header.compressedSize); |
| 252 | extra = ExtraDataRecord.set(header.extra, ZIP64_EXTENDED_INFO_HEADER_ID, data); |
| 253 | } else { |
| 254 | extra = ExtraDataRecord.remove(header.extra, ZIP64_EXTENDED_INFO_HEADER_ID); |
| 255 | } |
| 256 | // zipAlign |
| 257 | if (header.method == METHOD_STORED) { |
| 258 | int alignment; |
| 259 | if (header.isHost || new String(header.name, ZipConstant.UTF_8).endsWith(".so")) { |
| 260 | // -p: memory page alignment for stored shared object files |
| 261 | alignment = 4096; |
| 262 | } else { |
| 263 | alignment = 4; |
| 264 | } |
| 265 | long extraDataOffset = _getFilePointer() + 2 + header.name.length; |
| 266 | extra = align(alignment, extra, extraDataOffset); |
| 267 | } |
| 268 | _writeShort(extra.length); |
| 269 | _writeBytes(header.name); |
| 270 | |
| 271 | _writeBytes(extra); |
| 272 | } |
| 273 | |
| 274 | private void setupNeedZip64(CenterFileHeader header) { |
| 275 | if (forceZip64) { |
no test coverage detected