[Libreoffice-commits] .: 2 commits - src/docdraw.py src/docrecord.py src/msodraw.py

Miklos Vajna vmiklos at kemper.freedesktop.org
Mon Dec 10 02:49:26 PST 2012


 src/docdraw.py   |   86 -------------------------------------------------------
 src/docrecord.py |    6 +--
 src/msodraw.py   |   85 ++++++++++++++++++++++++++++++++++++++++++++----------
 3 files changed, 73 insertions(+), 104 deletions(-)

New commits:
commit d6204e27511e62cb9c0325efcc8995b68934d9b3
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Mon Dec 10 11:46:36 2012 +0100

    merge docdraw into msodraw

diff --git a/src/docdraw.py b/src/docdraw.py
deleted file mode 100644
index 8425498..0000000
--- a/src/docdraw.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env python
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-import struct
-import globals
-import docsprm
-import msodraw
-
-class OfficeArtContainer(globals.ByteStream):
-    def __init__(self, parent, name, type):
-        self.bytes = parent.bytes
-        self.size = len(self.bytes)
-        self.pos = 0
-        self.name = name
-        self.type = type
-        self.pos = parent.pos
-        self.parent = parent
-
-    def dumpXml(self, recHdl, rh = None):
-        recHdl.appendLine('<%s type="%s">' % (self.name, self.type))
-        if rh:
-            self.rh = rh
-        else:
-            self.rh = msodraw.RecordHeader(self)
-            self.rh.dumpXml(self)
-        base = self.pos
-        while (self.rh.recLen - (self.pos - base)) > 0:
-            rh = msodraw.RecordHeader(self)
-            rh.dumpXml(self)
-            saved = self.pos
-            if rh.recType in recMap:
-                child = recMap[rh.recType](self)
-                child.dumpXml(self, rh)
-            else:
-                recHdl.appendLine('<todo what="%s: recType = %s unhandled (size: %d bytes)"/>' % (self.type, hex(rh.recType), rh.recLen))
-            self.pos = saved + rh.recLen
-        recHdl.appendLine('</%s>' % self.name)
-        self.parent.pos = self.pos
-
-    def appendLine(self, line):
-        self.parent.appendLine(line)
-
-class OfficeArtDggContainer(OfficeArtContainer):
-    """The OfficeArtDggContainer record type specifies the container for all the OfficeArt file records that contain document-wide data."""
-    def __init__(self, officeArtContent, name):
-        OfficeArtContainer.__init__(self, officeArtContent, name, "OfficeArtDggContainer")
-
-class OfficeArtDgContainer(OfficeArtContainer):
-    """The OfficeArtDgContainer record specifies the container for all the file records for the objects in a drawing."""
-    def __init__(self, officeArtContent, name):
-        OfficeArtContainer.__init__(self, officeArtContent, name, "OfficeArtDgContainer")
-
-class OfficeArtSpContainer(OfficeArtContainer):
-    """The OfficeArtSpContainer record specifies a shape container."""
-    def __init__(self, parent):
-        OfficeArtContainer.__init__(self, parent, "shape", "OfficeArtSpContainer")
-
-class OfficeArtSpgrContainer(OfficeArtContainer):
-    """The OfficeArtSpgrContainer record specifies a container for groups of shapes."""
-    def __init__(self, officeArtDgContainer):
-        OfficeArtContainer.__init__(self, officeArtDgContainer, "groupShape", "OfficeArtSpgrContainer")
-
-recMap = {
-        0xf003: OfficeArtSpgrContainer,
-        0xf004: OfficeArtSpContainer,
-        0xf006: msodraw.FDGGBlock,
-        0xf008: msodraw.FDG,
-        0xf009: msodraw.FSPGR,
-        0xf00a: msodraw.FSP,
-        0xf00b: msodraw.FOPT,
-        0xf011: msodraw.FClientData,
-        0xf11e: msodraw.SplitMenuColorContainer,
-        }
-
-# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/src/docrecord.py b/src/docrecord.py
index 4e7beb9..cc53b04 100644
--- a/src/docrecord.py
+++ b/src/docrecord.py
@@ -9,7 +9,7 @@ import struct
 import globals
 from docdirstream import DOCDirStream
 import docsprm
-import docdraw
+import msodraw
 
 class FcCompressed(DOCDirStream):
     """The FcCompressed structure specifies the location of text in the WordDocument Stream."""
@@ -1575,7 +1575,7 @@ class OfficeArtWordDrawing(DOCDirStream):
     def dump(self):
         print '<officeArtWordDrawing type="OfficeArtWordDrawing" pos="%d">' % self.pos
         self.printAndSet("dgglbl", self.readuInt8())
-        docdraw.OfficeArtDgContainer(self, "container").dumpXml(self)
+        msodraw.DgContainer(self, "container").dumpXml(self)
         print '</officeArtWordDrawing>'
         self.officeArtContent.pos = self.pos
 
@@ -1589,7 +1589,7 @@ class OfficeArtContent(DOCDirStream):
 
     def dump(self):
         print '<officeArtContent type="OfficeArtContent" offset="%d" size="%d bytes">' % (self.pos, self.size)
-        docdraw.OfficeArtDggContainer(self, "DrawingGroupData").dumpXml(self)
+        msodraw.DggContainer(self, "DrawingGroupData").dumpXml(self)
         print '<Drawings type="main" offset="%d">' % self.pos
         OfficeArtWordDrawing(self).dump()
         print '</Drawings>'
diff --git a/src/msodraw.py b/src/msodraw.py
index 5154767..1a4707e 100644
--- a/src/msodraw.py
+++ b/src/msodraw.py
@@ -690,26 +690,18 @@ class FClientAnchorSheet:
 
 # ----------------------------------------------------------------------------
 
-recData = {
-    RecordHeader.Type.FDG: FDG,
-    RecordHeader.Type.FSPGR: FSPGR,
-    RecordHeader.Type.FSP: FSP,
-    RecordHeader.Type.FOPT: FOPT,
-    RecordHeader.Type.FDGGBlock: FDGGBlock,
-    RecordHeader.Type.FConnectorRule: FConnectorRule,
-    RecordHeader.Type.FDGSL: FDGSL,
-    RecordHeader.Type.FClientAnchor: FClientAnchorSheet,
-    RecordHeader.Type.FClientData: FClientData,
-    RecordHeader.Type.SplitMenuColorContainer: SplitMenuColorContainer
-}
-
 class MSODrawHandler(globals.ByteStream):
 
-    def __init__ (self, bytes, parent):
-        """The 'parent' instance must have appendLine() method that takes one string argument."""
+    def __init__ (self, bytes, parent, name = None, type = None):
+        """The 'parent' instance must have appendLine() method that takes one string argument.
+           The optional parameters are used by dumpXml() only."""
 
         globals.ByteStream.__init__(self, bytes)
         self.parent = parent
+        if name and type:
+            self.name = name
+            self.type = type
+            self.pos = parent.pos
 
     def parseBytes (self):
         while not self.isEndOfRecord():
@@ -746,5 +738,68 @@ class MSODrawHandler(globals.ByteStream):
                 # unknown object
                 bytes = self.readBytes(rh.recLen)
 
+    def dumpXml (self, recHdl, rh = None):
+        recHdl.appendLine('<%s type="%s">' % (self.name, self.type))
+        if rh:
+            self.rh = rh
+        else:
+            self.rh = RecordHeader(self)
+            self.rh.dumpXml(self)
+        base = self.pos
+        while (self.rh.recLen - (self.pos - base)) > 0:
+            rh = RecordHeader(self)
+            rh.dumpXml(self)
+            saved = self.pos
+            if rh.recType in recData:
+                child = recData[rh.recType](self)
+                child.dumpXml(self, rh)
+            else:
+                recHdl.appendLine('<todo what="%s: recType = %s unhandled (size: %d bytes)"/>' % (self.type, hex(rh.recType), rh.recLen))
+            self.pos = saved + rh.recLen
+        recHdl.appendLine('</%s>' % self.name)
+        self.parent.pos = self.pos
+
+    def appendLine(self, line):
+        self.parent.appendLine(line)
+
+
+class DggContainer(MSODrawHandler):
+    """The OfficeArtDggContainer record type specifies the container for all the OfficeArt file records that contain document-wide data."""
+    def __init__(self, officeArtContent, name):
+        MSODrawHandler.__init__(self, officeArtContent.bytes, officeArtContent, name, "OfficeArtDggContainer")
+
+
+class DgContainer(MSODrawHandler):
+    """The OfficeArtDgContainer record specifies the container for all the file records for the objects in a drawing."""
+    def __init__(self, officeArtContent, name):
+        MSODrawHandler.__init__(self, officeArtContent.bytes, officeArtContent, name, "OfficeArtDgContainer")
+
+
+class SpContainer(MSODrawHandler):
+    """The OfficeArtSpContainer record specifies a shape container."""
+    def __init__(self, parent):
+        MSODrawHandler.__init__(self, parent.bytes, parent, "shape", "OfficeArtSpContainer")
+
+
+class SpgrContainer(MSODrawHandler):
+    """The OfficeArtSpgrContainer record specifies a container for groups of shapes."""
+    def __init__(self, officeArtDgContainer):
+        MSODrawHandler.__init__(self, officeArtDgContainer.bytes, officeArtDgContainer, "groupShape", "OfficeArtSpgrContainer")
+
+
+recData = {
+    RecordHeader.Type.spgrContainer: SpgrContainer,
+    RecordHeader.Type.spContainer: SpContainer,
+    RecordHeader.Type.FDG: FDG,
+    RecordHeader.Type.FSPGR: FSPGR,
+    RecordHeader.Type.FSP: FSP,
+    RecordHeader.Type.FOPT: FOPT,
+    RecordHeader.Type.FDGGBlock: FDGGBlock,
+    RecordHeader.Type.FConnectorRule: FConnectorRule,
+    RecordHeader.Type.FDGSL: FDGSL,
+    RecordHeader.Type.FClientAnchor: FClientAnchorSheet,
+    RecordHeader.Type.FClientData: FClientData,
+    RecordHeader.Type.SplitMenuColorContainer: SplitMenuColorContainer
+}
 
 # vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
commit eaf1a03aed1a724d5e103bcd544142426208f4c3
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Mon Dec 10 11:29:49 2012 +0100

    docdraw: get rid of unnecessary seeks

diff --git a/src/docdraw.py b/src/docdraw.py
index de46109..8425498 100644
--- a/src/docdraw.py
+++ b/src/docdraw.py
@@ -27,26 +27,19 @@ class OfficeArtContainer(globals.ByteStream):
         else:
             self.rh = msodraw.RecordHeader(self)
             self.rh.dumpXml(self)
-        pos = self.pos
-        while (self.rh.recLen - (pos - self.pos)) > 0:
-            posOrig = self.pos
-            self.pos = pos
+        base = self.pos
+        while (self.rh.recLen - (self.pos - base)) > 0:
             rh = msodraw.RecordHeader(self)
             rh.dumpXml(self)
-            self.pos = posOrig
-            pos += msodraw.RecordHeader.size
+            saved = self.pos
             if rh.recType in recMap:
-                posOrig = self.pos
-                self.pos = pos
                 child = recMap[rh.recType](self)
                 child.dumpXml(self, rh)
-                self.pos = posOrig
             else:
                 recHdl.appendLine('<todo what="%s: recType = %s unhandled (size: %d bytes)"/>' % (self.type, hex(rh.recType), rh.recLen))
-            pos += rh.recLen
+            self.pos = saved + rh.recLen
         recHdl.appendLine('</%s>' % self.name)
-        assert pos == self.pos + self.rh.recLen
-        self.parent.pos = pos
+        self.parent.pos = self.pos
 
     def appendLine(self, line):
         self.parent.appendLine(line)


More information about the Libreoffice-commits mailing list