# HG changeset patch # User Paul Boddie # Date 1252967576 -7200 # Node ID d8b4b6f1a5d94f184d0c18db624692b8ae1e1f90 # Parent 8d41e2d063e91164d0d0ea9b187030c70e617a8a Added a cache offset attribute to better track available cached data. diff -r 8d41e2d063e9 -r d8b4b6f1a5d9 iixr/files.py --- a/iixr/files.py Tue Sep 15 00:15:58 2009 +0200 +++ b/iixr/files.py Tue Sep 15 00:32:56 2009 +0200 @@ -137,12 +137,20 @@ def __init__(self, f): File.__init__(self, f) - self.reset_cache() + self.reset_cache(0) - def reset_cache(self): + def reset_cache(self, offset): self.cache = "" self.cache_length = 0 self.cache_start = 0 + self.cache_offset = offset + self.f.seek(offset) + + def resize_cache(self, next_start): + self.cache = self.cache[next_start:] + self.cache_length = len(self.cache) + self.cache_start = 0 + self.cache_offset += next_start def read_number(self): @@ -217,31 +225,28 @@ return s def tell(self): - return self.f.tell() - self.cache_length + self.cache_start + return self.cache_offset + self.cache_start def seek(self, offset): current = self.tell() - self.f.seek(offset) # If seeking forward, attempt to navigate the cache. if offset >= current: self._seek_cache(offset - current) else: - self.reset_cache() + self.reset_cache(offset) def _seek_cache(self, delta): next_start = self.cache_start + delta if next_start > 0 and next_start >= len(self.cache): - self.reset_cache() + self.reset_cache(self.cache_offset + next_start) # If the cache is too big, resize it. elif next_start > READ_CACHE_RESIZE: - self.cache = self.cache[next_start:] - self.cache_length = len(self.cache) - self.cache_start = 0 + self.resize_cache(next_start) # Otherwise, just reference the next part of the cache.