class Ole::Types::PropertySet
The PropertySet class currently supports readonly access to the properties serialized in “property set” streams, such as the file “005SummaryInformation”, in OLE files.
Think it has its roots in MFC property set serialization.
See poi.apache.org/hpsf/internals.html for details
Constants
- DATA
define a smattering of the property set guids.
- HEADER_PACK
- HEADER_SIZE
- OS_MAP
- PROPERTY_MAP
create an inverted map of names to guid/key pairs
Attributes
guid[R]
io[R]
os[R]
sections[R]
signature[R]
unknown[R]
Public Class Methods
new(io)
click to toggle source
# File lib/ole/types/property_set.rb, line 141 def initialize io @io = io load_header io.read(HEADER_SIZE) load_section_list io.read(@num_sections * Section::SIZE) # expect no gap between last section and start of data. #Log.warn "gap between section list and property data" unless io.pos == @sections.map(&:offset).min end
Public Instance Methods
[](key)
click to toggle source
# File lib/ole/types/property_set.rb, line 160 def [] key pair = PROPERTY_MAP[key.to_s] or return nil section = @sections.find { |s| s.guid == pair.first } or return nil section[pair.last] end
[]=(key, value)
click to toggle source
# File lib/ole/types/property_set.rb, line 166 def []= key, value pair = PROPERTY_MAP[key.to_s] or return nil section = @sections.find { |s| s.guid == pair.first } or return nil section[pair.last] = value end
each() { |name, value| ... }
click to toggle source
# File lib/ole/types/property_set.rb, line 184 def each @sections.each do |section| next unless pair = DATA[section.guid] map = pair.last section.each do |id, value| name = map[id] or next yield name, value end end end
load_header(str)
click to toggle source
# File lib/ole/types/property_set.rb, line 149 def load_header str @signature, @unknown, @os_id, @guid, @num_sections = str.unpack HEADER_PACK # should i check that unknown == 0? it usually is. so is the guid actually @guid = Clsid.load @guid @os = OS_MAP[@os_id] || Log.warn("unknown operating system id #{@os_id}") end
load_section_list(str)
click to toggle source
# File lib/ole/types/property_set.rb, line 156 def load_section_list str @sections = str.to_enum(:each_chunk, Section::SIZE).map { |s| Section.new s, self } end
method_missing(name, *args, &block)
click to toggle source
Calls superclass method
# File lib/ole/types/property_set.rb, line 172 def method_missing name, *args, &block if name.to_s =~ /(.*)=$/ return super unless args.length == 1 return super unless PROPERTY_MAP[$1] self[$1] = args.first else return super unless args.length == 0 return super unless PROPERTY_MAP[name.to_s] self[name] end end
to_h()
click to toggle source
# File lib/ole/types/property_set.rb, line 195 def to_h inject({}) { |hash, (name, value)| hash.update name.to_sym => value } end