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
define a smattering of the property set guids.
create an inverted map of names to guid/key pairs
# File lib/ole/types/property_set.rb, line 106 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
# File lib/ole/types/property_set.rb, line 125 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
# File lib/ole/types/property_set.rb, line 131 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
# File lib/ole/types/property_set.rb, line 149 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
# File lib/ole/types/property_set.rb, line 114 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
# File lib/ole/types/property_set.rb, line 121 def load_section_list str @sections = str.to_enum(:each_chunk, Section::SIZE).map { |s| Section.new s, self } end
# File lib/ole/types/property_set.rb, line 137 def method_missing name, *args, &block if name.to_s =~ %r(.*)=$/ 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
# File lib/ole/types/property_set.rb, line 160 def to_h inject({}) { |hash, (name, value)| hash.update name.to_sym => value } end