Class: Zlib::Inflate

Inherits:
ZStream show all
Defined in:
lib/motion-bundler/mocks/zliby-0.0.5/zlib.rb

Overview

DEFLATE Decompression

Implements decompression of a RFC-1951 compatible stream.

Defined Under Namespace

Classes: HuffmanTree

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ZStream

#adler, #avail_in, #avail_out, #avail_out=, #close, #closed?, #data_type, #end, #ended?, #finished?, #flush_next_in, #flush_next_out, #reset, #stream_end?, #total_in, #total_out

Constructor Details

#initialize(window_bits = MAX_WBITS) ⇒ Inflate

Returns a new instance of Inflate.



189
190
191
192
193
194
195
196
197
# File 'lib/motion-bundler/mocks/zliby-0.0.5/zlib.rb', line 189

def initialize window_bits=MAX_WBITS
  @w_bits = window_bits
  if @w_bits < 0 then
    @rawdeflate = true
    @w_bits *= -1
  end
  super()
  @zstring = ""
end

Class Method Details

.inflate(zstring) ⇒ Object



482
483
484
485
# File 'lib/motion-bundler/mocks/zliby-0.0.5/zlib.rb', line 482

def inflate zstring
  d = self.new
  d.inflate zstring
end

Instance Method Details

#<<(string) ⇒ Object

Appends data to the input stream



200
201
202
203
# File 'lib/motion-bundler/mocks/zliby-0.0.5/zlib.rb', line 200

def <<(string)
  @zstring << string
  inflate
end

#finishObject

Finishes inflating and flushes the buffer



265
266
267
268
269
270
271
# File 'lib/motion-bundler/mocks/zliby-0.0.5/zlib.rb', line 265

def finish
  output = ""
  inflate unless @output_buffer.length > 0
  @output_buffer.each {|c| output << c }
  super
  output
end

#inflate(zstring = nil) ⇒ Object

Example

f = File.open “example.z” i = Inflate.new i.inflate f.read



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# File 'lib/motion-bundler/mocks/zliby-0.0.5/zlib.rb', line 215

def inflate zstring=nil
  @zstring = zstring unless zstring.nil?
  #We can't use unpack, IronRuby doesn't have it yet.
  @zstring.each_byte {|b| @input_buffer << b}

   unless @rawdeflate then

  compression_method_and_flags = @input_buffer[@in_pos+=1]
  flags = @input_buffer[@in_pos+=1]

  #CMF and FLG, when viewed as a 16-bit unsigned integer stored inMSB order (CMF*256 + FLG), is a multiple of 31
  if ((compression_method_and_flags << 0x08) + flags) % 31 != 0 then raise Zlib::DataError.new("incorrect header check") end

  #CM = 8 denotes the ìdeflateî compression method with a window size up to 32K. (RFC's only specify CM 8)
  compression_method = compression_method_and_flags & 0x0F

  if compression_method != Z_DEFLATED then raise Zlib::DataError.new("unknown compression method") end

  #For CM = 8, CINFO is the base-2 logarithm of the LZ77 window size,minus eight (CINFO=7 indicates a 32K window size)
  compression_info = compression_method_and_flags >> 0x04

  if (compression_info + 8) > @w_bits then raise Zlib::DataError.new("invalid window size") end

  preset_dictionary_flag = ((flags & 0x20) >> 0x05) == 1
  compression_level = (flags & 0xC0) >> 0x06

  if preset_dictionary_flag and @dict.nil? then raise Zlib::NeedDict.new "Preset dictionary needed!" end

  #TODO:  Add Preset dictionary support
  if preset_dictionary_flag then
    @dict_crc = @input_buffer[@in_pos+=1] << 24 | @input_buffer[@in_pos+=1] << 16 | @input_buffer[@in_pos+=1] << 8 | @input_buffer[@in_pos+=1]
   end

  end
  last_block = false
  #Begin processing DEFLATE stream
  until last_block
    last_block = (get_bits(1) == 1)
    block_type = get_bits(2)
    case block_type
      when 0 then no_compression
      when 1 then fixed_codes
      when 2 then dynamic_codes
       when 3 then raise Zlib::DataError.new("invalid block type")
    end
  end
  finish
end

#set_dictionary(string) ⇒ Object

Sets the inflate dictionary



206
207
208
209
# File 'lib/motion-bundler/mocks/zliby-0.0.5/zlib.rb', line 206

def set_dictionary string
  @dict = string
  reset
end