| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| 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() |
|
|