Harbor Documentation

Harbor::ZippedIO

An IO class for zipping files suitable for sending via rack.

Constants

  • DEFAULT_BLOCK_SIZE
  • CENTRAL_DIRECTORY_ENTRY_SIGNATURE
  • END_OF_CENTRAL_DIRECTORY_SIGNATURE

Public Class Methods

block_size()

      # File lib/harbor/zipped_io.rb, line 95
95:     def self.block_size
96:       @@block_size
97:     end

block_size=(value)

       # File lib/harbor/zipped_io.rb, line 99
 99:     def self.block_size=(value)
100:       @@block_size = value
101:     end

new(files)

      # File lib/harbor/zipped_io.rb, line 13
13:     def initialize(files)
14:       @files = files
15:     end

Public Instance Methods

compute_metadata()

      # File lib/harbor/zipped_io.rb, line 17
17:     def compute_metadata
18:       return false if @metadata_computed
19: 
20:       @total_compressed_size = 0
21: 
22:       @offset = 0
23:       zip_entries.each do |entry|
24:         entry.local_header_offset = @offset
25: 
26:         crc = Zlib::crc32
27:         compressed_size = 0
28:         uncompressed_size = 0
29: 
30:         entry.file.rewind
31:         zlibDeflater = Zlib::Deflate.new(0, -Zlib::MAX_WBITS)
32:         while data = entry.file.read(Harbor::ZippedIO::block_size)
33:           crc = Zlib::crc32(data.to_s, crc)
34:           uncompressed_size += data.size
35:           compressed_size += zlibDeflater.deflate(data).size
36:         end
37:         until zlibDeflater.finished?
38:           compressed_size += zlibDeflater.finish.size
39:         end
40: 
41:         entry.crc = crc
42:         entry.compressed_size = compressed_size
43:         entry.uncompressed_size = uncompressed_size
44: 
45:         @offset += compressed_size + entry.read_local_entry.size
46: 
47:         @total_compressed_size += compressed_size + entry.read_local_entry.size
48:       end
49: 
50:       @total_compressed_size += zip_central_directory.size
51: 
52:       true
53:     end

each()

      # File lib/harbor/zipped_io.rb, line 55
55:     def each
56:       compute_metadata
57: 
58:       zip_entries.each do |entry|
59:         yield entry.read_local_entry
60: 
61:         entry.file.rewind
62:         zlibDeflater = Zlib::Deflate.new(0, -Zlib::MAX_WBITS)
63:         while data = entry.file.read(Harbor::ZippedIO::block_size)
64:           yield zlibDeflater.deflate(data)
65:         end
66:         until zlibDeflater.finished?
67:           yield zlibDeflater.finish
68:         end
69:       end
70: 
71:       zip_central_directory.read do |data|
72:         yield data
73:       end
74: 
75:       zip_entries.each do |entry|
76:         entry.close
77:       end
78:     end

size()

      # File lib/harbor/zipped_io.rb, line 80
80:     def size
81:       compute_metadata
82:       @total_compressed_size
83:     end

zip_central_directory()

      # File lib/harbor/zipped_io.rb, line 85
85:     def zip_central_directory
86:       @zip_central_directory ||= ZipCentralDirectory.new(zip_entries, @offset)
87:     end

zip_entries()

      # File lib/harbor/zipped_io.rb, line 89
89:     def zip_entries
90:       @zip_entries ||= @files.map { |file| ZipEntry.new(file) }
91:     end