示例#1
0
    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])
示例#2
0
    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()