class Zip::Inflater

:nodoc:all

def eof

def eof
  @buffer.empty? && input_finished?
end

def initialize(*args)

:nodoc:all
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