Harbor::ZippedIO
An IO class for zipping files suitable for sending via rack.
Public Class Methods
block_size()
# File lib/harbor/zipped_io.rb, line 95 95: def self.block_size 96: @@block_size 97: end
Public Instance Methods
compute_metadata()
# File lib/harbor/zipped_io.rb, line 17 17: def compute_metadata 18: return false if @metadata_computed 19: 20: @total_compressed_size = 0 21: 22: @offset = 0 23: zip_entries.each do |entry| 24: entry.local_header_offset = @offset 25: 26: crc = Zlib::crc32 27: compressed_size = 0 28: uncompressed_size = 0 29: 30: entry.file.rewind 31: zlibDeflater = Zlib::Deflate.new(0, -Zlib::MAX_WBITS) 32: while data = entry.file.read(Harbor::ZippedIO::block_size) 33: crc = Zlib::crc32(data.to_s, crc) 34: uncompressed_size += data.size 35: compressed_size += zlibDeflater.deflate(data).size 36: end 37: until zlibDeflater.finished? 38: compressed_size += zlibDeflater.finish.size 39: end 40: 41: entry.crc = crc 42: entry.compressed_size = compressed_size 43: entry.uncompressed_size = uncompressed_size 44: 45: @offset += compressed_size + entry.read_local_entry.size 46: 47: @total_compressed_size += compressed_size + entry.read_local_entry.size 48: end 49: 50: @total_compressed_size += zip_central_directory.size 51: 52: true 53: end
each()
# File lib/harbor/zipped_io.rb, line 55 55: def each 56: compute_metadata 57: 58: zip_entries.each do |entry| 59: yield entry.read_local_entry 60: 61: entry.file.rewind 62: zlibDeflater = Zlib::Deflate.new(0, -Zlib::MAX_WBITS) 63: while data = entry.file.read(Harbor::ZippedIO::block_size) 64: yield zlibDeflater.deflate(data) 65: end 66: until zlibDeflater.finished? 67: yield zlibDeflater.finish 68: end 69: end 70: 71: zip_central_directory.read do |data| 72: yield data 73: end 74: 75: zip_entries.each do |entry| 76: entry.close 77: end 78: end
size()
# File lib/harbor/zipped_io.rb, line 80 80: def size 81: compute_metadata 82: @total_compressed_size 83: end