A thin wrapper around an existing file object that provides a part of its data as an individual file object.
| 603 | # Extraction file object |
| 604 | #------------------------ |
| 605 | class _FileInFile(object): |
| 606 | """A thin wrapper around an existing file object that |
| 607 | provides a part of its data as an individual file |
| 608 | object. |
| 609 | """ |
| 610 | |
| 611 | def __init__(self, fileobj, offset, size, blockinfo=None): |
| 612 | self.fileobj = fileobj |
| 613 | self.offset = offset |
| 614 | self.size = size |
| 615 | self.position = 0 |
| 616 | self.name = getattr(fileobj, "name", None) |
| 617 | self.closed = False |
| 618 | |
| 619 | if blockinfo is None: |
| 620 | blockinfo = [(0, size)] |
| 621 | |
| 622 | # Construct a map with data and zero blocks. |
| 623 | self.map_index = 0 |
| 624 | self.map = [] |
| 625 | lastpos = 0 |
| 626 | realpos = self.offset |
| 627 | for offset, size in blockinfo: |
| 628 | if offset > lastpos: |
| 629 | self.map.append((False, lastpos, offset, None)) |
| 630 | self.map.append((True, offset, offset + size, realpos)) |
| 631 | realpos += size |
| 632 | lastpos = offset + size |
| 633 | if lastpos < self.size: |
| 634 | self.map.append((False, lastpos, self.size, None)) |
| 635 | |
| 636 | def flush(self): |
| 637 | pass |
| 638 | |
| 639 | def readable(self): |
| 640 | return True |
| 641 | |
| 642 | def writable(self): |
| 643 | return False |
| 644 | |
| 645 | def seekable(self): |
| 646 | return self.fileobj.seekable() |
| 647 | |
| 648 | def tell(self): |
| 649 | """Return the current file position. |
| 650 | """ |
| 651 | return self.position |
| 652 | |
| 653 | def seek(self, position, whence=io.SEEK_SET): |
| 654 | """Seek to a position in the file. |
| 655 | """ |
| 656 | if whence == io.SEEK_SET: |
| 657 | self.position = min(max(position, 0), self.size) |
| 658 | elif whence == io.SEEK_CUR: |
| 659 | if position < 0: |
| 660 | self.position = max(self.position + position, 0) |
| 661 | else: |
| 662 | self.position = min(self.position + position, self.size) |