def __init__(self, ftpfile=None, sender=None, receiver=None): super(Xfer, self).__init__() threading.Thread.__init__(self) # sender and receiver is a connection_manager self.status = '' self.transferred_bytes = 0 self.transfer_rate = '' self.bytes_since_speed_calc = 0 self.elapsed_time = '' self.bps = 0 self.timestamp = None self.direction = '' self.sleeptime = 0.0 self.lock = threading.Lock() if not ftpfile: self.xid = -1 self.filename = 'Connection' self.icon = None self.size = 0 self.ftpfile = None return self.filename = ftpfile.filename self.icon = ftpfile.icon self.size = ftpfile.size self.conn_r = receiver.get_connection() self.conn_s = sender.get_connection() if sender.side == 'RIGHT': self.direction = '<-' else: self.direction = '->' self.ftpfile = ftpfile self.repeater = RepeatTimer(0.5, self.xfer_event)
class Xfer(GObject.GObject, threading.Thread): def __init__(self, ftpfile=None, sender=None, receiver=None): super(Xfer, self).__init__() threading.Thread.__init__(self) # sender and receiver is a connection_manager self.status = '' self.transferred_bytes = 0 self.transfer_rate = '' self.bytes_since_speed_calc = 0 self.elapsed_time = '' self.bps = 0 self.timestamp = None self.direction = '' self.sleeptime = 0.0 self.lock = threading.Lock() if not ftpfile: self.xid = -1 self.filename = 'Connection' self.icon = None self.size = 0 self.ftpfile = None return self.filename = ftpfile.filename self.icon = ftpfile.icon self.size = ftpfile.size self.conn_r = receiver.get_connection() self.conn_s = sender.get_connection() if sender.side == 'RIGHT': self.direction = '<-' else: self.direction = '->' self.ftpfile = ftpfile self.repeater = RepeatTimer(0.5, self.xfer_event) def run(self): if self.xid < 0: return self.conn_s.xfer_in_progress = True self.conn_r.xfer_in_progress = True # Prepare both ends if not self.conn_s._get_init( self.filename) or not self.conn_r._put_init(self.filename): self.conn_s.xfer_in_progress = False self.conn_r.xfer_in_progress = False return # Do the actual transfer self.repeater.start() self.start_time = time.time() self.timestamp = time.time() self.status = 'Transfering' while 1: data = self.conn_s._get_packet() if not data: break tr_size = len(data) self.lock.acquire() self.transferred_bytes += tr_size self.bytes_since_speed_calc += tr_size self.conn_r._put_packet(data) if self.sleeptime > 0: time.sleep(self.sleeptime) self.lock.release() self.repeater.cancel() self.status = 'Finished' self.emit('xfer-event') # Clean up on both ends self.conn_s._get_end() self.conn_r._put_end() self.conn_s.xfer_in_progress = False self.conn_r.xfer_in_progress = False def format_transferred_bytes(self): if self.xid < 0: return '' return '%s of %s' % (self.ftpfile.pretty_size( self.transferred_bytes), self.ftpfile.pretty_size(self.size)) def xfer_event(self): self.lock.acquire() if self.xid >= 0: t2 = time.time() t3 = datetime.timedelta(0, int(round(t2 - self.start_time))) time_since_speed_calc = t2 - self.timestamp if time_since_speed_calc >= 1.2: tr_bytes = self.bytes_since_speed_calc self.timestamp = time.time() self.bytes_since_speed_calc = 0 self.bps = tr_bytes / time_since_speed_calc self.transfer_rate = self.ftpfile.pretty_size( int(round(self.bps))) + '/s' if self.bps > 0: eta = datetime.timedelta(0, int(round(self.size / self.bps))) tminus = eta - t3 if tminus.total_seconds() > 0: self.elapsed_time = str(t3) + ' (ETA: ' + str(tminus) + ')' else: self.elapsed_time = str(t3) else: self.elapsed_time = str(t3) #limit = 409600 #if self.bps > 0: # delta = (self.bps - limit) / 1000000 / 1000 # self.sleeptime += delta self.emit('xfer-event') self.lock.release()