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.



8
9
10
11
12
13
14
15
16
17
18
# 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

Instance Attribute Details

#compressed_sizeObject

Returns the value of attribute compressed_size.



4
5
6
# File 'lib/zip/extra_field/zip64.rb', line 4

def compressed_size
  @compressed_size
end

#disk_start_numberObject

Returns the value of attribute disk_start_number.



4
5
6
# File 'lib/zip/extra_field/zip64.rb', line 4

def disk_start_number
  @disk_start_number
end

#original_sizeObject

Returns the value of attribute original_size.



4
5
6
# File 'lib/zip/extra_field/zip64.rb', line 4

def original_size
  @original_size
end

#relative_header_offsetObject

Returns the value of attribute relative_header_offset.



4
5
6
# File 'lib/zip/extra_field/zip64.rb', line 4

def relative_header_offset
  @relative_header_offset
end

Instance Method Details

#==(other) ⇒ Object



20
21
22
23
24
25
# 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) ⇒ Object



27
28
29
30
31
# File 'lib/zip/extra_field/zip64.rb', line 27

def merge(binstr)
  return if binstr.empty?

  _, @content = initial_parse(binstr)
end

#pack_for_c_dirObject



60
61
62
63
64
65
66
67
68
# File 'lib/zip/extra_field/zip64.rb', line 60

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



53
54
55
56
57
58
# File 'lib/zip/extra_field/zip64.rb', line 53

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)



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/zip/extra_field/zip64.rb', line 36

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