| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | from __future__ import absolute_import |
| | from __future__ import print_function |
| | from __future__ import unicode_literals |
| | import os.path |
| | import sys |
| |
|
| | from ..errors import InvalidOleStorageError |
| |
|
| |
|
| | PY3 = sys.version_info.major == 3 |
| | if PY3: |
| | basestring = str |
| |
|
| |
|
| | def is_enabled(): |
| | try: |
| | from org.apache.poi.poifs.filesystem import POIFSFileSystem |
| | POIFSFileSystem |
| | return True |
| | except ImportError: |
| | return False |
| |
|
| |
|
| | class OleStorage(object): |
| | ''' Create an OleStorage instance. |
| | |
| | :param olefile: an OLE2 Compound Binary File. |
| | :raises: `InvalidOleStorageError` when `olefile` is not valid OLE2 format. |
| | ''' |
| |
|
| | def __init__(self, olefile): |
| | from java.io import FileInputStream |
| | from java.io import IOException |
| | from org.apache.poi.poifs.filesystem import POIFSFileSystem |
| | from org.apache.poi.poifs.filesystem import DirectoryEntry |
| |
|
| | if isinstance(olefile, basestring): |
| | path = os.path.abspath(olefile) |
| | fis = FileInputStream(path) |
| | try: |
| | fs = POIFSFileSystem(fis) |
| | except IOException as e: |
| | raise InvalidOleStorageError(e.getMessage()) |
| | entry = fs.getRoot() |
| | elif isinstance(olefile, DirectoryEntry): |
| | entry = olefile |
| | else: |
| | raise ValueError('invalid olefile') |
| |
|
| | self.entry = entry |
| |
|
| | def __iter__(self): |
| | return (entry.getName() for entry in self.entry.getEntries()) |
| |
|
| | def __getitem__(self, name): |
| | from java.io import FileNotFoundException |
| | try: |
| | entry = self.entry.getEntry(name) |
| | except FileNotFoundException: |
| | raise KeyError('%s not found' % name) |
| |
|
| | if entry.directoryEntry: |
| | return OleStorage(entry) |
| | elif entry.documentEntry: |
| | return OleStream(entry) |
| | else: |
| | raise KeyError('%s is invalid' % name) |
| |
|
| | def close(self): |
| | return |
| |
|
| |
|
| | class OleStream(object): |
| |
|
| | def __init__(self, entry): |
| | self.entry = entry |
| |
|
| | def open(self): |
| | from org.apache.poi.poifs.filesystem import DocumentInputStream |
| | dis = DocumentInputStream(self.entry) |
| | return FileFromDocumentInputStream(dis) |
| |
|
| |
|
| | class FileFromDocumentInputStream(object): |
| |
|
| | def __init__(self, dis): |
| | self.dis = dis |
| | self.size = dis.available() |
| | dis.mark(0) |
| |
|
| | def read(self, size=None): |
| | import jarray |
| | dis = self.dis |
| | available = dis.available() |
| | if size is None: |
| | size = available |
| | elif size > available: |
| | size = available |
| | bytes = jarray.zeros(size, 'b') |
| | n_read = dis.read(bytes) |
| | data = bytes.tostring() |
| | if n_read < size: |
| | return data[:n_read] |
| | return data |
| |
|
| | def seek(self, offset, whence=0): |
| | dis = self.dis |
| | if whence == 0: |
| | dis.reset() |
| | dis.skip(offset) |
| | elif whence == 1: |
| | dis.skip(offset) |
| | elif whence == 2: |
| | dis.reset() |
| | dis.skip(self.size - offset) |
| | else: |
| | raise ValueError('invalid whence: %s', whence) |
| |
|
| | def tell(self): |
| | return self.size - self.dis.available() |
| |
|
| | def close(self): |
| | return self.dis.close() |
| |
|