#!/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 . import globals from .binarystream import BinaryStream class Ole1Stream(BinaryStream): """Specified by [MS-OLEDS] 2.2.5 EmbeddedObject, specifies how an embedded object is laid out in a container document.""" def __init__(self, bytes): BinaryStream.__init__(self, bytes) def dump(self): print('' % self.size) header = ObjectHeader(self, "Header") header.dump() self.printAndSet("NativeDataSize", self.readuInt32(), hexdump=False, offset=True) print('' % (self.pos, self.NativeDataSize)) self.pos += self.NativeDataSize presentation = MetaFilePresentationObject(self, "Presentation") presentation.dump() print('') class Record(BinaryStream): def __init__(self, parent): BinaryStream.__init__(self, parent.bytes) self.parent = parent self.pos = parent.pos class LengthPrefixedAnsiString(Record): """Specified by [MS-OLEDS] 2.1.4, specifies a length-prefixed and null-terminated ANSI string.""" def __init__(self, parent, name): Record.__init__(self, parent) self.parent = parent self.pos = parent.pos self.name = name def dump(self): print('<%s type="LengthPrefixedAnsiString">' % self.name) self.printAndSet("Length", self.readuInt32(), offset=True) bytes = [] for dummy in range(self.Length): c = self.readuInt8() bytes.append(c) self.printAndSet("String", globals.encodeName("".join(map(lambda c: chr(c), bytes[:-1])), lowOnly=True).encode('utf-8'), hexdump=False, offset=True) print('' % self.name) self.parent.pos = self.pos class StandardPresentationObject(Record): def __init__(self, parent, name): Record.__init__(self, parent) self.name = name def dump(self): print('<%s type="StandardPresentationObject">' % self.name) self.standardPresentationObject = PresentationObjectHeader(self, "Header") self.standardPresentationObject.dump() if self.standardPresentationObject.FormatID != 0x00000000: self.printAndSet("Width", self.readuInt32()) self.printAndSet("Height", self.readInt32() * -1) print('' % self.name) self.parent.pos = self.pos class PresentationObjectHeader(Record): def __init__(self, parent, name): Record.__init__(self, parent) self.name = name def dump(self): print('<%s type="PresentationObjectHeader">' % self.name) self.printAndSet("OLEVersion", self.readuInt32()) self.printAndSet("FormatID", self.readuInt32()) if self.FormatID != 0x00000000: LengthPrefixedAnsiString(self, "ClassName").dump() print('' % self.name) self.parent.pos = self.pos class ObjectHeader(Record): def __init__(self, parent, name): Record.__init__(self, parent) self.name = name def dump(self): print('<%s type="ObjectHeader">' % self.name) self.printAndSet("OLEVersion", self.readuInt32()) self.printAndSet("FormatID", self.readuInt32()) LengthPrefixedAnsiString(self, "ClassName").dump() LengthPrefixedAnsiString(self, "TopicName").dump() LengthPrefixedAnsiString(self, "ItemName").dump() print('' % self.name) self.parent.pos = self.pos class MetaFilePresentationObject(Record): def __init__(self, parent, name): Record.__init__(self, parent) self.name = name def dump(self): print('<%s type="MetaFilePresentationObject">' % self.name) header = StandardPresentationObject(self, "Header") header.dump() if header.standardPresentationObject.FormatID != 0x000000: self.printAndSet("PresentationDataSize", self.readuInt32(), hexdump=False, offset=True) self.printAndSet("Reserved1", self.readuInt16()) self.printAndSet("Reserved2", self.readuInt16()) self.printAndSet("Reserved3", self.readuInt16()) self.printAndSet("Reserved4", self.readuInt16()) print('' % (self.pos, int(self.PresentationDataSize) - 8)) print('' % self.name) self.parent.pos = self.pos # vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab: