class Zip::ExtraField::Zip64

Info-ZIP Extra for Zip64 size

Constants

HEADER_ID

Attributes

compressed_size[RW]
disk_start_number[RW]
original_size[RW]
relative_header_offset[RW]

Public Class Methods

new(binstr = nil) click to toggle source
# File lib/zip/extra_field/zip64.rb, line 8
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

Public Instance Methods

==(other) click to toggle source
# File lib/zip/extra_field/zip64.rb, line 20
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) click to toggle source
# File lib/zip/extra_field/zip64.rb, line 27
def merge(binstr)
  return if binstr.empty?
  _, @content = initial_parse(binstr)
end
pack_for_c_dir() click to toggle source
# File lib/zip/extra_field/zip64.rb, line 58
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() click to toggle source
# File lib/zip/extra_field/zip64.rb, line 52
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) click to toggle source

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)

# File lib/zip/extra_field/zip64.rb, line 35
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
  @relative_header_offset = extract(8, 'Q<') if relative_header_offset && relative_header_offset == 0xFFFFFFFF
  @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

Private Instance Methods

extract(size, format) click to toggle source
# File lib/zip/extra_field/zip64.rb, line 47
def extract(size, format)
  @content.slice!(0, size).unpack(format)[0]
end