Minimal read-only file object that prepends a string to the contents of an actual file. Shouldn't be used outside of gzip.py, as it lacks essential functionality.
| 73 | output.write(struct.pack("<L", value)) |
| 74 | |
| 75 | class _PaddedFile: |
| 76 | """Minimal read-only file object that prepends a string to the contents |
| 77 | of an actual file. Shouldn't be used outside of gzip.py, as it lacks |
| 78 | essential functionality.""" |
| 79 | |
| 80 | def __init__(self, f, prepend=b''): |
| 81 | self._buffer = prepend |
| 82 | self._length = len(prepend) |
| 83 | self.file = f |
| 84 | self._read = 0 |
| 85 | |
| 86 | def read(self, size): |
| 87 | if self._read is None: |
| 88 | return self.file.read(size) |
| 89 | if self._read + size <= self._length: |
| 90 | read = self._read |
| 91 | self._read += size |
| 92 | return self._buffer[read:self._read] |
| 93 | else: |
| 94 | read = self._read |
| 95 | self._read = None |
| 96 | return self._buffer[read:] + \ |
| 97 | self.file.read(size-self._length+read) |
| 98 | |
| 99 | def prepend(self, prepend=b''): |
| 100 | if self._read is None: |
| 101 | self._buffer = prepend |
| 102 | else: # Assume data was read since the last prepend() call |
| 103 | self._read -= len(prepend) |
| 104 | return |
| 105 | self._length = len(self._buffer) |
| 106 | self._read = 0 |
| 107 | |
| 108 | def seek(self, off): |
| 109 | self._read = None |
| 110 | self._buffer = None |
| 111 | return self.file.seek(off) |
| 112 | |
| 113 | def seekable(self): |
| 114 | return True # Allows fast-forwarding even in unseekable streams |
| 115 | |
| 116 | |
| 117 | class BadGzipFile(OSError): |