src/docrecord.py | 66 +++++++++++++++++++++++++++++++++++++++++-------- test/doc/abi1157-1.doc |binary test/doc/test.py | 3 ++ 3 files changed, 59 insertions(+), 10 deletions(-)
New commits: commit 1f3ea3de7dac77f977b29600c68732674e67bbdb Author: Miklos Vajna <[email protected]> Date: Wed Jun 12 11:24:14 2013 +0200 dump Prl and PrcData diff --git a/src/docrecord.py b/src/docrecord.py index 429db6b..4d2039b 100644 --- a/src/docrecord.py +++ b/src/docrecord.py @@ -850,11 +850,12 @@ class Prl(DOCDirStream): def __init__(self, bytes, offset): DOCDirStream.__init__(self, bytes) self.pos = offset - - def dump(self): - print '<prl type="Prl" offset="%d">' % self.pos + self.posOrig = self.pos self.sprm = Sprm(self.bytes, self.pos) self.pos += 2 + + def dump(self): + print '<prl type="Prl" offset="%d">' % self.posOrig self.sprm.dump() print '</prl>' @@ -1204,6 +1205,48 @@ class Pcdt(DOCDirStream): self.plcPcd.dump() print '</pcdt>' +class PrcData(DOCDirStream): + """The PrcData structure specifies an array of Prl elements and the size of + the array.""" + def __init__(self, parent): + DOCDirStream.__init__(self, parent.bytes) + self.pos = parent.pos + + self.cbGrpprl = self.readInt16() + pos = 0 + self.prls = [] + while self.cbGrpprl - pos > 0: + prl = Prl(self.bytes, self.pos + pos) + pos += prl.getSize() + self.prls.append(prl) + self.pos += self.cbGrpprl + parent.pos = self.pos + + def dump(self): + print '<prcData>' + self.printAndSet("cbGrpprl", self.cbGrpprl) + print '<grpPrl>' + for i in self.prls: + i.dump() + print '</grpPrl>' + print '</prcData>' + +class Prc(DOCDirStream): + """The Prc structure specifies a set of properties for document content + that is referenced by a Pcd structure.""" + def __init__(self, parent): + DOCDirStream.__init__(self, parent.bytes) + self.pos = parent.pos + + self.clxt = self.readuInt8() + self.prcData = PrcData(self) + parent.pos = self.pos + + def dump(self, index): + print '<prc index="%d">' % index + self.prcData.dump() + print '</prc>' + class Clx(DOCDirStream): def __init__(self, bytes, mainStream, offset, size): DOCDirStream.__init__(self, bytes, mainStream=mainStream) @@ -1211,16 +1254,19 @@ class Clx(DOCDirStream): self.size = size self.firstByte = self.getuInt8() - if self.firstByte == 0x02: - self.pcdt = Pcdt(self.bytes, self.mainStream, self.pos, self.size) + self.prcs = [] + while True: + self.firstByte = self.getuInt8() + if self.firstByte != 0x01: + break + self.prcs.append(Prc(self)) + self.pcdt = Pcdt(self.bytes, self.mainStream, self.pos, self.size) def dump(self): print '<clx type="Clx" offset="%d" size="%d bytes">' % (self.pos, self.size) - if self.firstByte == 0x02: - print '<info what="Array of Prc, 0 elements"/>' - self.pcdt.dump() - else: - print '<todo what="Clx::dump() first byte is not 0x02"/>' + for index, elem in enumerate(self.prcs): + elem.dump(index) + self.pcdt.dump() print '</clx>' class Copts60(DOCDirStream): diff --git a/test/doc/abi1157-1.doc b/test/doc/abi1157-1.doc new file mode 100644 index 0000000..8adac06 Binary files /dev/null and b/test/doc/abi1157-1.doc differ diff --git a/test/doc/test.py b/test/doc/test.py index 2bf3f01..97951cb 100755 --- a/test/doc/test.py +++ b/test/doc/test.py @@ -182,6 +182,9 @@ class Test(unittest.TestCase): firstHeader = self.root.findall('stream[@name="WordDocument"]/fib/fibRgFcLcbBlob/lcbPlcfHdd/plcfHdd/aCP[@index="7"]') self.assertEqual("This is a header.\\x0D\\x0D", firstHeader[0].findall('transformed')[0].attrib['value']) + def test_abi1157(self): + self.dump('abi1157-1') + if __name__ == '__main__': unittest.main() _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
