[Libreoffice-commits] .: 4 commits - src/docrecord.py src/docstream.py

Miklos Vajna vmiklos at kemper.freedesktop.org
Sat Dec 1 08:43:38 PST 2012


 src/docrecord.py |  168 +++++++++++++++++++++++++++++++++++++++----------------
 src/docstream.py |   13 +++-
 2 files changed, 132 insertions(+), 49 deletions(-)

New commits:
commit 7ad6658a750bdbb7183df2b301d56bf4c9b42696
Author: Miklos Vajna <vmiklos at 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 <vmiklos at 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 <vmiklos at 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 <vmiklos at 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()


More information about the Libreoffice-commits mailing list