def dump_local_file_record(io, local_file_record_position)
@local_file_record_position = local_file_record_position
bytes_written = 0
need_trailing_data_descriptor = false
begin
io.pos
rescue Errno::ESPIPE
need_trailing_data_descriptor = true
end
if encryption_codec.class == Codec::TraditionalEncryption then
need_trailing_data_descriptor = true
encryption_codec.mtime = mtime
end
general_purpose_flags = compression_codec.general_purpose_flags
general_purpose_flags |= encryption_codec.general_purpose_flags
if need_trailing_data_descriptor then
general_purpose_flags |= FLAG_DATA_DESCRIPTOR_FOLLOWS
end
version_needed_to_extract = compression_codec.version_needed_to_extract
if encryption_codec.version_needed_to_extract > version_needed_to_extract then
version_needed_to_extract = encryption_codec.version_needed_to_extract
end
bytes_written += io.write(LFH_SIGNATURE)
extra_field_data = local_extra_field_data
bytes_written += io.write(
[
version_needed_to_extract,
general_purpose_flags,
compression_codec.compression_method,
mtime.to_dos_time.to_i,
0,
0,
0,
zip_path.length,
extra_field_data.length
].pack('vvvVVVVvv')
)
bytes_written += io.write(zip_path)
bytes_written += io.write(extra_field_data)
encryption_codec.encryptor(io, password) do |e|
compression_codec.compressor(e) do |c|
dump_file_data(c)
c.close(false)
@data_descriptor = DataDescriptor.new(
c.data_descriptor.crc32,
c.data_descriptor.compressed_size + encryption_codec.header_size,
c.data_descriptor.uncompressed_size
)
end
e.close(false)
end
bytes_written += @data_descriptor.compressed_size
if need_trailing_data_descriptor then
bytes_written += io.write(DD_SIGNATURE)
bytes_written += @data_descriptor.dump(io)
end
begin
saved_position = io.pos
io.pos = @local_file_record_position + 14
@data_descriptor.dump(io)
io.pos = saved_position
rescue Errno::ESPIPE
end
bytes_written
end