class Zip::ExtraField
Constants
- ID_MAP
Public Class Methods
new(binstr = nil)
click to toggle source
# File lib/zip/extra_field.rb, line 5 def initialize(binstr = nil) merge(binstr) if binstr end
Public Instance Methods
c_dir_size()
click to toggle source
# File lib/zip/extra_field.rb, line 80 def c_dir_size to_c_dir_bin.bytesize end
create(name)
click to toggle source
# File lib/zip/extra_field.rb, line 54 def create(name) unless (field_class = ID_MAP.values.find { |k| k.name == name }) raise Error, "Unknown extra field '#{name}'" end self[name] = field_class.new end
create_unknown_item()
click to toggle source
# File lib/zip/extra_field.rb, line 28 def create_unknown_item s = +'' class << s alias_method :to_c_dir_bin, :to_s alias_method :to_local_bin, :to_s end self['Unknown'] = s end
extra_field_type_exist(binstr, id, len, index)
click to toggle source
# File lib/zip/extra_field.rb, line 9 def extra_field_type_exist(binstr, id, len, index) field_name = ID_MAP[id].name if member?(field_name) self[field_name].merge(binstr[index, len + 4]) else field_obj = ID_MAP[id].new(binstr[index, len + 4]) self[field_name] = field_obj end end
extra_field_type_unknown(binstr, len, index)
click to toggle source
# File lib/zip/extra_field.rb, line 19 def extra_field_type_unknown(binstr, len, index) create_unknown_item unless self['Unknown'] if !len || len + 4 > binstr[index..-1].bytesize self['Unknown'] << binstr[index..-1] return end self['Unknown'] << binstr[index, len + 4] end
local_size()
click to toggle source
# File lib/zip/extra_field.rb, line 84 def local_size to_local_bin.bytesize end
merge(binstr)
click to toggle source
# File lib/zip/extra_field.rb, line 37 def merge(binstr) return if binstr.empty? i = 0 while i < binstr.bytesize id = binstr[i, 2] len = binstr[i + 2, 2].to_s.unpack1('v') if id && ID_MAP.member?(id) extra_field_type_exist(binstr, id, len, i) elsif id create_unknown_item unless self['Unknown'] break unless extra_field_type_unknown(binstr, len, i) end i += len + 4 end end
ordered_values()
click to toggle source
place Unknown last, so “extra” data that is missing the proper signature/size does not prevent known fields from being read back in
# File lib/zip/extra_field.rb, line 64 def ordered_values result = [] each { |k, v| k == 'Unknown' ? result.push(v) : result.unshift(v) } result end
to_c_dir_bin()
click to toggle source
# File lib/zip/extra_field.rb, line 76 def to_c_dir_bin ordered_values.map! { |v| v.to_c_dir_bin.force_encoding('BINARY') }.join end
to_local_bin()
click to toggle source
# File lib/zip/extra_field.rb, line 70 def to_local_bin ordered_values.map! { |v| v.to_local_bin.force_encoding('BINARY') }.join end
Also aliased as: to_s