⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scheduler.py

📁 BitTorrentABC-Linux-V.2.4.3源码
💻 PY
📖 第 1 页 / 共 4 页
字号:
from wxPython.wx import *
from wxPython import *
from threading import Event, Thread, Semaphore
from BitTorrent.download import Download
from BitTorrent.bencode import *
from os import path, remove, getcwd
from time import time

from abcengine import ABCEngine
from filemanager import TorrentListFileManager

wxEVT_SCH = wxNewEventType()
FILESEM   = Semaphore(1)

def EVT_SCH(win, func):
    win.Connect(-1, -1, wxEVT_SCH, func)

class SchEvent(wxPyEvent):
    def __init__(self, func, args, kwargs):
        wxPyEvent.__init__(self)
        self.SetEventType(wxEVT_SCH)
        self.func = func
        self.args = args
        self.kwargs = kwargs

def runBT(params, d, doneflag):
    dow = Download ()
    d.dow = dow
    dow.download(params, d.chooseFile, d.updateStatus, d.finished, d.error, d.flag, 100, d.newpath, sem=FILESEM)#doneflag, 100, d.newpath)
    if not d.fin:
        d.failed()

# Todo: find memory leak in onPause when connecting
####################################################
class ABCScheduler(wxEvtHandler):
    def __init__(self, parent, abcparams, guiman):
        wxEvtHandler.__init__(self)
        self.LISTINDEX      = 0
        self.ABCENGINE_ADR  = 1
        self.SRC            = 2
        self.DEST           = 3
        self.STATUS         = 4
        self.PRIO           = 5
        self.DONEFLAG       = 6
        self.FILENAME       = 7
        self.MAXUPLOAD      = 8
        self.MAXUPLOADRATE  = 9
        self.UPLOADOPT      = 10
        self.UPLOADTIMEH    = 11
        self.UPLOADTIMEM    = 12
        self.UPLOADRATIO    = 13
        self.DETAIL_ADR     = 14
        self.DOWNSIZE       = 15
        self.UPSIZE         = 16

        self.maxRememberParams = 17

        self.guiman         = guiman
        self.abcparams      = abcparams
        #maxupload, maxupload_rate, upload_option O_O all option here !!

        self.priotext = ["Highest", "High", "Normal", "Low", "Lowest"]
        self.currentproc = 0
        self.parent     = parent
        self.list       = parent.list
        self.maxnumsim  = abcparams['numsimdownload']

        self.maxtorrent = 256
        self.proctab = []
        self.flag = Event()
        
        for i in range (0, self.maxtorrent):
            self.proctab.append([-1, None, "", "", "", 2, None, "",
                                 "", "", "", "", "", "", None, 0.0, 0.0])
                   #index, @abcengine,src,dest,status,priority,doneflag,filename
                   #maxupload, maxuploadrate, uploadoption, uploadtimeh,
                   #uploadtimem, uploadratio, detailwin, ratio
            
                    # index (-1) = available
                      # index (-2) = pause process
                       # priority (0 - 4), highest,high,normal, low, lowest

        EVT_SCH(self, self.onInvoke)
        
    def onInvoke(self, event):
        if not self.flag.isSet():
            event.func(*event.args, **event.kwargs)
    def invokeLater(self, func, args = [], kwargs = {}):
        if not self.flag.isSet():
            wxPostEvent(self, SchEvent(func, args, kwargs))
            
    def procREMOVE(self, index):
        indexstatus = self.proctab[index][self.LISTINDEX]
        oldstatus = self.proctab[index][self.STATUS]

        if self.abcparams['removetorrent'] == "1":
            try:
                remove(self.proctab[index][self.SRC])
            except:
                pass
            
        # Delete Detail Window
        ########################
        if self.proctab[index][self.DETAIL_ADR] is not None:
            self.proctab[index][self.DETAIL_ADR].killAdv()

        if indexstatus >= 0 :
            self.proctab[index][self.DOWNSIZE], self.proctab[index][self.UPSIZE] = self.proctab[index][self.ABCENGINE_ADR].getDownUpSize()
            self.proctab[index][self.LISTINDEX] = -1
            self.proctab[index][self.DONEFLAG] = None
            if self.proctab[index][self.ABCENGINE_ADR].timer != None:
                self.proctab[index][self.ABCENGINE_ADR].timer.cancel()
                
            self.proctab[index][self.ABCENGINE_ADR].fin = true
            self.proctab[index][self.ABCENGINE_ADR].done(None)                        
            self.proctab[index][self.ABCENGINE_ADR] = None
            if oldstatus != "completed":
                self.currentproc -= 1
            
        if index != self.maxtorrent - 1:            
            for i in range(index+1, self.maxtorrent):
                if self.proctab[i][self.LISTINDEX] == -1:
                    self.proctab[i - 1][0] = -1
                    self.proctab[i - 1][1] = None
                    self.proctab[i - 1][2] = ""
                    self.proctab[i - 1][3] = ""
                    self.proctab[i - 1][4] = ""
                    self.proctab[i - 1][5] = 2
                    self.proctab[i - 1][6] = None
                    self.proctab[i - 1][7] = ""                    
                    self.proctab[i - 1][8] = ""                    
                    self.proctab[i - 1][9] = ""                    
                    self.proctab[i - 1][10] = ""                    
                    self.proctab[i - 1][11] = ""                    
                    self.proctab[i - 1][12] = ""                    
                    self.proctab[i - 1][13] = ""                    
                    self.proctab[i - 1][14] = None  
                    self.proctab[i - 1][15] = 0.0
                    self.proctab[i - 1][16] = 0.0  
                    break

                if self.proctab[i][0] > 0:
                    self.proctab[i - 1][0] = i - 1
                else:
                    self.proctab[i - 1][0] = self.proctab[i][0] #actually it's -2                    
                self.proctab[i - 1][1] = self.proctab[i][1]
                self.proctab[i - 1][2] = self.proctab[i][2]
                self.proctab[i - 1][3] = self.proctab[i][3]
                self.proctab[i - 1][4] = self.proctab[i][4]
                self.proctab[i - 1][5] = self.proctab[i][5]
                self.proctab[i - 1][6] = self.proctab[i][6]
                self.proctab[i - 1][7] = self.proctab[i][7]
                self.proctab[i - 1][8] = self.proctab[i][8]
                self.proctab[i - 1][9] = self.proctab[i][9]
                self.proctab[i - 1][10] = self.proctab[i][10]
                self.proctab[i - 1][11] = self.proctab[i][11]
                self.proctab[i - 1][12] = self.proctab[i][12]
                self.proctab[i - 1][13] = self.proctab[i][13]
                self.proctab[i - 1][14] = self.proctab[i][14]
                self.proctab[i - 1][15] = self.proctab[i][15]
                self.proctab[i - 1][16] = self.proctab[i][16]

                if self.proctab[i-1][self.ABCENGINE_ADR] != None:                
                    self.proctab[i-1][self.ABCENGINE_ADR].changeIndex(i-1)
                    self.proctab[i-1][self.ABCENGINE_ADR].changeDoneFlag(self.proctab[i][self.DONEFLAG])
                    self.proctab[i-1][self.ABCENGINE_ADR].changePrio(self.proctab[i][self.PRIO])
                if self.proctab[i-1][self.DETAIL_ADR] != None:
                    self.proctab[i -1][self.DETAIL_ADR].changeIndex(i-1)
            
        self.proctab[self.maxtorrent - 1][0] = -1
        self.proctab[self.maxtorrent - 1][1] = None
        self.proctab[self.maxtorrent - 1][2] = ""
        self.proctab[self.maxtorrent - 1][3] = ""
        self.proctab[self.maxtorrent - 1][4] = ""
        self.proctab[self.maxtorrent - 1][5] = 2
        self.proctab[self.maxtorrent - 1][6] = None
        self.proctab[self.maxtorrent - 1][7] = ""
        self.proctab[self.maxtorrent - 1][8] = ""
        self.proctab[self.maxtorrent - 1][9] = ""
        self.proctab[self.maxtorrent - 1][10] = ""
        self.proctab[self.maxtorrent - 1][11] = ""
        self.proctab[self.maxtorrent - 1][12] = ""
        self.proctab[self.maxtorrent - 1][13] = ""
        self.proctab[self.maxtorrent - 1][14] = None
        self.proctab[self.maxtorrent - 1][15] = 0.0
        self.proctab[self.maxtorrent - 1][16] = 0.0
           
        # Send message to all ABCengine to change index
        #################################################
        self.updateTorrentList()        
        self.invokeLater(self.Scheduler)

    def procPAUSE(self, index):
        indexstatus = self.proctab[index][self.LISTINDEX]
        if indexstatus == -1:
            return
        
        oldstatus = self.proctab[index][self.STATUS]
        self.proctab[index][self.STATUS] = "pause"
        if self.proctab[index][self.DETAIL_ADR] is not None:
            self.proctab[index][self.DETAIL_ADR].onPause()


        if indexstatus != -2:
            self.proctab[index][self.DOWNSIZE], self.proctab[index][self.UPSIZE] = self.proctab[index][self.ABCENGINE_ADR].getDownUpSize()
            self.proctab[index][self.LISTINDEX] = -2
            self.proctab[index][self.DONEFLAG] = None
            if self.proctab[index][self.ABCENGINE_ADR].timer != None:
                self.proctab[index][self.ABCENGINE_ADR].timer.cancel()
            self.proctab[index][self.ABCENGINE_ADR].fin = true
            self.proctab[index][self.ABCENGINE_ADR].done(None)                        
            self.proctab[index][self.ABCENGINE_ADR] = None
            if oldstatus != "completed":
                self.currentproc -= 1

            
        self.updateTorrentList()            
        self.invokeLater(self.Scheduler)

    def procFINISH(self, index):
        indexstatus = self.proctab[index][self.LISTINDEX]
        if indexstatus == -1:
            return        

        self.proctab[index][self.STATUS] = "completed"        
        if indexstatus != -2:
            self.currentproc -= 1
            self.proctab[index][self.DOWNSIZE], self.proctab[index][self.UPSIZE] = self.proctab[index][self.ABCENGINE_ADR].getDownUpSize()
            
        self.updateTorrentList()            
        self.invokeLater(self.Scheduler)

            
    def procDONE(self, index):
        indexstatus = self.proctab[index][self.LISTINDEX]
        if indexstatus == -1:
            return        
        if self.proctab[index][self.DETAIL_ADR] is not None:
            self.proctab[index][self.DETAIL_ADR].onPause()

        if indexstatus != -2:
            self.proctab[index][self.DOWNSIZE], self.proctab[index][self.UPSIZE] = self.proctab[index][self.ABCENGINE_ADR].getDownUpSize()
            self.proctab[index][self.LISTINDEX] = -2
            self.proctab[index][self.DONEFLAG] = None
            if self.proctab[index][self.ABCENGINE_ADR].timer != None:
                self.proctab[index][self.ABCENGINE_ADR].timer.cancel()
            self.proctab[index][self.ABCENGINE_ADR].fin = true
            self.proctab[index][self.ABCENGINE_ADR].done(None)                        
            self.proctab[index][self.ABCENGINE_ADR] = None

        self.invokeLater(self.Scheduler)
        
    def procSUPERSEED(self, index):
        indexstatus = self.proctab[index][self.LISTINDEX]
        if indexstatus == -1:
            return        

        if indexstatus != -2:
            if self.proctab[index][self.STATUS] != "completed":
                #dialog your file is not completed don't use SUPERSEED
                dlg = wxMessageDialog(self.parent, "Your torrent is not completed yet, you can't use Super-Seed mode"  , "Error!!", wxICON_ERROR)
                dlg.ShowModal()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -