2010-11-30 16:27:59 +08:00
|
|
|
module Zip
|
|
|
|
class PassThruDecompressor < Decompressor #:nodoc:all
|
2013-06-03 02:33:03 +08:00
|
|
|
|
|
|
|
def initialize(input_stream, chars_to_read)
|
|
|
|
super(input_stream)
|
|
|
|
@chars_to_read = chars_to_read
|
|
|
|
@read_so_far = 0
|
|
|
|
@has_returned_empty_string = false
|
2010-11-30 16:27:59 +08:00
|
|
|
end
|
2011-11-18 04:53:04 +08:00
|
|
|
|
2013-06-03 02:33:03 +08:00
|
|
|
def sysread(number_of_bytes = nil, buf = nil)
|
2010-11-30 16:27:59 +08:00
|
|
|
if input_finished?
|
2013-06-03 02:33:03 +08:00
|
|
|
has_returned_empty_string_val = @has_returned_empty_string
|
|
|
|
@has_returned_empty_string = true
|
|
|
|
return '' unless has_returned_empty_string_val
|
2011-11-18 04:53:04 +08:00
|
|
|
return
|
2010-11-30 16:27:59 +08:00
|
|
|
end
|
2011-11-18 04:53:04 +08:00
|
|
|
|
2013-06-03 02:33:03 +08:00
|
|
|
if (number_of_bytes == nil || @read_so_far + number_of_bytes > @chars_to_read)
|
|
|
|
number_of_bytes = @chars_to_read - @read_so_far
|
2010-11-30 16:27:59 +08:00
|
|
|
end
|
2013-06-03 02:33:03 +08:00
|
|
|
@read_so_far += number_of_bytes
|
|
|
|
@input_stream.read(number_of_bytes, buf)
|
2010-11-30 16:27:59 +08:00
|
|
|
end
|
2011-11-18 04:53:04 +08:00
|
|
|
|
2010-11-30 16:27:59 +08:00
|
|
|
def produce_input
|
2013-06-03 02:33:03 +08:00
|
|
|
sysread(::Zip::Decompressor::CHUNK_SIZE)
|
2010-11-30 16:27:59 +08:00
|
|
|
end
|
2011-11-18 04:53:04 +08:00
|
|
|
|
2010-11-30 16:27:59 +08:00
|
|
|
def input_finished?
|
2013-06-03 02:33:03 +08:00
|
|
|
@read_so_far >= @chars_to_read
|
2010-11-30 16:27:59 +08:00
|
|
|
end
|
2013-06-03 02:33:03 +08:00
|
|
|
|
2010-11-30 16:27:59 +08:00
|
|
|
alias :eof :input_finished?
|
|
|
|
alias :eof? :input_finished?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Copyright (C) 2002, 2003 Thomas Sondergaard
|
|
|
|
# rubyzip is free software; you can redistribute it and/or
|
|
|
|
# modify it under the terms of the ruby license.
|