File tree Expand file tree Collapse file tree 5 files changed +39
-6
lines changed
Expand file tree Collapse file tree 5 files changed +39
-6
lines changed Original file line number Diff line number Diff line change @@ -2,6 +2,18 @@ module Zip
22 class Decompressor #:nodoc:all
33 CHUNK_SIZE = 32_768
44
5+ def self . decompressor_classes
6+ @decompressor_classes ||= { }
7+ end
8+
9+ def self . register ( compression_method , decompressor_class )
10+ decompressor_classes [ compression_method ] = decompressor_class
11+ end
12+
13+ def self . find_by_compression_method ( compression_method )
14+ decompressor_classes [ compression_method ]
15+ end
16+
517 attr_reader :input_stream
618 attr_reader :decompressed_size
719
Original file line number Diff line number Diff line change @@ -43,6 +43,8 @@ def input_finished?
4343 @zlib_inflater . finished?
4444 end
4545 end
46+
47+ ::Zip ::Decompressor . register ( ::Zip ::COMPRESSION_METHOD_DEFLATE , ::Zip ::Inflater )
4648end
4749
4850# Copyright (C) 2002, 2003 Thomas Sondergaard
Original file line number Diff line number Diff line change @@ -146,18 +146,20 @@ def get_decrypted_io
146146 def get_decompressor
147147 return ::Zip ::NullDecompressor if @current_entry . nil?
148148
149- if @current_entry . compression_method == :: Zip :: Entry :: STORED
149+ decompressed_size =
150150 if @current_entry . incomplete? && @current_entry . crc == 0 && @current_entry . size == 0 && @complete_entry
151- :: Zip :: PassThruDecompressor . new ( @decrypted_io , @ complete_entry. size )
151+ @ complete_entry. size
152152 else
153- :: Zip :: PassThruDecompressor . new ( @decrypted_io , @ current_entry. size )
153+ @ current_entry. size
154154 end
155- elsif @current_entry . compression_method == :: Zip :: Entry :: DEFLATED
156- ::Zip ::Inflater . new ( @decrypted_io )
157- else
155+
156+ decompressor_class = ::Zip ::Decompressor . find_by_compression_method ( @current_entry . compression_method )
157+ if decompressor_class . nil?
158158 raise ::Zip ::CompressionMethodError ,
159159 "Unsupported compression method #{ @current_entry . compression_method } "
160160 end
161+
162+ decompressor_class . new ( @decrypted_io , decompressed_size )
161163 end
162164
163165 def produce_input
Original file line number Diff line number Diff line change @@ -22,6 +22,8 @@ def eof
2222
2323 alias_method :eof? , :eof
2424 end
25+
26+ ::Zip ::Decompressor . register ( ::Zip ::COMPRESSION_METHOD_STORE , ::Zip ::PassThruDecompressor )
2527end
2628
2729# Copyright (C) 2002, 2003 Thomas Sondergaard
Original file line number Diff line number Diff line change 1+ require 'test_helper'
2+ class DecompressorTest < MiniTest ::Test
3+ TEST_COMPRESSION_METHOD = 255
4+
5+ class TestCompressionClass
6+ end
7+
8+ def test_decompressor_registration
9+ assert_nil ( ::Zip ::Decompressor . find_by_compression_method ( TEST_COMPRESSION_METHOD ) )
10+
11+ ::Zip ::Decompressor . register ( TEST_COMPRESSION_METHOD , TestCompressionClass )
12+
13+ assert_equal ( TestCompressionClass , ::Zip ::Decompressor . find_by_compression_method ( TEST_COMPRESSION_METHOD ) )
14+ end
15+ end
You can’t perform that action at this time.
0 commit comments