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



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_localObject



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