summaryrefslogtreecommitdiff
path: root/msodumper/vsdstream.py
blob: b4653ecf1eda5f2229a725ea776577c6823d4e6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env python2
#
# 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 ole
from .binarystream import BinaryStream
from .msometa import SummaryInformationStream
from .msometa import DocumentSummaryInformationStream


class VSDFile:
    """Represents the whole visio file - feed will all bytes."""
    def __init__(self, chars, params):
        self.chars = chars
        self.size = len(self.chars)
        self.params = params
        self.error = None

        self.init()

    def init(self):
        self.header = ole.Header(self.chars, self.params)
        self.pos = self.header.parse()

    def __getDirectoryObj(self):
        obj = self.header.getDirectory()
        obj.parseDirEntries()
        return obj

    def getDirectoryNames(self):
        return self.__getDirectoryObj().getDirectoryNames()

    def getDirectoryStreamByName(self, name):
        obj = self.__getDirectoryObj()
        bytes = obj.getRawStreamByName(name)
        return self.getStreamFromBytes(name, bytes)

    def getStreamFromBytes(self, name, bytes):
        if name == "\x05SummaryInformation":
            return SummaryInformationStream(bytes, self.params, doc=self)
        elif name == "\x05DocumentSummaryInformation":
            return DocumentSummaryInformationStream(bytes, self.params, doc=self)
        else:
            return BinaryStream(bytes, self.params, name, doc=self)

    def getName(self):
        return "native"


def createVSDFile(chars, params):
    return VSDFile(chars, params)

# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab: