home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / python2.4 / site-packages / BitTorrent / Rerequester.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  6.1 KB  |  179 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. from zurllib import urlopen, quote
  5. from btformats import check_peers
  6. from bencode import bdecode
  7. from threading import Thread, Lock
  8. from socket import error
  9. from time import time
  10. from random import randrange
  11. from binascii import b2a_hex
  12.  
  13. class Rerequester:
  14.     
  15.     def __init__(self, url, interval, sched, howmany, minpeers, connect, externalsched, amount_left, up, down, port, ip, myid, infohash, timeout, errorfunc, maxpeers, doneflag, upratefunc, downratefunc, ever_got_incoming):
  16.         self.url = quote(infohash) % (quote(myid), str(port), b2a_hex, ''.join, []([]([ chr(randrange(256)) for i in xrange(4) ])))
  17.         self.interval = interval
  18.         self.last = None
  19.         self.trackerid = None
  20.         self.announce_interval = 30 * 60
  21.         self.sched = sched
  22.         self.howmany = howmany
  23.         self.minpeers = minpeers
  24.         self.connect = connect
  25.         self.externalsched = externalsched
  26.         self.amount_left = amount_left
  27.         self.up = up
  28.         self.down = down
  29.         self.timeout = timeout
  30.         self.errorfunc = errorfunc
  31.         self.maxpeers = maxpeers
  32.         self.doneflag = doneflag
  33.         self.upratefunc = upratefunc
  34.         self.downratefunc = downratefunc
  35.         self.ever_got_incoming = ever_got_incoming
  36.         self.last_failed = True
  37.         self.last_time = 0
  38.  
  39.     
  40.     def c(self):
  41.         self.sched(self.c, self.interval)
  42.         if self.ever_got_incoming():
  43.             getmore = self.howmany() <= self.minpeers / 3
  44.         else:
  45.             getmore = self.howmany() < self.minpeers
  46.         if getmore or time() - self.last_time > self.announce_interval:
  47.             self.announce()
  48.         
  49.  
  50.     
  51.     def begin(self):
  52.         self.sched(self.c, self.interval)
  53.         self.announce(0)
  54.  
  55.     
  56.     def announce(self, event = None):
  57.         self.last_time = time()
  58.         s = '%s&uploaded=%s&downloaded=%s&left=%s' % (self.url, str(self.up()), str(self.down()), str(self.amount_left()))
  59.         if self.last is not None:
  60.             s += '&last=' + quote(str(self.last))
  61.         
  62.         if self.trackerid is not None:
  63.             s += '&trackerid=' + quote(str(self.trackerid))
  64.         
  65.         if self.howmany() >= self.maxpeers:
  66.             s += '&numwant=0'
  67.         else:
  68.             s += '&compact=1'
  69.         if event != None:
  70.             s += '&event=' + [
  71.                 'started',
  72.                 'completed',
  73.                 'stopped'][event]
  74.         
  75.         set = SetOnce().set
  76.         
  77.         def checkfail(self = self, set = set):
  78.             if set():
  79.                 if self.last_failed and self.upratefunc() < 100 and self.downratefunc() < 100:
  80.                     self.errorfunc('Problem connecting to tracker - timeout exceeded')
  81.                 
  82.                 self.last_failed = True
  83.             
  84.  
  85.         self.sched(checkfail, self.timeout)
  86.         Thread(target = self.rerequest, args = [
  87.             s,
  88.             set]).start()
  89.  
  90.     
  91.     def rerequest(self, url, set):
  92.         
  93.         try:
  94.             h = urlopen(url)
  95.             r = h.read()
  96.             h.close()
  97.             if set():
  98.                 
  99.                 def add(self = self, r = r):
  100.                     self.last_failed = False
  101.                     self.postrequest(r)
  102.  
  103.                 self.externalsched(add, 0)
  104.         except (IOError, error):
  105.             e = None
  106.             if set():
  107.                 
  108.                 def fail(self = self, r = 'Problem connecting to tracker - ' + str(e)):
  109.                     if self.last_failed:
  110.                         self.errorfunc(r)
  111.                     
  112.                     self.last_failed = True
  113.  
  114.                 self.externalsched(fail, 0)
  115.             
  116.         except:
  117.             set()
  118.  
  119.  
  120.     
  121.     def postrequest(self, data):
  122.         
  123.         try:
  124.             r = bdecode(data)
  125.             check_peers(r)
  126.             if r.has_key('failure reason'):
  127.                 self.errorfunc('rejected by tracker - ' + r['failure reason'])
  128.             elif r.has_key('warning message'):
  129.                 self.errorfunc('warning from tracker - ' + r['warning message'])
  130.             
  131.             self.announce_interval = r.get('interval', self.announce_interval)
  132.             self.interval = r.get('min interval', self.interval)
  133.             self.trackerid = r.get('tracker id', self.trackerid)
  134.             self.last = r.get('last')
  135.             p = r['peers']
  136.             peers = []
  137.             ps = len(peers) + self.howmany()
  138.             if ps < self.maxpeers:
  139.                 if self.doneflag.isSet():
  140.                     if r.get('num peers', 1000) - r.get('done peers', 0) > ps * 1.2:
  141.                         self.last = None
  142.                     
  143.                 elif r.get('num peers', 1000) > ps * 1.2:
  144.                     self.last = None
  145.                 
  146.             
  147.             for x in peers:
  148.                 self.connect((x[0], x[1]), x[2])
  149.         except ValueError:
  150.             e = None
  151.             if data != '':
  152.                 self.errorfunc('bad data from tracker - ' + str(e))
  153.             
  154.         except:
  155.             data != ''
  156.  
  157.  
  158.  
  159.  
  160. class SetOnce:
  161.     
  162.     def __init__(self):
  163.         self.lock = Lock()
  164.         self.first = True
  165.  
  166.     
  167.     def set(self):
  168.         
  169.         try:
  170.             self.lock.acquire()
  171.             r = self.first
  172.             self.first = False
  173.             return r
  174.         finally:
  175.             self.lock.release()
  176.  
  177.  
  178.  
  179.