src/docdirstream.py | 9 +- src/docrecord.py | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/docstream.py | 64 ++++++++++++++++-- 3 files changed, 242 insertions(+), 9 deletions(-)
New commits: commit 75b68567423ace986c8aec7d02dd0b0be084c4f0 Author: Miklos Vajna <vmik...@suse.cz> Date: Thu Nov 22 12:14:05 2012 +0100 dump Copts60 diff --git a/src/docrecord.py b/src/docrecord.py index d3fdbd6..e19843a 100755 --- a/src/docrecord.py +++ b/src/docrecord.py @@ -595,6 +595,184 @@ class Clx(DOCDirStream): print '<todo what="Clx::dump() first byte is not 0x02"/>' print '</clx>' +class DopBase(DOCDirStream): + """The DopBase structure contains document and compatibility settings.""" + def __init__(self, dop): + DOCDirStream.__init__(self, dop.bytes) + self.pos = dop.pos + self.dop = dop + + def dump(self): + posorig = self.pos + buf = self.getuInt8() + self.pos += 1 + self.printAndSet("fFacingPages", self.getBit(buf, 0)) + self.printAndSet("unused1", self.getBit(buf, 1)) + self.printAndSet("fPMHMainDoc", self.getBit(buf, 2)) + self.printAndSet("unused2", (buf & 0x18) >> 3) # 4..5th bits + self.printAndSet("fpc", (buf & 0x60) >> 5) # 6..7th bits + self.printAndSet("unused3", self.getBit(buf, 7)) + + self.printAndSet("unused4", self.getuInt8()) + self.pos += 1 + + buf = self.getuInt16() + self.pos += 2 + self.printAndSet("rncFtn", buf & 0x03) # 1..2nd bits + self.printAndSet("nFtn", (buf & 0xfffc) >> 2) # 3..16th bits + + buf = self.getuInt8() + self.pos += 1 + self.printAndSet("unused5", self.getBit(buf, 0)) + self.printAndSet("unused6", self.getBit(buf, 1)) + self.printAndSet("unused7", self.getBit(buf, 2)) + self.printAndSet("unused8", self.getBit(buf, 3)) + self.printAndSet("unused9", self.getBit(buf, 4)) + self.printAndSet("unused10", self.getBit(buf, 5)) + self.printAndSet("fSplAllDone", self.getBit(buf, 6)) + self.printAndSet("fSplAllClean", self.getBit(buf, 7)) + + buf = self.getuInt8() + self.pos += 1 + self.printAndSet("fSplHideErrors", self.getBit(buf, 0)) + self.printAndSet("fGramHideErrors", self.getBit(buf, 1)) + self.printAndSet("fLabelDoc", self.getBit(buf, 2)) + self.printAndSet("fHyphCapitals", self.getBit(buf, 3)) + self.printAndSet("fAutoHyphen", self.getBit(buf, 4)) + self.printAndSet("fFormNoFields", self.getBit(buf, 5)) + self.printAndSet("fLinkStyles", self.getBit(buf, 6)) + self.printAndSet("fRevMarking", self.getBit(buf, 7)) + + buf = self.getuInt8() + self.pos += 1 + self.printAndSet("unused11", self.getBit(buf, 0)) + self.printAndSet("fExactCWords", self.getBit(buf, 1)) + self.printAndSet("fPagHidden", self.getBit(buf, 2)) + self.printAndSet("fPagResults", self.getBit(buf, 3)) + self.printAndSet("fLockAtn", self.getBit(buf, 4)) + self.printAndSet("fMirrorMargins", self.getBit(buf, 5)) + self.printAndSet("fWord97Compat", self.getBit(buf, 6)) + self.printAndSet("unused12", self.getBit(buf, 7)) + + buf = self.getuInt8() + self.pos += 1 + self.printAndSet("unused13", self.getBit(buf, 0)) + self.printAndSet("fProtEnabled", self.getBit(buf, 1)) + self.printAndSet("fDispFormFldSel", self.getBit(buf, 2)) + self.printAndSet("fRMView", self.getBit(buf, 3)) + self.printAndSet("fRMPrint", self.getBit(buf, 4)) + self.printAndSet("fLockVbaProj", self.getBit(buf, 5)) + self.printAndSet("fLockRev", self.getBit(buf, 6)) + self.printAndSet("fEmbedFonts", self.getBit(buf, 7)) + + # Copts60 first byte + buf = self.getuInt8() + self.pos += 1 + self.printAndSet("fNoTabForInd", self.getBit(buf, 0)) + self.printAndSet("fNoSpaceRaiseLower", self.getBit(buf, 1)) + self.printAndSet("fSuppressSpBfAfterPgBrk", self.getBit(buf, 2)) + self.printAndSet("fWrapTrailSpaces", self.getBit(buf, 3)) + self.printAndSet("fMapPrintTextColor", self.getBit(buf, 4)) + self.printAndSet("fNoColumnBalance", self.getBit(buf, 5)) + self.printAndSet("fConvMailMergeEsc", self.getBit(buf, 6)) + self.printAndSet("fSuppressTopSpacing", self.getBit(buf, 7)) + + # Copts60 second byte + buf = self.getuInt8() + self.pos += 1 + self.printAndSet("fOrigWordTableRules", self.getBit(buf, 0)) + self.printAndSet("unused14", self.getBit(buf, 1)) + self.printAndSet("fShowBreaksInFrames", self.getBit(buf, 2)) + self.printAndSet("fSwapBordersFacingPgs", self.getBit(buf, 3)) + self.printAndSet("fLeaveBackslashAlone", self.getBit(buf, 4)) + self.printAndSet("fExpShRtn", self.getBit(buf, 5)) + self.printAndSet("fDntULTrlSpc", self.getBit(buf, 6)) + self.printAndSet("fDntBlnSbDbWid", self.getBit(buf, 7)) + + print '<debug offset="%d"/>' % (self.pos - posorig) + +class Dop95(DOCDirStream): + """The Dop95 structure contains document and compatibility settings.""" + def __init__(self, dop): + DOCDirStream.__init__(self, dop.bytes) + self.pos = dop.pos + self.dop = dop + + def dump(self): + DopBase(self).dump() + self.pos += 84 + +class Dop97(DOCDirStream): + """The Dop97 structure contains document and compatibility settings.""" + def __init__(self, dop): + DOCDirStream.__init__(self, dop.bytes) + self.pos = dop.pos + self.dop = dop + + def dump(self): + Dop95(self).dump() + self.pos += 88 + +class Dop2000(DOCDirStream): + """The Dop2000 structure contains document and compatibility settings.""" + def __init__(self, dop): + DOCDirStream.__init__(self, dop.bytes) + self.pos = dop.pos + self.dop = dop + + def dump(self): + Dop97(self).dump() + self.pos += 500 + +class Dop2002(DOCDirStream): + """The Dop2002 structure contains document and compatibility settings.""" + def __init__(self, dop): + DOCDirStream.__init__(self, dop.bytes) + self.pos = dop.pos + self.dop = dop + + def dump(self): + Dop2000(self).dump() + self.pos += 544 + +class Dop2003(DOCDirStream): + """The Dop2003 structure contains document and compatibility settings.""" + def __init__(self, dop): + DOCDirStream.__init__(self, dop.bytes) + self.pos = dop.pos + self.dop = dop + + def dump(self): + Dop2002(self).dump() + self.pos += 594 + +class Dop2007(DOCDirStream): + """The Dop2007 structure contains document and compatibility settings.""" + def __init__(self, dop): + DOCDirStream.__init__(self, dop.bytes) + self.pos = dop.pos + self.dop = dop + + def dump(self): + Dop2003(self).dump() + self.pos += 616 + +class Dop(DOCDirStream): + """The Dop structure contains the document and compatibility settings for the document.""" + def __init__(self, fib): + DOCDirStream.__init__(self, fib.doc.getDirectoryStreamByName("1Table").bytes) + self.pos = fib.fcDop + self.size = fib.lcbDop + self.fib = fib + + def dump(self): + print '<dop type="Dop" offset="%s" size="%d bytes">' % (self.pos, self.size) + if self.fib.nFibNew == 0x0112: + Dop2007(self).dump() + else: + print """<todo what="Dop.dump() doesn't know how to handle nFibNew = %s">""" % hex(self.nFibNew) + print '</dop>' + class FFID(DOCDirStream): """The FFID structure specifies the font family and character pitch for a font.""" def __init__(self, bytes, offset): diff --git a/src/docstream.py b/src/docstream.py index 1b7731c..37421bb 100755 --- a/src/docstream.py +++ b/src/docstream.py @@ -65,15 +65,28 @@ class WordDocumentStream(DOCDirStream): self.dumpFibRgLw97("fibRgLw") self.printAndSet("cbRgFcLcb", self.getuInt16()) self.pos += 2 - pos = self.pos + + self.blobOffset = self.pos + self.nFibNew = self.__getFibNew() self.dumpFibRgFcLcb("fibRgFcLcbBlob") - self.pos = pos + (8 * self.cbRgFcLcb) + self.pos = self.__getCswNewOffset() + self.printAndSet("cswNew", self.getuInt16(), offset = True) self.pos += 2 if self.cswNew != 0: self.dumpFibRgCswNew("fibRgCswNew") print '</fib>' + def __getFibNew(self): + cswNew = self.getuInt16(pos = self.__getCswNewOffset()) + if cswNew == 0: + raise Exception() + else: + return self.getuInt16(pos = self.__getCswNewOffset() + 2) + + def __getCswNewOffset(self): + return self.blobOffset + (8 * self.cbRgFcLcb) + def dumpFibRgCswNew(self, name): print '<%s type="FibRgCswNew" size="%d bytes">' % (name, self.cswNew) self.printAndSet("nFibNew", self.getuInt16()) @@ -285,7 +298,7 @@ class WordDocumentStream(DOCDirStream): ["fcWss"], ["lcbWss"], ["fcDop"], - ["lcbDop"], + ["lcbDop", self.handleDop], ["fcSttbfAssoc"], ["lcbSttbfAssoc"], ["fcClx"], @@ -423,6 +436,9 @@ class WordDocumentStream(DOCDirStream): print '<todo what="value is non-zero and unhandled"/>' print '</%s>' % i[0] + def handleDop(self): + docrecord.Dop(self).dump() + def handleLcbClx(self): offset = self.fcClx size = self.lcbClx commit 170de485264ecf90cd746433e9bb4f0870c4b6a1 Author: Miklos Vajna <vmik...@suse.cz> Date: Thu Nov 22 11:13:59 2012 +0100 dump FibRgCswNew diff --git a/src/docdirstream.py b/src/docdirstream.py index 04c1c31..d4d16a4 100755 --- a/src/docdirstream.py +++ b/src/docdirstream.py @@ -20,14 +20,17 @@ class DOCDirStream: self.mainStream = mainStream self.doc = doc - def printAndSet(self, key, value, hexdump = True, end = True): + def printAndSet(self, key, value, hexdump = True, end = True, offset = False): setattr(self, key, value) if hexdump: value = hex(value) + offstr = "" + if offset: + offstr += ' offset="%s"' % hex(self.pos) if end: - print '<%s value="%s"/>' % (key, value) + print '<%s value="%s"%s/>' % (key, value, offstr) else: - print '<%s value="%s">' % (key, value) + print '<%s value="%s"%s>' % (key, value, offstr) def getuInt8(self, bytes = None, pos = None): if not bytes: diff --git a/src/docstream.py b/src/docstream.py index 66fed15..1b7731c 100755 --- a/src/docstream.py +++ b/src/docstream.py @@ -65,15 +65,44 @@ class WordDocumentStream(DOCDirStream): self.dumpFibRgLw97("fibRgLw") self.printAndSet("cbRgFcLcb", self.getuInt16()) self.pos += 2 + pos = self.pos self.dumpFibRgFcLcb("fibRgFcLcbBlob") - self.printAndSet("cswNew", self.getuInt16()) + self.pos = pos + (8 * self.cbRgFcLcb) + self.printAndSet("cswNew", self.getuInt16(), offset = True) self.pos += 2 + if self.cswNew != 0: + self.dumpFibRgCswNew("fibRgCswNew") print '</fib>' + def dumpFibRgCswNew(self, name): + print '<%s type="FibRgCswNew" size="%d bytes">' % (name, self.cswNew) + self.printAndSet("nFibNew", self.getuInt16()) + self.pos += 2 + if self.nFibNew == 0x0112: + self.dumpFibRgCswNewData2007("fibRgCswNewData2007") + else: + print """<todo what="dumpFibRgCswNew() doesn't know how to handle nFibNew = %s">""" % hex(self.nFibNew) + print '</%s>' % name + + def __dumpFibRgCswNewData2000(self): + self.printAndSet("cQuickSavesNew", self.getuInt16()) + self.pos += 2 + + def dumpFibRgCswNewData2007(self, name): + print '<%s type="FibRgCswNewData2007" size="%d bytes">' % (name, 8) + self.__dumpFibRgCswNewData2000() + self.printAndSet("lidThemeOther", self.getuInt16()) + self.pos += 2 + self.printAndSet("lidThemeFE", self.getuInt16()) + self.pos += 2 + self.printAndSet("lidThemeCS", self.getuInt16()) + self.pos += 2 + print '</%s>' % name + def dumpFibBase(self, name): print '<%s type="FibBase" size="32 bytes">' % name - self.printAndSet("wIndent", self.getuInt16()) + self.printAndSet("wIdent", self.getuInt16()) self.pos += 2 self.printAndSet("nFib", self.getuInt16()) @@ -385,7 +414,7 @@ class WordDocumentStream(DOCDirStream): hasHandler = len(i) > 1 # a member needs handling if it defines the size of a struct and it's non-zero needsHandling = i[0].startswith("lcb") and value != 0 - self.printAndSet(i[0], self.getuInt32(), end = ((not hasHandler) and (not needsHandling))) + self.printAndSet(i[0], self.getuInt32(), end = ((not hasHandler) and (not needsHandling)), offset = True) self.pos += 4 if hasHandler or needsHandling: if hasHandler: commit 321935e6a5f2bc7045f08573aea1882ef15711b5 Author: Miklos Vajna <vmik...@suse.cz> Date: Thu Nov 22 10:14:01 2012 +0100 docstream: print a todo for all pointers pointing to a non-zero struct diff --git a/src/docstream.py b/src/docstream.py index 94ed4ba..66fed15 100755 --- a/src/docstream.py +++ b/src/docstream.py @@ -381,10 +381,17 @@ class WordDocumentStream(DOCDirStream): ["lcbSttbfUssr"], ] for i in fields: - self.printAndSet(i[0], self.getuInt32(), end = len(i) == 1) + value = self.getuInt32() + hasHandler = len(i) > 1 + # a member needs handling if it defines the size of a struct and it's non-zero + needsHandling = i[0].startswith("lcb") and value != 0 + self.printAndSet(i[0], self.getuInt32(), end = ((not hasHandler) and (not needsHandling))) self.pos += 4 - if len(i) > 1: - i[1]() + if hasHandler or needsHandling: + if hasHandler: + i[1]() + else: + print '<todo what="value is non-zero and unhandled"/>' print '</%s>' % i[0] def handleLcbClx(self): _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits