Class: Zip::ZipExtraField

Inherits:
Hash
  • Object
show all
Defined in:
lib/zip/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) ⇒ ZipExtraField

start main of ZipExtraField < Hash



130
131
132
# File 'lib/zip/zip_extra_field.rb', line 130

def initialize(binstr = nil)
  binstr and merge(binstr)
end

Instance Method Details

#c_dir_lengthObject Also known as: c_dir_size



198
199
200
# File 'lib/zip/zip_extra_field.rb', line 198

def c_dir_length
  to_c_dir_bin.bytesize
end

#create(name) ⇒ Object



167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/zip/zip_extra_field.rb', line 167

def create(name)
  field_class = nil
  ID_MAP.each { |id, klass|
    if klass.name == name
      field_class = klass
      break
    end
  }
  if ! field_class
    raise ZipError, "Unknown extra field '#{name}'"
  end
  self[name] = field_class.new()
end

#local_lengthObject Also known as: local_size, length, size



201
202
203
# File 'lib/zip/zip_extra_field.rb', line 201

def local_length
  to_local_bin.bytesize
end

#merge(binstr) ⇒ Object



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/zip/zip_extra_field.rb', line 134

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")[0]
    if id && ID_MAP.member?(id)
      field_name = ID_MAP[id].name
      if self.member?(field_name)
        self[field_name].mergea(binstr[i, len + 4])
      else
        field_obj = ID_MAP[id].new(binstr[i, len + 4])
        self[field_name] = field_obj
      end
    elsif id
      unless self["Unknown"]
        s = ""
        class << s
          alias_method :to_c_dir_bin, :to_s
          alias_method :to_local_bin, :to_s
        end
        self["Unknown"] = s
      end
      if !len || len + 4 > binstr[i..-1].bytesize
        self["Unknown"] << binstr[i..-1]
        break
      end
      self["Unknown"] << binstr[i, len + 4]
    end
    i += len + 4
  end
end

#to_c_dir_binObject



190
191
192
193
194
195
196
# File 'lib/zip/zip_extra_field.rb', line 190

def to_c_dir_bin
  s = ""
  each do |k, v|
    s << v.to_c_dir_bin
  end
  s
end

#to_local_binObject Also known as: to_s



181
182
183
184
185
186
187
# File 'lib/zip/zip_extra_field.rb', line 181

def to_local_bin
  s = ""
  each do |k, v|
    s << v.to_local_bin
  end
  s
end