Support Decompressor plugins
This commit is contained in:
parent
2b7268373a
commit
a5d068d3e8
|
@ -2,6 +2,18 @@ module Zip
|
||||||
class Decompressor #:nodoc:all
|
class Decompressor #:nodoc:all
|
||||||
CHUNK_SIZE = 32_768
|
CHUNK_SIZE = 32_768
|
||||||
|
|
||||||
|
def self.decompressor_classes
|
||||||
|
@decompressor_classes ||= {}
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.register(compression_method, decompressor_class)
|
||||||
|
decompressor_classes[compression_method] = decompressor_class
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.find_by_compression_method(compression_method)
|
||||||
|
decompressor_classes[compression_method]
|
||||||
|
end
|
||||||
|
|
||||||
attr_reader :input_stream
|
attr_reader :input_stream
|
||||||
attr_reader :decompressed_size
|
attr_reader :decompressed_size
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,8 @@ module Zip
|
||||||
@zlib_inflater.finished?
|
@zlib_inflater.finished?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
::Zip::Decompressor.register(::Zip::COMPRESSION_METHOD_DEFLATE, ::Zip::Inflater)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Copyright (C) 2002, 2003 Thomas Sondergaard
|
# Copyright (C) 2002, 2003 Thomas Sondergaard
|
||||||
|
|
|
@ -146,18 +146,20 @@ module Zip
|
||||||
def get_decompressor
|
def get_decompressor
|
||||||
return ::Zip::NullDecompressor if @current_entry.nil?
|
return ::Zip::NullDecompressor if @current_entry.nil?
|
||||||
|
|
||||||
if @current_entry.compression_method == ::Zip::Entry::STORED
|
decompressed_size =
|
||||||
if @current_entry.incomplete? && @current_entry.crc == 0 && @current_entry.size == 0 && @complete_entry
|
if @current_entry.incomplete? && @current_entry.crc == 0 && @current_entry.size == 0 && @complete_entry
|
||||||
::Zip::PassThruDecompressor.new(@decrypted_io, @complete_entry.size)
|
@complete_entry.size
|
||||||
else
|
else
|
||||||
::Zip::PassThruDecompressor.new(@decrypted_io, @current_entry.size)
|
@current_entry.size
|
||||||
end
|
end
|
||||||
elsif @current_entry.compression_method == ::Zip::Entry::DEFLATED
|
|
||||||
::Zip::Inflater.new(@decrypted_io)
|
decompressor_class = ::Zip::Decompressor.find_by_compression_method(@current_entry.compression_method)
|
||||||
else
|
if decompressor_class.nil?
|
||||||
raise ::Zip::CompressionMethodError,
|
raise ::Zip::CompressionMethodError,
|
||||||
"Unsupported compression method #{@current_entry.compression_method}"
|
"Unsupported compression method #{@current_entry.compression_method}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
decompressor_class.new(@decrypted_io, decompressed_size)
|
||||||
end
|
end
|
||||||
|
|
||||||
def produce_input
|
def produce_input
|
||||||
|
|
|
@ -22,6 +22,8 @@ module Zip
|
||||||
|
|
||||||
alias_method :eof?, :eof
|
alias_method :eof?, :eof
|
||||||
end
|
end
|
||||||
|
|
||||||
|
::Zip::Decompressor.register(::Zip::COMPRESSION_METHOD_STORE, ::Zip::PassThruDecompressor)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Copyright (C) 2002, 2003 Thomas Sondergaard
|
# Copyright (C) 2002, 2003 Thomas Sondergaard
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
require 'test_helper'
|
||||||
|
class DecompressorTest < MiniTest::Test
|
||||||
|
TEST_COMPRESSION_METHOD = 255
|
||||||
|
|
||||||
|
class TestCompressionClass
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_decompressor_registration
|
||||||
|
assert_nil(::Zip::Decompressor.find_by_compression_method(TEST_COMPRESSION_METHOD))
|
||||||
|
|
||||||
|
::Zip::Decompressor.register(TEST_COMPRESSION_METHOD, TestCompressionClass)
|
||||||
|
|
||||||
|
assert_equal(TestCompressionClass, ::Zip::Decompressor.find_by_compression_method(TEST_COMPRESSION_METHOD))
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue