class Zip::Inflater
:nodoc:all
def eof
def eof @buffer.empty? && input_finished? end
def initialize(*args)
def initialize(*args) super @buffer = +'' @zlib_inflater = ::Zlib::Inflate.new(-Zlib::MAX_WBITS) end
def input_finished?
def input_finished? @zlib_inflater.finished? end
def produce_input
def produce_input retried = 0 begin @zlib_inflater.inflate(input_stream.read(Decompressor::CHUNK_SIZE)) rescue Zlib::BufError raise if retried >= 5 # how many times should we retry? retried += 1 retry end rescue Zlib::Error raise(::Zip::DecompressionError, 'zlib error while inflating') end
def read(length = nil, outbuf = '')
def read(length = nil, outbuf = '') return (length.nil? || length.zero? ? '' : nil) if eof while length.nil? || (@buffer.bytesize < length) break if input_finished? @buffer << produce_input end outbuf.replace(@buffer.slice!(0...(length || @buffer.bytesize))) end