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).
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
67 68 69 70 71 72 73 74 75 |
# File 'lib/zip/extra_field/zip64.rb', line 67 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
59 60 61 62 63 64 65 |
# File 'lib/zip/extra_field/zip64.rb', line 59 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 |