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
2
2
class Decompressor #:nodoc:all
3
3
CHUNK_SIZE = 32_768
4
4
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
+
5
17
attr_reader :input_stream
6
18
attr_reader :decompressed_size
7
19
Original file line number Diff line number Diff line change @@ -43,6 +43,8 @@ def input_finished?
43
43
@zlib_inflater . finished?
44
44
end
45
45
end
46
+
47
+ ::Zip ::Decompressor . register ( ::Zip ::COMPRESSION_METHOD_DEFLATE , ::Zip ::Inflater )
46
48
end
47
49
48
50
# Copyright (C) 2002, 2003 Thomas Sondergaard
Original file line number Diff line number Diff line change @@ -146,18 +146,20 @@ def get_decrypted_io
146
146
def get_decompressor
147
147
return ::Zip ::NullDecompressor if @current_entry . nil?
148
148
149
- if @current_entry . compression_method == :: Zip :: Entry :: STORED
149
+ decompressed_size =
150
150
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
152
152
else
153
- :: Zip :: PassThruDecompressor . new ( @decrypted_io , @ current_entry. size )
153
+ @ current_entry. size
154
154
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?
158
158
raise ::Zip ::CompressionMethodError ,
159
159
"Unsupported compression method #{ @current_entry . compression_method } "
160
160
end
161
+
162
+ decompressor_class . new ( @decrypted_io , decompressed_size )
161
163
end
162
164
163
165
def produce_input
Original file line number Diff line number Diff line change @@ -22,6 +22,8 @@ def eof
22
22
23
23
alias_method :eof? , :eof
24
24
end
25
+
26
+ ::Zip ::Decompressor . register ( ::Zip ::COMPRESSION_METHOD_STORE , ::Zip ::PassThruDecompressor )
25
27
end
26
28
27
29
# 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