def __init__(self, path, base, index, size, fmap, piece_size, prioritize_fn): AbstractFile.__init__(self, path, base, size, piece_size) self.index=index self.first_piece=fmap.piece self.last_piece=self.first_piece + max((size-1+fmap.start),0) // piece_size self.offset=fmap.start self._prioritize_fn=prioritize_fn
def __init__(self, path, base, size, piece_size=2097152, prioritize_fn=None): self._full_path= os.path.join(base,path) self._prioritize_fn=prioritize_fn self.pieces=None self.mime=None size=self._load_cached(size) AbstractFile.__init__(self, path, base, size, piece_size) if not self.pieces or len(self.pieces)!=self.last_piece+1: self.pieces=[False for _i in xrange(self.last_piece+1)] self._file=open(self.full_path,'r+b')
def update_piece(self, n, data): assert n!= self.last_piece and len(data)==self.piece_size or \ n==self.last_piece and len(data)==(self.size % self.piece_size) or self.piece_size, "Invalid size of piece %d - %d"% (n,len(data)) assert n>=self.first_piece and n<=self.last_piece,'Invalid piece no %d'%n with self._lock: if not self.pieces[n]: self._file.seek(n*self.piece_size) self._file.write(data) self._file.flush() self.pieces[n]=True logger.debug('Received piece %d in thread %s', n, threading.current_thread().name) AbstractFile.update_piece(self, n, data)
def update_piece(self, n, data): assert n!= self.last_piece and len(data)==self.piece_size or \ n==self.last_piece and len(data)==(self.size % self.piece_size) or self.piece_size, "Invalid size of piece %d - %d"% (n,len(data)) assert n >= self.first_piece and n <= self.last_piece, 'Invalid piece no %d' % n with self._lock: if not self.pieces[n]: self._file.seek(n * self.piece_size) self._file.write(data) self._file.flush() self.pieces[n] = True logger.debug('Received piece %d in thread %s', n, threading.current_thread().name) AbstractFile.update_piece(self, n, data)
def prioritize_piece(self, piece, idx): assert piece >= self.first_piece and piece <= self.last_piece, 'Invalid piece no %d' % piece data = None with self._lock: if self.pieces[piece]: sz = self.piece_size if piece < self.last_piece else self.size % self.piece_size self._file.seek(piece * self.piece_size) data = self._file.read(sz) assert len(data) == sz if data: AbstractFile.update_piece(self, piece, data) elif self._prioritize_fn: self._prioritize_fn(piece, idx) else: assert False, 'Missing prioritize fn'
def __init__(self, path, base, size, piece_size=2097152, prioritize_fn=None): self._full_path = os.path.join(base, path) self._prioritize_fn = prioritize_fn self.pieces = None self.mime = None size = self._load_cached(size) AbstractFile.__init__(self, path, base, size, piece_size) if not self.pieces or len(self.pieces) != self.last_piece + 1: self.pieces = [False for _i in xrange(self.last_piece + 1)] self._file = open(self.full_path, 'r+b')
def prioritize_piece(self, piece, idx): assert piece>=self.first_piece and piece<=self.last_piece,'Invalid piece no %d'%piece data=None with self._lock: if self.pieces[piece]: sz = self.piece_size if piece < self.last_piece else self.size % self.piece_size self._file.seek(piece*self.piece_size) data=self._file.read(sz) assert len(data)==sz if data: AbstractFile.update_piece(self, piece, data) elif self._prioritize_fn: self._prioritize_fn(piece,idx) else: assert False, 'Missing prioritize fn'
def remove(self): AbstractFile.remove(self) if os.path.exists(self.pieces_index_file): os.unlink(self.pieces_index_file)