Class: Zip::ExtraField::Zip64

Inherits:
Generic
  • Object
show all
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

Instance Method Summary collapse

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_sizeObject

:nodoc:



6
7
8
# File 'lib/zip/extra_field/zip64.rb', line 6

def compressed_size
  @compressed_size
end

#disk_start_numberObject

:nodoc:



6
7
8
# File 'lib/zip/extra_field/zip64.rb', line 6

def disk_start_number
  @disk_start_number
end

#original_sizeObject

:nodoc:



6
7
8
# File 'lib/zip/extra_field/zip64.rb', line 6

def original_size
  @original_size
end

#relative_header_offsetObject

: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_dirObject



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_localObject



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).

Returns:

  • (Boolean)


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