| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- # The contents of this file are subject to the BitTorrent Open Source License
- # Version 1.1 (the License). You may not copy or use this file, in either
- # source code or executable form, except in compliance with the License. You
- # may obtain a copy of the License at http://www.bittorrent.com/license/.
- #
- # Software distributed under the License is distributed on an AS IS basis,
- # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- # for the specific language governing rights and limitations under the
- # License.
- # Written by Matt Chisholm
- from BTL.platform import bttime
- from BTL.translation import _
- class StatusLight(object):
- initial_state = 'stopped'
- states = {
- # state : (stock icon name, label, tool tip),
- 'stopped' : ('stopped',
- _("Paused"),
- _("Paused")),
- 'empty' : ('stopped',
- _("No torrents"),
- _("No torrents")),
- 'starting' : ('starting',
- _("Checking for firewall..."),#_("Starting up..."),
- _("Starting download")),
- 'pre-natted': ('pre-natted',
- _("Checking for firewall..."),
- _("Online, checking for firewall")),
- 'running' : ('running',
- _("Online, ports open"),
- _("Online, running normally")),
- 'natted' : ('natted',
- _("Online, maybe firewalled"),
- _("Online, but downloads may be slow due to firewall/NAT")),
- 'broken' : ('broken',
- _("No network connection"),
- _("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
- def get_tip(self):
- return self.states[self.mystate][2]
- def get_label(self):
- return self.states[self.mystate][1]
|