Class: Zip::ExtraField
  
  
  
  
  
    - Inherits:
- 
      Hash
      
        
          - Object
- Hash
- Zip::ExtraField
 show all
    - Defined in:
- lib/zip/extra_field.rb
 
Defined Under Namespace
  
    
  
    
      Classes: Generic, IUnix, UniversalTime
    
  
  
    
      Constant Summary
      collapse
    
    
      
        - ID_MAP =
          
        
- {}
      Instance Method Summary
      collapse
    
    
  
  
  Constructor Details
  
    
  
  
    #initialize(binstr = nil)  ⇒ ExtraField 
  
  
  
  
    
Returns a new instance of ExtraField.
   
 
  
  
    | 
5
6
7 | # File 'lib/zip/extra_field.rb', line 5
def initialize(binstr = nil)
  binstr and merge(binstr)
end | 
 
  
 
  
    Instance Method Details
    
      
  
  
    #c_dir_length  ⇒ Object 
  
  
    Also known as:
    c_dir_size
    
  
  
  
    | 
70
71
72 | # File 'lib/zip/extra_field.rb', line 70
def c_dir_length
  to_c_dir_bin.bytesize
end | 
 
    
      
  
  
    #create(name)  ⇒ Object 
  
  
  
  
    | 
53
54
55
56
57
58 | # File 'lib/zip/extra_field.rb', line 53
def create(name)
  unless field_class = ID_MAP.values.find { |k| k.name == name }
    raise ZipError, "Unknown extra field '#{name}'"
  end
  self[name] = field_class.new
end | 
 
    
      
  
  
    #create_unknown_item  ⇒ Object 
  
  
  
  
    | 
28
29
30
31
32
33
34
35 | # 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 | 
 
    
      
  
  
    | 
9
10
11
12
13
14
15
16
17 | # File 'lib/zip/extra_field.rb', line 9
def (binstr, id, len, i)
  field_name = ID_MAP[id].name
  if self.member?(field_name)
    self[field_name].merge(binstr[i, len + 4])
  else
    field_obj        = ID_MAP[id].new(binstr[i, len + 4])
    self[field_name] = field_obj
  end
end | 
 
    
      
  
  
    | 
19
20
21
22
23
24
25
26 | # File 'lib/zip/extra_field.rb', line 19
def (binstr, len, i)
  create_unknown_item unless self['Unknown']
  if !len || len + 4 > binstr[i..-1].bytesize
    self['Unknown'] << binstr[i..-1]
    return
  end
  self['Unknown'] << binstr[i, len + 4]
end | 
 
    
      
  
  
    #local_length  ⇒ Object 
  
  
    Also known as:
    local_size, length, size
    
  
  
  
    | 
74
75
76 | # File 'lib/zip/extra_field.rb', line 74
def local_length
  to_local_bin.bytesize
end | 
 
    
      
  
  
    #merge(binstr)  ⇒ Object 
  
  
  
  
    | 
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 | # 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.unpack('v').first
    if id && ID_MAP.member?(id)
      (binstr, id, len, i)
    elsif id
      create_unknown_item unless self['Unknown']
      break unless (binstr, len, i)
    end
    i += len + 4
  end
end | 
 
    
      
  
  
    #to_c_dir_bin  ⇒ Object 
  
  
  
  
    | 
66
67
68 | # File 'lib/zip/extra_field.rb', line 66
def to_c_dir_bin
  self.map { |_, v| v.to_c_dir_bin }.join
end | 
 
    
      
  
  
    #to_local_bin  ⇒ Object 
  
  
    Also known as:
    to_s
    
  
  
  
    | 
60
61
62 | # File 'lib/zip/extra_field.rb', line 60
def to_local_bin
  self.map { |_, v| v.to_local_bin }.join
end |