class AppendedFiles(): """ Two WormHoleFiles one after another. Takes 1 or 2 dict(s) as arguments; they're passed to WormHoleFiles' at the init. This is aimed at merging the TOC track starting at LBA45000 with the last one to mimic one big track at LBA0 with the files at the same LBA than the GD-ROM. """ def __init__(self, wormfile1, wormfile2=None, *args, **kwargs): self._f1 = WormHoleFile(**wormfile1) self._f1.seek(0, 2) self._f1_len = self._f1.tell() self._f1.seek(0, 0) self._f2_len = 0 if wormfile2: self._f2 = WormHoleFile(**wormfile2) self._f2.seek(0, 2) self._f2_len = self._f2.tell() self._f2.seek(0, 0) else: # So the rest of the code works for one or 2 files. self._f2 = StringIO('') self.seek(0, 0) def seek(self, a, b=0): if b == 0: self.MetaPointer = a if b == 1: self.MetaPointer += a if b == 2: self.MetaPointer = self._f1_len + self._f2_len - a if self.MetaPointer >= self._f1_len: self._f1.seek(0, 2) self._f2.seek(a - self._f1_len, 0) else: self._f1.seek(a, 0) self._f2.seek(0, 0) def read(self, length=None): if length == None: length = self._f1_len + self._f2_len - self.MetaPointer tmp = self.MetaPointer FutureOffset = self.MetaPointer + length if FutureOffset < self._f1_len: # Read inside file1 data = self._f1.read(length) elif tmp > self._f1_len: # Read inside file2 data = self._f2.read(length) else: # Read end of file1 and start of file2 data = self._f1.read(self._f1_len - tmp) data += self._f2.read(FutureOffset - self._f1_len) self.seek(FutureOffset) # It might be enough to just update # self.MetaPointer, but this is safer. return data def tell(self): return self.MetaPointer def __enter__(self): return self def __exit__(self, type=None, value=None, traceback=None): # This is required to close files properly when using the with # statement. Which isn't required by ISO9660 anymore, but could # be useful for other uses so it stays! self._f1.__exit__() if self._f2_len: self._f2.__exit__()