def __init__(self, file, request_emitter, ui_handler): super(DownloadQueue, self).__init__() self._file = file self._ui_handler = ui_handler self._request_emitter = request_emitter self._downloaded_parts = FilesManager.get_completed_file_parts_nums(file.id) self._downloading_parts = [] klog("Started queue system for files %s %s" %(self._file.filename, str(self._file.id))) self.connect(self, SIGNAL("part_download_finished"), self._completed_part) self._check_parts() parts = FilesManager.get_ordered_parts_number(self._file.id) for i in range(min(QUEUE_LENGTH, len(parts))): peers = FilesManager.get_peers_for_file_part(self._file.id, parts[i]) if len(peers) > 0: if len(peers) == 1: peer = peers[0] else: peer = peers[random.randrange(0,len(peers)-1)] self._request_emitter.download_part(peer.ip, peer.port, self._file.id, parts[i])
def _completed_part(self, file_id, part_num): lock = Lock() lock.acquire() if str(file_id) != str(self._file.id): lock.release() return part_num = int(part_num) klog("Completed part %d" %part_num) if part_num not in self._downloaded_parts: self._downloaded_parts.append(part_num) if len(self._downloaded_parts) == self._file.parts_count: klog("All parts downloaded, creating the file") self._timer.cancel() FilesManager.create_file_from_parts(self._file.id) else: klog("Starting the new part") parts = FilesManager.get_ordered_parts_number(self._file.id) if len(parts) >0: peers = FilesManager.get_peers_for_file_part(self._file.id, parts[0]) if len(peers) > 0: if len(peers) > 1: peer = peers[random.randrange(0,len(peers))] else: peer = peers[0] self._request_emitter.download_part(peer.ip, peer.port, file_id, parts[0]) klog("Started download part %d from peer: %s" %(parts[0], peer.ip)) lock.release()