📄 scheduler.py
字号:
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 + -