msodumper/msometa.py | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-)
New commits: commit 116c0d51b5fceda5338b5be5d995f304a14ecf4e Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Dec 3 12:31:27 2015 +0100 msometa: dump Dictionary diff --git a/msodumper/msometa.py b/msodumper/msometa.py index e5785e3..de42d87 100644 --- a/msodumper/msometa.py +++ b/msodumper/msometa.py @@ -85,6 +85,7 @@ class SummaryInformationStream(DOCDirStream): class PropertySetStream(DOCDirStream): + """Specified by [MS-OLEPS] 2.21, the stream format for simple property sets.""" def __init__(self, parent, PropertyIds): DOCDirStream.__init__(self, parent.bytes) self.parent = parent @@ -107,15 +108,18 @@ class PropertySetStream(DOCDirStream): GUID(self, "FMTID1").dump() self.printAndSet("Offset1", self.readuInt32()) self.propertyIds = {} - PropertySet(self, self.Offset1).dump() + # The spec says: if NumPropertySets has the value 0x00000002, + # FMTID1 must be set to FMTID_UserDefinedProperties. + PropertySet(self, self.Offset1, userDefined=True).dump() print '</propertySetStream>' class PropertySet(DOCDirStream): - def __init__(self, parent, offset): + def __init__(self, parent, offset, userDefined=False): DOCDirStream.__init__(self, parent.bytes) self.parent = parent self.pos = offset + self.userDefined = userDefined def getCodePage(self): for index, idAndOffset in enumerate(self.idsAndOffsets): @@ -137,9 +141,15 @@ class PropertySet(DOCDirStream): self.idsAndOffsets.append(idAndOffset) self.typedPropertyValues = [] for i in range(self.NumProperties): - typedPropertyValue = TypedPropertyValue(self, i) - typedPropertyValue.dump() - self.typedPropertyValues.append(typedPropertyValue) + if self.userDefined and self.idsAndOffsets[i].PropertyIdentifier == 0x00000000: + # [MS-OLEPS] 2.18.1 says the Dictionary property (id=0 in user-defined sets) has a different type. + dictionary = Dictionary(self, i) + dictionary.dump() + self.typedPropertyValues.append("Dictionary") + else: + typedPropertyValue = TypedPropertyValue(self, i) + typedPropertyValue.dump() + self.typedPropertyValues.append(typedPropertyValue) print '</propertySet>' @@ -232,6 +242,23 @@ PropertyType = { } +class Dictionary(DOCDirStream): + """Specified by [MS-OLEPS] 2.17, represents all mappings between property + identifiers and property names in a property set.""" + def __init__(self, parent, index): + DOCDirStream.__init__(self, parent.bytes) + self.parent = parent + self.index = index + self.pos = parent.posOrig + parent.idsAndOffsets[index].Offset + + def dump(self): + print '<dictionary%s type="Dictionary" offset="%s">' % (self.index, self.pos) + self.printAndSet("NumEntries", self.readuInt32()) + for i in range(self.NumEntries): + print '<todo what="Dictionary::dump: handle DictionaryEntry"/>' + print '</dictionary%s>' % self.index + + class TypedPropertyValue(DOCDirStream): def __init__(self, parent, index): DOCDirStream.__init__(self, parent.bytes) commit 514537d404465068643afde6b800bdb2d3976032 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Dec 3 11:49:41 2015 +0100 msometa: handle VARIANT_BOOL in TypedPropertyValue diff --git a/msodumper/msometa.py b/msodumper/msometa.py index 76eeca8..e5785e3 100644 --- a/msodumper/msometa.py +++ b/msodumper/msometa.py @@ -247,6 +247,8 @@ class TypedPropertyValue(DOCDirStream): self.printAndSet("Value", self.readInt16()) elif self.Type == 0x0003: # VT_I4 self.printAndSet("Value", self.readInt32()) + elif self.Type == 0x000b: # VARIANT_BOOL + self.printAndSet("Value", self.readuInt32()) elif self.Type == 0x0040: # VT_FILETIME FILETIME(self, "Value").dump() elif self.Type == 0x001E: # VT_LPSTR commit f5e5b9bf8c020c3d306e1936cb276685583ba860 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Dec 3 11:26:57 2015 +0100 msometa: handle VT_I4 in TypedPropertyValue diff --git a/msodumper/msometa.py b/msodumper/msometa.py index cdf8c9b..76eeca8 100644 --- a/msodumper/msometa.py +++ b/msodumper/msometa.py @@ -245,10 +245,12 @@ class TypedPropertyValue(DOCDirStream): self.printAndSet("Padding", self.readuInt16()) if self.Type == 0x0002: # VT_I2 self.printAndSet("Value", self.readInt16()) - elif self.Type == 0x001E: # VT_LPSTR - CodePageString(self, "Value").dump() + elif self.Type == 0x0003: # VT_I4 + self.printAndSet("Value", self.readInt32()) elif self.Type == 0x0040: # VT_FILETIME FILETIME(self, "Value").dump() + elif self.Type == 0x001E: # VT_LPSTR + CodePageString(self, "Value").dump() else: print '<todo what="TypedPropertyValue::dump: unhandled Type %s"/>' % hex(self.Type) print '</typedPropertyValue%s>' % self.index _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits