2016-03-16 19:27:12 +01:00
from PyQt4 import QtCore , QtGui
import shared
from tr import _translate
import l10n
from uisignaler import UISignaler
import widgets
class NetworkStatus ( QtGui . QWidget ) :
def __init__ ( self , parent = None ) :
super ( NetworkStatus , self ) . __init__ ( parent )
widgets . load ( ' networkstatus.ui ' , self )
2016-03-24 10:46:26 +01:00
self . labelStartupTime . setText ( _translate ( " networkstatus " , " Since startup on % 1 " ) . arg (
2016-03-16 19:27:12 +01:00
l10n . formatTimestamp ( ) ) )
self . UISignalThread = UISignaler . get ( )
QtCore . QObject . connect ( self . UISignalThread , QtCore . SIGNAL (
" updateNumberOfMessagesProcessed() " ) , self . updateNumberOfMessagesProcessed )
QtCore . QObject . connect ( self . UISignalThread , QtCore . SIGNAL (
" updateNumberOfPubkeysProcessed() " ) , self . updateNumberOfPubkeysProcessed )
QtCore . QObject . connect ( self . UISignalThread , QtCore . SIGNAL (
" updateNumberOfBroadcastsProcessed() " ) , self . updateNumberOfBroadcastsProcessed )
QtCore . QObject . connect ( self . UISignalThread , QtCore . SIGNAL (
" updateNetworkStatusTab() " ) , self . updateNetworkStatusTab )
self . totalNumberOfBytesReceived = 0
self . totalNumberOfBytesSent = 0
self . timer = QtCore . QTimer ( )
self . timer . start ( 2000 ) # milliseconds
QtCore . QObject . connect ( self . timer , QtCore . SIGNAL ( " timeout() " ) , self . runEveryTwoSeconds )
2016-03-17 19:03:17 +01:00
def formatBytes ( self , num ) :
for x in [ ' bytes ' , ' KB ' , ' MB ' , ' GB ' ] :
if num < 1000.0 :
return " %3.0f %s " % ( num , x )
num / = 1000.0
return " %3.0f %s " % ( num , ' TB ' )
def formatByteRate ( self , num ) :
num / = 1000
return " %4.0f KB " % num
2016-03-16 19:27:12 +01:00
def updateNumberOfMessagesProcessed ( self ) :
2016-03-24 10:46:26 +01:00
self . labelSyncStatus . setText ( _translate ( " networkstatus " , " Objects to be synced: % 1 " ) . arg ( str ( sum ( shared . numberOfObjectsThatWeHaveYetToGetPerPeer . itervalues ( ) ) ) ) )
2016-03-16 19:27:12 +01:00
self . labelMessageCount . setText ( _translate (
2016-03-24 10:46:26 +01:00
" networkstatus " , " Processed % 1 person-to-person messages. " ) . arg ( str ( shared . numberOfMessagesProcessed ) ) )
2016-03-16 19:27:12 +01:00
def updateNumberOfBroadcastsProcessed ( self ) :
2016-03-24 10:46:26 +01:00
self . labelSyncStatus . setText ( _translate ( " networkstatus " , " Objects to be synced: % 1 " ) . arg ( str ( sum ( shared . numberOfObjectsThatWeHaveYetToGetPerPeer . itervalues ( ) ) ) ) )
2016-03-16 19:27:12 +01:00
self . labelBroadcastCount . setText ( _translate (
2016-03-24 10:46:26 +01:00
" networkstatus " , " Processed % 1 broadcast messages. " ) . arg ( str ( shared . numberOfBroadcastsProcessed ) ) )
2016-03-16 19:27:12 +01:00
def updateNumberOfPubkeysProcessed ( self ) :
2016-03-24 10:46:26 +01:00
self . labelSyncStatus . setText ( _translate ( " networkstatus " , " Objects to be synced: % 1 " ) . arg ( str ( sum ( shared . numberOfObjectsThatWeHaveYetToGetPerPeer . itervalues ( ) ) ) ) )
2016-03-16 19:27:12 +01:00
self . labelPubkeyCount . setText ( _translate (
2016-03-24 10:46:26 +01:00
" networkstatus " , " Processed % 1 public keys. " ) . arg ( str ( shared . numberOfPubkeysProcessed ) ) )
2016-03-16 19:27:12 +01:00
def updateNumberOfBytes ( self ) :
"""
This function is run every two seconds , so we divide the rate of bytes
sent and received by 2.
"""
self . labelBytesRecvCount . setText ( _translate (
2016-03-24 10:46:26 +01:00
" networkstatus " , " Down: % 1/s Total: % 2 " ) . arg ( self . formatByteRate ( shared . numberOfBytesReceived / 2 ) , self . formatBytes ( self . totalNumberOfBytesReceived ) ) )
2016-03-16 19:27:12 +01:00
self . labelBytesSentCount . setText ( _translate (
2016-03-24 10:46:26 +01:00
" networkstatus " , " Up: % 1/s Total: % 2 " ) . arg ( self . formatByteRate ( shared . numberOfBytesSent / 2 ) , self . formatBytes ( self . totalNumberOfBytesSent ) ) )
2016-03-16 19:27:12 +01:00
self . totalNumberOfBytesReceived + = shared . numberOfBytesReceived
self . totalNumberOfBytesSent + = shared . numberOfBytesSent
shared . numberOfBytesReceived = 0
shared . numberOfBytesSent = 0
def updateNetworkStatusTab ( self ) :
totalNumberOfConnectionsFromAllStreams = 0 # One would think we could use len(sendDataQueues) for this but the number doesn't always match: just because we have a sendDataThread running doesn't mean that the connection has been fully established (with the exchange of version messages).
streamNumberTotals = { }
for host , streamNumber in shared . connectedHostsList . items ( ) :
if not streamNumber in streamNumberTotals :
streamNumberTotals [ streamNumber ] = 1
else :
streamNumberTotals [ streamNumber ] + = 1
while self . tableWidgetConnectionCount . rowCount ( ) > 0 :
self . tableWidgetConnectionCount . removeRow ( 0 )
for streamNumber , connectionCount in streamNumberTotals . items ( ) :
self . tableWidgetConnectionCount . insertRow ( 0 )
if streamNumber == 0 :
newItem = QtGui . QTableWidgetItem ( " ? " )
else :
newItem = QtGui . QTableWidgetItem ( str ( streamNumber ) )
newItem . setFlags (
QtCore . Qt . ItemIsSelectable | QtCore . Qt . ItemIsEnabled )
self . tableWidgetConnectionCount . setItem ( 0 , 0 , newItem )
newItem = QtGui . QTableWidgetItem ( str ( connectionCount ) )
newItem . setFlags (
QtCore . Qt . ItemIsSelectable | QtCore . Qt . ItemIsEnabled )
self . tableWidgetConnectionCount . setItem ( 0 , 1 , newItem )
""" for currentRow in range(self.tableWidgetConnectionCount.rowCount()):
rowStreamNumber = int ( self . tableWidgetConnectionCount . item ( currentRow , 0 ) . text ( ) )
if streamNumber == rowStreamNumber :
foundTheRowThatNeedsUpdating = True
self . tableWidgetConnectionCount . item ( currentRow , 1 ) . setText ( str ( connectionCount ) )
#totalNumberOfConnectionsFromAllStreams += connectionCount
if foundTheRowThatNeedsUpdating == False :
#Add a line to the table for this stream number and update its count with the current connection count.
self . tableWidgetConnectionCount . insertRow ( 0 )
newItem = QtGui . QTableWidgetItem ( str ( streamNumber ) )
newItem . setFlags ( QtCore . Qt . ItemIsSelectable | QtCore . Qt . ItemIsEnabled )
self . tableWidgetConnectionCount . setItem ( 0 , 0 , newItem )
newItem = QtGui . QTableWidgetItem ( str ( connectionCount ) )
newItem . setFlags ( QtCore . Qt . ItemIsSelectable | QtCore . Qt . ItemIsEnabled )
self . tableWidgetConnectionCount . setItem ( 0 , 1 , newItem )
totalNumberOfConnectionsFromAllStreams + = connectionCount """
self . labelTotalConnections . setText ( _translate (
2016-03-24 10:46:26 +01:00
" networkstatus " , " Total Connections: % 1 " ) . arg ( str ( len ( shared . connectedHostsList ) ) ) )
2016-03-16 19:27:12 +01:00
if len ( shared . connectedHostsList ) > 0 and shared . statusIconColor == ' red ' : # FYI: The 'singlelistener' thread sets the icon color to green when it receives an incoming connection, meaning that the user's firewall is configured correctly.
self . window ( ) . setStatusIcon ( ' yellow ' )
elif len ( shared . connectedHostsList ) == 0 :
self . window ( ) . setStatusIcon ( ' red ' )
# timer driven
def runEveryTwoSeconds ( self ) :
self . labelLookupsPerSecond . setText ( _translate (
2016-03-24 10:46:26 +01:00
" networkstatus " , " Inventory lookups per second: % 1 " ) . arg ( str ( shared . numberOfInventoryLookupsPerformed / 2 ) ) )
2016-03-16 19:27:12 +01:00
shared . numberOfInventoryLookupsPerformed = 0
self . updateNumberOfBytes ( )