.gitignore | 1 Makefile | 1 msodumper/swlaycacherecord.py | 81 ++++++++++++++++++++++++++++++++++++++++++ swlaycache-dump.py | 33 +++++++++++++++++ 4 files changed, 116 insertions(+)
New commits: commit 6de82e66a940e6438f1b567f56d720743f650fda Author: Miklos Vajna <[email protected]> AuthorDate: Wed Sep 12 11:39:04 2018 +0200 Commit: Miklos Vajna <[email protected]> CommitDate: Wed Sep 12 11:42:42 2018 +0200 Add a dumper for the Writer binary layout cache It's not a Microsoft format, but we have an easy to use framework here to inspect binary files... (This is the layout-cache stream in ODT files, if it's there.) diff --git a/.gitignore b/.gitignore index 0d20b64..d18402d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.pyc +.*.swp diff --git a/Makefile b/Makefile index 8fb1a68..badc2f5 100644 --- a/Makefile +++ b/Makefile @@ -5,3 +5,4 @@ check: pep8 --ignore=E501 doc-dump.py msodumper/doc{record,sprm,stream}.py test/doc/test.py pep8 --ignore=E501 emf-dump.py msodumper/{emf,wmf}record.py pep8 --ignore=E501 vsd-dump.py msodumper/vsdstream.py test/vsd-test.py + pycodestyle --ignore=E501 swlaycache-dump.py msodumper/swlaycacherecord.py diff --git a/msodumper/swlaycacherecord.py b/msodumper/swlaycacherecord.py new file mode 100644 index 0000000..dac75e4 --- /dev/null +++ b/msodumper/swlaycacherecord.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +# +# 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/. +# + +from .binarystream import BinaryStream + + +class SwLayCacheStream(BinaryStream): + def __init__(self, bytes): + BinaryStream.__init__(self, bytes) + + def dump(self): + print('<stream type="SwLayCache" size="%d">' % self.size) + posOrig = self.pos + header = Header(self) + header.dump() + + while posOrig + self.size > self.pos: + record = CacheRecord(self) + record.dump() + print('</stream>') + + +class Record(BinaryStream): + def __init__(self, parent): + BinaryStream.__init__(self, parent.bytes) + self.parent = parent + self.pos = parent.pos + + +class Header(Record): + def __init__(self, parent): + Record.__init__(self, parent) + + def dump(self): + self.printAndSet("nMajorVersion", self.readuInt16()) + self.printAndSet("nMinorVersion", self.readuInt16()) + self.parent.pos = self.pos + + +class CacheRecord(Record): + def __init__(self, parent): + Record.__init__(self, parent) + + def dump(self): + val = self.readuInt32() + print('<record type="' + RecordType[val & 0xff] + '">') + self.printAndSet("cRecTyp", val & 0xff) # 1..8th bits + self.printAndSet("nSize", val >> 8) # 9th..32th bits + if self.cRecTyp == 0x70: # SW_LAYCACHE_IO_REC_PAGES + self.printAndSet("cFlags", self.readuInt8()) + elif self.cRecTyp == 0x46: # SW_LAYCACHE_IO_REC_FLY + self.printAndSet("cFlags", self.readuInt8()) + self.printAndSet("nPgNum", self.readuInt16(), hexdump=False) + self.printAndSet("nIndex", self.readuInt32(), hexdump=False) + self.printAndSet("nX", self.readuInt32(), hexdump=False) + self.printAndSet("nY", self.readuInt32(), hexdump=False) + self.printAndSet("nW", self.readuInt32(), hexdump=False) + self.printAndSet("nH", self.readuInt32(), hexdump=False) + elif self.cRecTyp == 0x50: # SW_LAYCACHE_IO_REC_PARA + self.printAndSet("cFlags", self.readuInt8()) + self.printAndSet("nIndex", self.readuInt32(), hexdump=False) + if self.cFlags & 0x01: + print('<todo what="CacheRecord::dump: unhandled cRecTyp == SW_LAYCACHE_IO_REC_PARA && cFalgs == 1/>' % hex(self.cRecTyp)) + else: + print('<todo what="CacheRecord::dump: unhandled cRecTyp=%s"/>' % hex(self.cRecTyp)) + self.pos += self.nSize - 4 # 'val' is already read + print('</record>') + self.parent.pos = self.pos + + +RecordType = { + 0x70: 'SW_LAYCACHE_IO_REC_PAGES', # 'p' + 0x46: 'SW_LAYCACHE_IO_REC_FLY', # 'F' + 0x50: 'SW_LAYCACHE_IO_REC_PARA', # 'P' +} + +# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab: diff --git a/swlaycache-dump.py b/swlaycache-dump.py new file mode 100755 index 0000000..6b0cc06 --- /dev/null +++ b/swlaycache-dump.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# +# 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/. +# + +from msodumper import swlaycacherecord +import sys + + +# Dumps the Star Writer binary layout cache format. +class SwLayCacheDumper: + def __init__(self, filepath): + self.filepath = filepath + + def dump(self): + file = open(self.filepath, 'rb') + strm = swlaycacherecord.SwLayCacheStream(file.read()) + file.close() + print('<?xml version="1.0"?>') + strm.dump() + + +def main(args): + dumper = SwLayCacheDumper(args[1]) + dumper.dump() + + +if __name__ == '__main__': + main(sys.argv) + +# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab: _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
