--- BitTorrent/Storage.py~ 2005-02-28 22:42:59.713676168 +0100 +++ BitTorrent/Storage.py 2005-02-28 22:43:21.476367736 +0100 @@ -7,6 +7,7 @@ class Storage: def __init__(self, files, open, exists, getsize): # can raise IOError and ValueError + self.open = open self.ranges = [] total = 0l so_far = 0l @@ -28,18 +29,12 @@ self.tops = {} for file, length in files: if exists(file): - l = getsize(file) - if l != length: - self.handles[file] = open(file, 'rb+') - self.whandles[file] = 1 - if l > length: - self.handles[file].truncate(length) - else: - self.handles[file] = open(file, 'rb') - self.tops[file] = l + self.tops[file] = getsize(file) + if self.tops[file] > length: + self.get_handle(file, 'rb+').truncate(length) else: - self.handles[file] = open(file, 'wb+') - self.whandles[file] = 1 + self.get_handle(file, 'wb') + self.close() def was_preallocated(self, pos, length): for file, begin, end in self._intervals(pos, length): @@ -47,13 +42,20 @@ return False return True + def get_handle(self, file, mode = 'rb'): + if not self.handles.has_key(file): + try: + self.handles[file] = self.open(file, mode) + except IOError, _: + for h in self.handles.values(): + h.flush() + h.close() + self.handles = {} + self.handles[file] = self.open(file, mode) + return self.handles[file] + def set_readonly(self): - # may raise IOError or OSError - for file in self.whandles.keys(): - old = self.handles[file] - old.flush() - old.close() - self.handles[file] = open(file, 'rb') + pass def get_total_length(self): return self.total_length @@ -69,29 +71,30 @@ return r def read(self, pos, amount): + # may raise IOError or OSError r = [] for file, pos, end in self._intervals(pos, amount): - h = self.handles[file] + h = self.get_handle(file, 'rb') h.seek(pos) r.append(h.read(end - pos)) + self.close() return ''.join(r) def write(self, pos, s): - # might raise an IOError + # may raise IOError or OSError total = 0 for file, begin, end in self._intervals(pos, len(s)): - if not self.whandles.has_key(file): - self.handles[file].close() - self.handles[file] = open(file, 'rb+') - self.whandles[file] = 1 - h = self.handles[file] + h = self.get_handle(file, 'rb+') h.seek(begin) h.write(s[total: total + end - begin]) total += end - begin + self.close() def close(self): for h in self.handles.values(): + h.flush() h.close() + self.handles = {} def lrange(a, b, c): r = []