src/docrecord.py | 4 +-- src/msodraw.py | 73 +++++++++++++++++++++++++++++++++---------------------- 2 files changed, 47 insertions(+), 30 deletions(-)
New commits: commit 318a8dc91b9fbd0ee3654049c70b8bd84a8fb14b Author: Miklos Vajna <vmik...@suse.cz> Date: Wed Jan 16 17:34:09 2013 +0100 msodraw: handle Word OfficeArtClientAnchor and guard against invalid size diff --git a/src/msodraw.py b/src/msodraw.py index b11ea5d..81002a9 100644 --- a/src/msodraw.py +++ b/src/msodraw.py @@ -473,6 +473,8 @@ class FOPT: entry.flagComplex = (val & 0x8000) # if true, the value stores the size of the extra bytes. entry.value = strm.readSignedInt(4) if entry.flagComplex: + if strm.pos + entry.value > strm.size: + break entry.extra = strm.readBytes(entry.value) self.properties.append(entry) @@ -507,23 +509,24 @@ class FOPT: recHdl.appendLine('<fopt type="OfficeArtRGFOPTE">') for i in xrange(0, rh.recInstance): recHdl.appendLine('<rgfopte index="%d">' % i) - prop = self.properties[i] - recHdl.appendLine('<opid>') - recHdl.appendLine('<opid value="0x%4.4X"/>' % prop.ID) - recHdl.appendLine('<opid fBid="%d"/>' % prop.flagBid) - recHdl.appendLine('<opid fComplex="%d"/>' % prop.flagComplex) - recHdl.appendLine('</opid>') - if FOPT.propTable.has_key(prop.ID): - # We have a handler for this property. - # propData is expected to have two elements: name (0) and handler (1). - propHdl = FOPT.propTable[prop.ID] - recHdl.appendLine('<op name="%s" value="0x%4.4X">' % (propHdl[0], prop.ID)) - propHdl[1]().dumpXml(recHdl, prop) - recHdl.appendLine('</op>') - else: - recHdl.appendLine('<op value="0x%8.8X"/>' % prop.value) - if prop.flagComplex: - recHdl.appendLine('<todo what="FOPT: fComplex != 0 unhandled"/>') + if i < len(self.properties): + prop = self.properties[i] + recHdl.appendLine('<opid>') + recHdl.appendLine('<opid value="0x%4.4X"/>' % prop.ID) + recHdl.appendLine('<opid fBid="%d"/>' % prop.flagBid) + recHdl.appendLine('<opid fComplex="%d"/>' % prop.flagComplex) + recHdl.appendLine('</opid>') + if FOPT.propTable.has_key(prop.ID): + # We have a handler for this property. + # propData is expected to have two elements: name (0) and handler (1). + propHdl = FOPT.propTable[prop.ID] + recHdl.appendLine('<op name="%s" value="0x%4.4X">' % (propHdl[0], prop.ID)) + propHdl[1]().dumpXml(recHdl, prop) + recHdl.appendLine('</op>') + else: + recHdl.appendLine('<op value="0x%8.8X"/>' % prop.value) + if prop.flagComplex: + recHdl.appendLine('<todo what="FOPT: fComplex != 0 unhandled"/>') recHdl.appendLine('</rgfopte>') recHdl.appendLine('</fopt>') recHdl.appendLine('</shapePrimaryOptions>') @@ -718,6 +721,17 @@ class FClientAnchorSheet: obj = xlsmodel.Shape(self.col1, self.row1, self.dx1, self.dy1, self.col2, self.row2, self.dx2, self.dy2) sheet.addShape(obj) +class OfficeArtClientAnchor: + """Word-specific anchor data.""" + + def __init__ (self, strm): + self.clientanchor = strm.readSignedInt(4) + + def dumpXml(self, recHdl): + recHdl.appendLine('<officeArtClientAnchor type="OfficeArtClientAnchor">') + recHdl.appendLine('<clientanchor value="0x%4.4X"/>' % self.clientanchor) + recHdl.appendLine('</officeArtClientAnchor>') + # ---------------------------------------------------------------------------- class MSODrawHandler(globals.ByteStream): @@ -780,7 +794,10 @@ class MSODrawHandler(globals.ByteStream): rh = RecordHeader(self) rh.dumpXml(self) saved = self.pos - if rh.recType in recData: + if rh.recType == RecordHeader.Type.FClientAnchor and model.hostApp == globals.ModelBase.HostAppType.Word: + child = OfficeArtClientAnchor(self) + child.dumpXml(self) + elif rh.recType in recData: child = recData[rh.recType](self) child.dumpXml(self, model, rh) else: commit 5e1e18c11b0174c08657fcabf1c6246009f0cff0 Author: Miklos Vajna <vmik...@suse.cz> Date: Wed Jan 16 17:09:45 2013 +0100 msodraw: pass the model, so app-specific client anchor can be dumped diff --git a/src/docrecord.py b/src/docrecord.py index 5210db5..f277196 100644 --- a/src/docrecord.py +++ b/src/docrecord.py @@ -1802,7 +1802,7 @@ class OfficeArtWordDrawing(DOCDirStream): def dump(self): print '<officeArtWordDrawing type="OfficeArtWordDrawing" pos="%d">' % self.pos self.printAndSet("dgglbl", self.readuInt8()) - msodraw.DgContainer(self, "container").dumpXml(self) + msodraw.DgContainer(self, "container").dumpXml(self, globals.ModelBase(globals.ModelBase.HostAppType.Word)) print '</officeArtWordDrawing>' self.officeArtContent.pos = self.pos @@ -1816,7 +1816,7 @@ class OfficeArtContent(DOCDirStream): def dump(self): print '<officeArtContent type="OfficeArtContent" offset="%d" size="%d bytes">' % (self.pos, self.size) - msodraw.DggContainer(self, "DrawingGroupData").dumpXml(self) + msodraw.DggContainer(self, "DrawingGroupData").dumpXml(self, globals.ModelBase(globals.ModelBase.HostAppType.Word)) print '<Drawings type="main" offset="%d">' % self.pos OfficeArtWordDrawing(self).dump() print '</Drawings>' diff --git a/src/msodraw.py b/src/msodraw.py index 29c65ce..b11ea5d 100644 --- a/src/msodraw.py +++ b/src/msodraw.py @@ -183,7 +183,7 @@ class FDG: recHdl.appendLine(" shape count: %d"%self.shapeCount) recHdl.appendLine(" last shape ID: %d"%self.lastShapeID) - def dumpXml(self, recHdl, rh): + def dumpXml(self, recHdl, model, rh): recHdl.appendLine('<drawingData type="OfficeArtFDG">') recHdl.appendLine('<csp value="%d"/>' % self.shapeCount) recHdl.appendLine('<spidCur value="%d"/>' % self.lastShapeID) @@ -244,7 +244,7 @@ class FDGGBlock: for idcl in self.idcls: idcl.appendLines(recHdl, rh) - def dumpXml(self, recHdl, rh): + def dumpXml(self, recHdl, model, rh): recHdl.appendLine('<drawingGroup type="OfficeArtFDGGBlock">') self.head.dumpXml(recHdl, rh) for i, idcl in enumerate(self.idcls): @@ -500,7 +500,7 @@ class FOPT: # regular property value recHdl.appendLine(" property value: 0x%8.8X"%prop.value) - def dumpXml(self, recHdl, rh): + def dumpXml(self, recHdl, model, rh): self.__parseBytes(rh) recHdl.appendLine('<shapePrimaryOptions type="OfficeArtFOPT">') @@ -571,8 +571,8 @@ class FSP: recHdl.appendLineBoolean(" background shape", self.background) recHdl.appendLineBoolean(" have shape type property", self.haveProperties) - def dumpXml(self, recHdl, rh): - recHdl.appendLine('<shapeProp type="OfficeArtFSPGR">') + def dumpXml(self, recHdl, model, rh): + recHdl.appendLine('<shapeProp type="OfficeArtFSP">') recHdl.appendLine('<spid value="%d"/>' % self.spid) recHdl.appendLine('<fGroup value="%d"/>' % self.groupShape) recHdl.appendLine('<fChild value="%d"/>' % self.childShape) @@ -603,7 +603,7 @@ class FSPGR: recHdl.appendLine(" right boundary: %d"%self.right) recHdl.appendLine(" bottom boundary: %d"%self.bottom) - def dumpXml(self, recHdl, rh): + def dumpXml(self, recHdl, model, rh): recHdl.appendLine('<shapeGroup type="OfficeArtFSPGR">') recHdl.appendLine('<xLeft value="%d"/>' % self.left) recHdl.appendLine('<yTop value="%d"/>' % self.top) @@ -662,7 +662,7 @@ class FClientData: recHdl.appendLine("FClientData content") recHdl.appendLine(" data: 0x%8.8X"%self.data) - def dumpXml(self, recHdl, rh): + def dumpXml(self, recHdl, model, rh): recHdl.appendLine('<clientData type="OfficeArtClientData">') recHdl.appendLine('<data value="0x%8.8X"/>' % self.data) recHdl.appendLine('</clientData>') @@ -679,7 +679,7 @@ class SplitMenuColorContainer: for msocr in self.smca: msocr.appendLines(recHdl, rh) - def dumpXml(self, recHdl, rh): + def dumpXml(self, recHdl, model, rh): recHdl.appendLine('<splitColors type="OfficeArtSplitMenuColorContainer">') for i, smca in enumerate(self.smca): recHdl.appendLine('<smca index="%d">' % i) @@ -768,7 +768,7 @@ class MSODrawHandler(globals.ByteStream): # unknown object bytes = self.readBytes(rh.recLen) - def dumpXml (self, recHdl, rh = None): + def dumpXml (self, recHdl, model, rh = None): recHdl.appendLine('<%s type="%s">' % (self.name, self.type)) if rh: self.rh = rh @@ -782,7 +782,7 @@ class MSODrawHandler(globals.ByteStream): saved = self.pos if rh.recType in recData: child = recData[rh.recType](self) - child.dumpXml(self, rh) + child.dumpXml(self, model, 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 _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits