src/docrecord.py | 168 +++++++++++++++++++++++++++++++++++++++---------------- src/docstream.py | 13 +++- 2 files changed, 132 insertions(+), 49 deletions(-)
New commits: commit 7ad6658a750bdbb7183df2b301d56bf4c9b42696 Author: Miklos Vajna <vmik...@suse.cz> Date: Sat Dec 1 17:42:40 2012 +0100 doc: no more asserts with hardcoded numbers diff --git a/src/docrecord.py b/src/docrecord.py index c7dc5bd..0da17f8 100644 --- a/src/docrecord.py +++ b/src/docrecord.py @@ -786,6 +786,7 @@ class GRFSTD(DOCDirStream): class DopBase(DOCDirStream): """The DopBase structure contains document and compatibility settings.""" + size = 84 def __init__(self, dop): DOCDirStream.__init__(self, dop.bytes) self.pos = dop.pos @@ -896,6 +897,8 @@ class DopBase(DOCDirStream): self.printAndSet("unused16", self.getBit(buf, 14)) self.printAndSet("iGutterPos", self.getBit(buf, 15)) print '</dopBase>' + assert self.pos == self.dop.pos + DopBase.size + self.dop.pos = self.pos class Copts80(DOCDirStream): """The Copts80 structure specifies compatibility options.""" @@ -931,12 +934,14 @@ class Copts80(DOCDirStream): class Copts(DOCDirStream): """A structure that specifies compatibility options.""" + size = 32 def __init__(self, dop): DOCDirStream.__init__(self, dop.bytes) self.pos = dop.pos + self.dop = dop def dump(self): - print '<copts type="Copts" offset="%d" size="32 bytes">' % self.pos + print '<copts type="Copts" offset="%d" size="%d bytes">' % (self.pos, Copts.size) Copts80(self).dump() self.pos += 4 @@ -989,9 +994,12 @@ class Copts(DOCDirStream): self.printAndSet("empty5", self.readuInt32()) self.printAndSet("empty6", self.readuInt32()) print '</copts>' + assert self.pos == self.dop.pos + Copts.size + self.dop.pos = self.pos class Dop95(DOCDirStream): """The Dop95 structure contains document and compatibility settings.""" + size = 88 def __init__(self, dop): DOCDirStream.__init__(self, dop.bytes) self.pos = dop.pos @@ -1001,17 +1009,19 @@ class Dop95(DOCDirStream): print '<dop95 type="Dop95" offset="%d" size="88 bytes">' % self.pos dopBase = DopBase(self) dopBase.dump() - assert dopBase.pos == self.pos + 84 - self.pos += 84 Copts80(self).dump() self.pos += 4 print '</dop95>' + assert self.pos == self.dop.pos + Dop95.size + self.dop.pos = self.pos class DopTypography(DOCDirStream): """The DopTypography structure contains East Asian language typography settings.""" + size = 310 def __init__(self, dop): DOCDirStream.__init__(self, dop.bytes) self.pos = dop.pos + self.dop = dop def dump(self): print '<dopTypography type="DopTypography" offset="%d" size="310 bytes">' % self.pos @@ -1036,15 +1046,19 @@ class DopTypography(DOCDirStream): else: self.pos += 102 print '</dopTypography>' + assert self.pos == self.dop.pos + DopTypography.size + self.dop.pos = self.pos class Dogrid(DOCDirStream): """The Dogrid structure specifies parameters for the drawn object properties of the document.""" + size = 10 def __init__(self, dop): DOCDirStream.__init__(self, dop.bytes) self.pos = dop.pos + self.dop = dop def dump(self): - print '<dogrid type="Dogrid" offset="%d" size="10 bytes">' % self.pos + print '<dogrid type="Dogrid" offset="%d" size="%d bytes">' % (self.pos, Dogrid.size) self.printAndSet("xaGrid", self.readuInt16()) self.printAndSet("yaGrid", self.readuInt16()) self.printAndSet("dxaGrid", self.readuInt16()) @@ -1058,6 +1072,8 @@ class Dogrid(DOCDirStream): self.printAndSet("dxGridDisplay", (buf & 0x7f)) # 1..7th bits self.printAndSet("fFollowMargins", self.getBit(buf, 7)) print '</dogrid>' + assert self.pos == self.dop.pos + Dogrid.size + self.dop.pos = self.pos class Asumyi(DOCDirStream): """The Asumyi structure specifies AutoSummary state information""" @@ -1081,27 +1097,22 @@ class Asumyi(DOCDirStream): class Dop97(DOCDirStream): """The Dop97 structure contains document and compatibility settings.""" + size = 500 def __init__(self, dop): DOCDirStream.__init__(self, dop.bytes) self.pos = dop.pos self.dop = dop def dump(self): - print '<dop97 type="Dop97" offset="%d" size="500 bytes">' % self.pos + print '<dop97 type="Dop97" offset="%d" size="%d bytes">' % (self.pos, Dop97.size) dop95 = Dop95(self) dop95.dump() - assert dop95.pos == self.pos + 88 - self.pos += 88 self.printAndSet("adt", self.readuInt16()) dopTypography = DopTypography(self) dopTypography.dump() - assert dopTypography.pos == self.pos + 310 - self.pos += 310 dogrid = Dogrid(self) dogrid.dump() - assert dogrid.pos == self.pos + 10 - self.pos += 10 buf = self.readuInt8() self.printAndSet("unused1", self.getBit(buf, 0)) @@ -1152,9 +1163,12 @@ class Dop97(DOCDirStream): self.printAndSet("hpsZoomFontPag", self.readuInt16()) self.printAndSet("dywDispPag", self.readuInt16()) print '</dop97>' + assert self.pos == self.dop.pos + Dop97.size + self.dop.pos = self.pos class Dop2000(DOCDirStream): """The Dop2000 structure contains document and compatibility settings.""" + size = 544 def __init__(self, dop): DOCDirStream.__init__(self, dop.bytes) self.pos = dop.pos @@ -1164,8 +1178,6 @@ class Dop2000(DOCDirStream): print '<dop2000 type="Dop2000" offset="%d" size="544 bytes">' % self.pos dop97 = Dop97(self) dop97.dump() - assert dop97.pos == self.pos + 500 - self.pos += 500 self.printAndSet("ilvlLastBulletMain", self.readuInt8()) self.printAndSet("ilvlLastNumberMain", self.readuInt8()) @@ -1196,8 +1208,6 @@ class Dop2000(DOCDirStream): copts = Copts(self) copts.dump() - assert copts.pos == self.pos + 32 - self.pos += 32 self.printAndSet("verCompatPre10", self.readuInt16()) buf = self.readuInt8() @@ -1220,20 +1230,21 @@ class Dop2000(DOCDirStream): self.printAndSet("fShowXMLErrors", self.getBit(buf, 6)) self.printAndSet("fAlwaysMergeEmptyNamespace", self.getBit(buf, 7)) print '</dop2000>' + assert self.pos == self.dop.pos + Dop2000.size + self.dop.pos = self.pos class Dop2002(DOCDirStream): """The Dop2002 structure contains document and compatibility settings.""" + size = 594 def __init__(self, dop): DOCDirStream.__init__(self, dop.bytes) self.pos = dop.pos self.dop = dop def dump(self): - print '<dop2002 type="Dop2002" offset="%d" size="594 bytes">' % self.pos + print '<dop2002 type="Dop2002" offset="%d" size="%d bytes">' % (self.pos, Dop2002.size) dop2000 = Dop2000(self) dop2000.dump() - assert dop2000.pos == self.pos + 544 - self.pos += 544 self.printAndSet("unused", self.readuInt32()) @@ -1269,9 +1280,12 @@ class Dop2002(DOCDirStream): self.printAndSet("cpMinRmHdrTxbx", self.readuInt32()) self.printAndSet("rsidRoot", self.readuInt32()) print '</dop2002>' + assert self.pos == self.dop.pos + Dop2002.size + self.dop.pos = self.pos class Dop2003(DOCDirStream): """The Dop2003 structure contains document and compatibility settings.""" + size = 616 def __init__(self, dop): DOCDirStream.__init__(self, dop.bytes) self.pos = dop.pos @@ -1281,8 +1295,6 @@ class Dop2003(DOCDirStream): print '<dop2003 type="Dop2003" offset="%d" size="616 bytes">' % self.pos dop2002 = Dop2002(self) dop2002.dump() - assert dop2002.pos == self.pos + 594 - self.pos += 594 buf = self.readuInt8() self.printAndSet("fTreatLockAtnAsReadOnly", self.getBit(buf, 0)) @@ -1319,6 +1331,8 @@ class Dop2003(DOCDirStream): self.printAndSet("empty3", self.readuInt8()) self.printAndSet("ilfoMacAtCleanup", self.readuInt16()) print '</dop2003>' + assert self.pos == self.dop.pos + Dop2003.size + self.dop.pos = self.pos class DopMth(DOCDirStream): """The DopMth structure specifies document-wide math settings.""" @@ -1361,8 +1375,6 @@ class Dop2007(DOCDirStream): print '<dop2007 type="Dop2007" offset="%d">' % self.pos dop2003 = Dop2003(self) dop2003.dump() - assert dop2003.pos == self.pos + 616 - self.pos += 616 self.printAndSet("reserved1", self.readuInt32()) commit d0c77146d7de32ec5407e2d179ee761d491554c3 Author: Miklos Vajna <vmik...@suse.cz> Date: Sat Dec 1 17:24:02 2012 +0100 dump Sty diff --git a/src/docrecord.py b/src/docrecord.py index fb88f2c..c7dc5bd 100644 --- a/src/docrecord.py +++ b/src/docrecord.py @@ -247,6 +247,31 @@ class Tcg(DOCDirStream): print '<todo what="Tcg: chTerminator != 0x40"/>' print '</tcg>' +class Sty(DOCDirStream): + """The Sty structure specifies the type of the selection that was made.""" + def __init__(self, parent): + DOCDirStream.__init__(self, parent.bytes) + self.pos = parent.pos + self.parent = parent + + def dump(self): + value = self.readuInt16() + styMap = { + 0x0000: "styNil", + 0x0001: "styChar", + 0x0002: "styWord", + 0x0003: "stySent", + 0x0004: "styPara", + 0x0005: "styLine", + 0x000C: "styCol", + 0x000D: "styRow", + 0x000E: "styColAll", + 0x000F: "styWholeTable", + 0x001B: "styPrefix", + } + print '<sty name="%s" value="%s"/>' % (styMap[value], hex(value)) + self.parent.pos = self.pos + class Selsf(DOCDirStream): """The Selsf structure specifies the last selection that was made to the document.""" def __init__(self, mainStream): @@ -286,8 +311,7 @@ class Selsf(DOCDirStream): self.printAndSet("unused4", self.readuInt32()) self.printAndSet("blktblSel", self.readuInt32()) self.printAndSet("cpAnchor", self.readuInt32()) - # TODO Sty - self.pos += 2 + Sty(self).dump() self.printAndSet("unused5", self.readuInt16()) self.printAndSet("cpAnchorShrink", self.readuInt32()) self.printAndSet("xaTableLeft", self.readInt16()) commit 2764302f398da11e5e8cb58913c830bb59391f31 Author: Miklos Vajna <vmik...@suse.cz> Date: Sat Dec 1 17:16:54 2012 +0100 dump Selsf diff --git a/src/docrecord.py b/src/docrecord.py index 9cac57d..fb88f2c 100644 --- a/src/docrecord.py +++ b/src/docrecord.py @@ -247,6 +247,54 @@ class Tcg(DOCDirStream): print '<todo what="Tcg: chTerminator != 0x40"/>' print '</tcg>' +class Selsf(DOCDirStream): + """The Selsf structure specifies the last selection that was made to the document.""" + def __init__(self, mainStream): + DOCDirStream.__init__(self, mainStream.doc.getDirectoryStreamByName("1Table").bytes) + self.pos = mainStream.fcWss + self.size = mainStream.lcbWss + self.mainStream = mainStream + + def dump(self): + print '<selsf type="Selsf" offset="%d" size="%d bytes">' % (self.pos, self.size) + + buf = self.readuInt16() + self.printAndSet("fRightward", self.getBit(buf, 0)) + self.printAndSet("unused1", self.getBit(buf, 1)) + self.printAndSet("fWithinCell", self.getBit(buf, 2)) + self.printAndSet("fTableAnchor", self.getBit(buf, 3)) + self.printAndSet("fTableSelNonShrink", self.getBit(buf, 4)) + self.printAndSet("unused2", self.getBit(buf, 5)) + self.printAndSet("fDiscontiguous", self.getBit(buf, 6)) + self.printAndSet("fPrefix", self.getBit(buf, 7)) + self.printAndSet("fShape", self.getBit(buf, 8)) + self.printAndSet("fFrame", self.getBit(buf, 9)) + self.printAndSet("fColumn", self.getBit(buf, 10)) + self.printAndSet("fTable", self.getBit(buf, 11)) + self.printAndSet("fGraphics", self.getBit(buf, 12)) + self.printAndSet("fBlock", self.getBit(buf, 13)) + self.printAndSet("unused3", self.getBit(buf, 14)) + self.printAndSet("fIns", self.getBit(buf, 15)) + + buf = self.readuInt8() + self.printAndSet("fForward", buf & 0x7f) # 1..7th bits + self.printAndSet("fPrefixW2007", self.getBit(buf, 7)) + + self.printAndSet("fInsEnd", self.readuInt8()) + self.printAndSet("cpFirst", self.readuInt32()) + self.printAndSet("cpLim", self.readuInt32()) + self.printAndSet("unused4", self.readuInt32()) + self.printAndSet("blktblSel", self.readuInt32()) + self.printAndSet("cpAnchor", self.readuInt32()) + # TODO Sty + self.pos += 2 + self.printAndSet("unused5", self.readuInt16()) + self.printAndSet("cpAnchorShrink", self.readuInt32()) + self.printAndSet("xaTableLeft", self.readInt16()) + self.printAndSet("xaTableRight", self.readInt16()) + assert self.pos == self.mainStream.fcWss + self.size + print '</selsf>' + class Sprm(DOCDirStream): """The Sprm structure specifies a modification to a property of a character, paragraph, table, or section.""" def __init__(self, bytes, offset): diff --git a/src/docstream.py b/src/docstream.py index c4097e4..da069b2 100644 --- a/src/docstream.py +++ b/src/docstream.py @@ -264,7 +264,7 @@ class WordDocumentStream(DOCDirStream): ["fcPrEnvLand"], ["lcbPrEnvLand"], ["fcWss"], - ["lcbWss"], + ["lcbWss", self.handleLcbWss], ["fcDop"], ["lcbDop", self.handleDop], ["fcSttbfAssoc"], @@ -480,6 +480,9 @@ class WordDocumentStream(DOCDirStream): tcg = docrecord.Tcg(self, offset, size) tcg.dump() + def handleLcbWss(self): + docrecord.Selsf(self).dump() + def dumpFibRgFcLcb97(self, name): print '<%s type="FibRgFcLcb97" size="744 bytes">' % name self.__dumpFibRgFcLcb97() commit 6926f1e710bf0baaa7c9bc1ef3e844b00f7b2079 Author: Miklos Vajna <vmik...@suse.cz> Date: Sat Dec 1 16:45:32 2012 +0100 dump Tcg diff --git a/src/docrecord.py b/src/docrecord.py index 4232517..9cac57d 100644 --- a/src/docrecord.py +++ b/src/docrecord.py @@ -105,31 +105,6 @@ class PlcfBkf(DOCDirStream, PLC): PLC.__init__(self, size, 4) # 4 is defined by 2.8.10 self.pos = offset self.size = size - - def dump(self): - print '<plcfBkf type="PlcfAtnBkf" offset="%d" size="%d bytes">' % (self.pos, self.size) - offset = self.mainStream.fcMin - pos = self.pos - for i in range(self.getElements()): - # aCp - start = offset + self.getuInt32(pos = pos) - print '<aCP index="%d" bookmarkStart="%d">' % (i, start) - print '<transformed value="%s"/>' % FcCompressed.getFCTransformedValue(self.mainStream.bytes, start, start + 1) - pos += 4 - - # aFBKF - aFBKF = FBKF(self, self.getOffset(self.pos, i)) - aFBKF.dump() - print '</aCP>' - print '</plcfBkf>' - -class PlcfBkf(DOCDirStream, PLC): - """A PLCFBKF is a PLC whose data elements are FBKF structures.""" - def __init__(self, mainStream, offset, size): - DOCDirStream.__init__(self, mainStream.doc.getDirectoryStreamByName("1Table").bytes, mainStream = mainStream) - PLC.__init__(self, size, 4) # 4 is defined by 2.8.10 - self.pos = offset - self.size = size self.aCP = [] def dump(self): @@ -257,6 +232,21 @@ class PlcfSed(DOCDirStream, PLC): print '</aCP>' print '</plcSed>' +class Tcg(DOCDirStream): + """The Tcg structure specifies command-related customizations.""" + def __init__(self, mainStream, offset, size): + DOCDirStream.__init__(self, mainStream.doc.getDirectoryStreamByName("1Table").bytes) + self.pos = offset + self.size = size + + def dump(self): + print '<tcg type="Tcg" offset="%d" size="%d bytes">' % (self.pos, self.size) + self.printAndSet("nTcgVer", self.readuInt8()) + self.printAndSet("chTerminator", self.readuInt8()) + if self.chTerminator != 0x40: + print '<todo what="Tcg: chTerminator != 0x40"/>' + print '</tcg>' + class Sprm(DOCDirStream): """The Sprm structure specifies a modification to a property of a character, paragraph, table, or section.""" def __init__(self, bytes, offset): diff --git a/src/docstream.py b/src/docstream.py index 23349a2..c4097e4 100644 --- a/src/docstream.py +++ b/src/docstream.py @@ -252,7 +252,7 @@ class WordDocumentStream(DOCDirStream): ["fcPlcfBkl"], ["lcbPlcfBkl"], ["fcCmds"], - ["lcbCmds"], + ["lcbCmds", self.handleLcbCmds], ["fcUnused1"], ["lcbUnused1"], ["fcSttbfMcr"], @@ -474,6 +474,12 @@ class WordDocumentStream(DOCDirStream): plcfSed = docrecord.PlcfSed(self, offset, size) plcfSed.dump() + def handleLcbCmds(self): + offset = self.fcCmds + size = self.lcbCmds + tcg = docrecord.Tcg(self, offset, size) + tcg.dump() + def dumpFibRgFcLcb97(self, name): print '<%s type="FibRgFcLcb97" size="744 bytes">' % name self.__dumpFibRgFcLcb97() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits