Class Ole::Storage::Header
In: lib/ole/storage/base.rb
Parent: Struct.new( :magic, :clsid, :minor_ver, :major_ver, :byte_order, :b_shift, :s_shift, :reserved, :csectdir, :num_bat, :dirent_start, :transacting_signature, :threshold, :sbat_start, :num_sbat, :mbat_start, :num_mbat
String Data Lpstr Clsid Lpwstr Section Enumerable DateTime FileTime Constants Variant::Constants Storage\n[lib/ole/storage/base.rb\nlib/ole/storage/file_system.rb\nlib/ole/storage/meta_data.rb] PropertySet lib/ole/storage/file_system.rb lib/ole/types/property_set.rb lib/ole/types/base.rb Constants Constants Variant Types Ole dot/m_9_0.png

A class which wraps the ole header

Header.new can be both used to load from a string, or to create from defaults. Serialization is accomplished with the to_s method.

Methods

new   to_s   validate!  

Constants

PACK = 'a8 a16 v2 a2 v2 a6 V3 a4 V5'
SIZE = 0x4c
MAGIC = "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1"   i have seen it pointed out that the first 4 bytes of hex, 0xd0cf11e0, is supposed to spell out docfile. hmmm :)
EOC = 0xfffffffe   what you get if creating new header from scratch. AllocationTable::EOC isn‘t available yet. meh.
DEFAULT = [ MAGIC, 0.chr * 16, 59, 3, "\xfe\xff", 9, 6, 0.chr * 6, 0, 1, EOC, 0.chr * 4, 4096, EOC, 0, EOC, 0

Public Class methods

[Source]

     # File lib/ole/storage/base.rb, line 362
362:                         def initialize values=DEFAULT
363:                                 values = values.unpack(PACK) if String === values
364:                                 super(*values)
365:                                 validate!
366:                         end

Public Instance methods

[Source]

     # File lib/ole/storage/base.rb, line 368
368:                         def to_s
369:                                 to_a.pack PACK
370:                         end

[Source]

     # File lib/ole/storage/base.rb, line 372
372:                         def validate!
373:                                 raise FormatError, "OLE2 signature is invalid" unless magic == MAGIC
374:                                 if num_bat == 0 or # is that valid for a completely empty file?
375:                                          # not sure about this one. basically to do max possible bat given size of mbat
376:                                          num_bat > 109 && num_bat > 109 + num_mbat * (1 << b_shift - 2) or
377:                                          # shouldn't need to use the mbat as there is enough space in the header block
378:                                          num_bat < 109 && num_mbat != 0 or
379:                                          # given the size of the header is 76, if b_shift <= 6, blocks address the header.
380:                                          s_shift > b_shift or b_shift <= 6 or b_shift >= 31 or
381:                                          # we only handle little endian
382:                                          byte_order != "\xfe\xff"
383:                                         raise FormatError, "not valid OLE2 structured storage file"
384:                                 end
385:                                 # relaxed this, due to test-msg/qwerty_[1-3]*.msg they all had
386:                                 # 3 for this value. 
387:                                 # transacting_signature != "\x00" * 4 or
388:                                 if threshold != 4096 or
389:                                          num_mbat == 0 && mbat_start != AllocationTable::EOC or
390:                                          reserved != "\x00" * 6
391:                                         Log.warn "may not be a valid OLE2 structured storage file"
392:                                 end
393:                                 true
394:                         end

[Validate]