| Server IP : 182.53.201.61 / Your IP : 216.73.217.175 Web Server : Apache/2.2.15 (Fedora) System : Linux km10.dyndns.org 2.6.31.5-127.fc12.i686.PAE #1 SMP Sat Nov 7 21:25:57 EST 2009 i686 User : apache ( 48) PHP Version : 5.3.3 Disable Function : NONE MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /usr/lib/python2.6/site-packages/BitTorrent/ |
Upload File : |
from BitTorrent.platform import bttime
class StatusLight(object):
initial_state = 'stopped'
states = {
# state : (stock icon name, tool tip),
'stopped' : ('bt-status-stopped',
_("Paused")),
'empty' : ('bt-status-stopped',
_("No torrents")),
'starting' : ('bt-status-starting',
_("Starting download")),
'pre-natted': ('bt-status-pre-natted',
_("Starting download")),
'running' : ('bt-status-running',
_("Running normally")),
'natted' : ('bt-status-natted',
_("Downloads may be slow:\nProbably firewalled/NATted")),
'broken' : ('bt-status-broken',
_("Check network connection")),
}
messages = {
# message : default new state,
'stop' : 'stopped' ,
'empty' : 'empty' ,
'start' : 'starting' ,
'seen_peers' : 'pre-natted',
'seen_remote_peers' : 'running' ,
'broken' : 'broken' ,
}
transitions = {
# state : { message : custom new state, },
'pre-natted' : { 'start' : 'pre-natted',
'seen_peers' : 'pre-natted',},
'running' : { 'start' : 'running' ,
'seen_peers' : 'running' ,},
'natted' : { 'start' : 'natted' ,
'seen_peers' : 'natted' ,},
'broken' : { 'start' : 'broken' ,},
#TODO: add broken transitions
}
time_to_nat = 60 * 5 # 5 minutes
def __init__(self):
self.mystate = self.initial_state
self.start_time = None
def send_message(self, message):
if message not in self.messages.keys():
#print 'bad message', message
return
new_state = self.messages[message]
if self.transitions.has_key(self.mystate):
if self.transitions[self.mystate].has_key(message):
new_state = self.transitions[self.mystate][message]
# special pre-natted timeout logic
if new_state == 'pre-natted':
if (self.mystate == 'pre-natted' and
bttime() - self.start_time > self.time_to_nat):
# go to natted state after a while
new_state = 'natted'
elif self.mystate != 'pre-natted':
# start pre-natted timer
self.start_time = bttime()
if new_state != self.mystate:
#print 'changing state from', self.mystate, 'to', new_state
self.mystate = new_state
self.change_state()
def change_state(self):
pass
import gtk
class GtkStatusLight(gtk.EventBox, StatusLight):
def __init__(self, main):
gtk.EventBox.__init__(self)
StatusLight.__init__(self)
self.main = main
self.image = None
self.images = {}
for k,(s,t) in self.states.items():
i = gtk.Image()
i.set_from_stock(s, gtk.ICON_SIZE_LARGE_TOOLBAR)
i.show()
self.images[k] = i
self.set_size_request(24,24)
self.main.tooltips.set_tip(self, 'tooltip')
self.send_message('stop')
def change_state(self):
state = self.mystate
assert self.states.has_key(state)
if self.image is not None:
self.remove(self.image)
self.image = self.images[state]
self.add(self.image)
stock, tooltip = self.states[state]
self.main.tooltips.set_tip(self, tooltip)