Class: Zip::ExtraField::Zip64
- Defined in:
- lib/zip/extra_field/zip64.rb
Overview
Info-ZIP Extra for Zip64 size
Constant Summary collapse
- HEADER_ID =
['0100'].pack('H*')
Instance Attribute Summary collapse
-
#compressed_size ⇒ Object
:nodoc:.
-
#disk_start_number ⇒ Object
:nodoc:.
-
#original_size ⇒ Object
:nodoc:.
-
#relative_header_offset ⇒ Object
:nodoc:.
Instance Method Summary collapse
- #==(other) ⇒ Object
-
#initialize(binstr = nil) ⇒ Zip64
constructor
A new instance of Zip64.
- #merge(binstr) ⇒ Object
- #pack_for_c_dir ⇒ Object
- #pack_for_local ⇒ Object
-
#parse(original_size, compressed_size, relative_header_offset = nil, disk_start_number = nil) ⇒ Object
pass the values from the base entry (if applicable) wider values are only present in the extra field for base values set to all FFs returns the final values for the four attributes (from the base or zip64 extra record).
-
#suppress? ⇒ Boolean
We can suppress the zip64 extra field unless we know the size is large or the relative header offset is large (for central directory entries).
Methods inherited from Generic
#initial_parse, name, register_map, #to_c_dir_bin, #to_local_bin
Constructor Details
#initialize(binstr = nil) ⇒ Zip64
Returns a new instance of Zip64.
12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/zip/extra_field/zip64.rb', line 12 def initialize(binstr = nil) # unparsed binary; we don't actually know what this contains # without looking for FFs in the associated file header # call parse after initializing with a binary string @content = nil @original_size = nil @compressed_size = nil @relative_header_offset = nil @disk_start_number = nil binstr && merge(binstr) end |
Instance Attribute Details
#compressed_size ⇒ Object
:nodoc:
6 7 8 |
# File 'lib/zip/extra_field/zip64.rb', line 6 def compressed_size @compressed_size end |
#disk_start_number ⇒ Object
:nodoc:
6 7 8 |
# File 'lib/zip/extra_field/zip64.rb', line 6 def disk_start_number @disk_start_number end |
#original_size ⇒ Object
:nodoc:
6 7 8 |
# File 'lib/zip/extra_field/zip64.rb', line 6 def original_size @original_size end |
#relative_header_offset ⇒ Object
:nodoc:
6 7 8 |
# File 'lib/zip/extra_field/zip64.rb', line 6 def relative_header_offset @relative_header_offset end |
Instance Method Details
#==(other) ⇒ Object
24 25 26 27 28 29 |
# File 'lib/zip/extra_field/zip64.rb', line 24 def ==(other) other.original_size == @original_size && other.compressed_size == @compressed_size && other.relative_header_offset == @relative_header_offset && other.disk_start_number == @disk_start_number end |
#merge(binstr) ⇒ Object
31 32 33 34 35 |
# File 'lib/zip/extra_field/zip64.rb', line 31 def merge(binstr) return if binstr.empty? _, @content = initial_parse(binstr) end |
#pack_for_c_dir ⇒ Object
74 75 76 77 78 79 80 81 82 |
# File 'lib/zip/extra_field/zip64.rb', line 74 def pack_for_c_dir # central directory entries contain only fields that didn't fit in the main entry part packed = (+'').force_encoding('BINARY') packed << [@original_size].pack('Q<') if @original_size packed << [@compressed_size].pack('Q<') if @compressed_size packed << [@relative_header_offset].pack('Q<') if @relative_header_offset packed << [@disk_start_number].pack('V') if @disk_start_number packed end |
#pack_for_local ⇒ Object
66 67 68 69 70 71 72 |
# File 'lib/zip/extra_field/zip64.rb', line 66 def pack_for_local # Local header entries must contain original size and compressed size; # other fields do not apply. return '' unless @original_size && @compressed_size [@original_size, @compressed_size].pack('Q<Q<') end |
#parse(original_size, compressed_size, relative_header_offset = nil, disk_start_number = nil) ⇒ Object
pass the values from the base entry (if applicable) wider values are only present in the extra field for base values set to all FFs returns the final values for the four attributes (from the base or zip64 extra record)
40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/zip/extra_field/zip64.rb', line 40 def parse(original_size, compressed_size, relative_header_offset = nil, disk_start_number = nil) @original_size = extract(8, 'Q<') if original_size == 0xFFFFFFFF @compressed_size = extract(8, 'Q<') if compressed_size == 0xFFFFFFFF if relative_header_offset && relative_header_offset == 0xFFFFFFFF @relative_header_offset = extract(8, 'Q<') end @disk_start_number = extract(4, 'V') if disk_start_number && disk_start_number == 0xFFFF @content = nil [@original_size || original_size, @compressed_size || compressed_size, @relative_header_offset || relative_header_offset, @disk_start_number || disk_start_number] end |
#suppress? ⇒ Boolean
We can suppress the zip64 extra field unless we know the size is large or the relative header offset is large (for central directory entries).
61 62 63 64 |
# File 'lib/zip/extra_field/zip64.rb', line 61 def suppress? !(@original_size && @original_size >= 0xFFFFFFFF) || (@relative_header_offset && @relative_header_offset >= 0xFFFFFFFF) end |