Browse Source

gui dialog to find nodes

283
thomasv 13 years ago
parent
commit
837e2077e3
  1. 24
      client/gui_qt.py
  2. 70
      client/interface.py

24
client/gui_qt.py

@ -854,8 +854,9 @@ class ElectrumWindow(QMainWindow):
hbox = QHBoxLayout() hbox = QHBoxLayout()
l = QLabel() l = QLabel()
l.setPixmap(QPixmap(":icons/network.png")) l.setPixmap(QPixmap(":icons/network.png"))
hbox.addWidget(l) hbox.addWidget(l)
hbox.addWidget(QLabel(status)) hbox.addWidget(QLabel(status))
vbox.addLayout(hbox) vbox.addLayout(hbox)
hbox = QHBoxLayout() hbox = QHBoxLayout()
@ -865,13 +866,20 @@ class ElectrumWindow(QMainWindow):
hbox.addWidget(host_line) hbox.addWidget(host_line)
vbox.addLayout(hbox) vbox.addLayout(hbox)
servers_list = QTreeWidget(parent) if wallet.interface.servers:
servers_list.setHeaderLabels( [ 'Active servers'] ) servers_list = QTreeWidget(parent)
servers_list.setMaximumHeight(150) servers_list.setHeaderLabels( [ 'Active servers'] )
for item in wallet.interface.servers: servers_list.setMaximumHeight(150)
servers_list.addTopLevelItem(QTreeWidgetItem( [ item ] )) for item in wallet.interface.servers:
servers_list.connect(servers_list, SIGNAL('itemClicked(QTreeWidgetItem*, int)'), lambda x:host_line.setText( x.text(0) + ':%d'%wallet.port )) servers_list.addTopLevelItem(QTreeWidgetItem( [ item ] ))
vbox.addWidget(servers_list) servers_list.connect(servers_list, SIGNAL('itemClicked(QTreeWidgetItem*, int)'), lambda x:host_line.setText( x.text(0) + ':%d'%wallet.port ))
vbox.addWidget(servers_list)
else:
hbox = QHBoxLayout()
hbox.addWidget(QLabel('No nodes available'))
b = EnterButton("Find nodes", lambda: wallet.interface.get_servers(wallet) )
hbox.addWidget(b)
vbox.addLayout(hbox)
vbox.addLayout(ok_cancel_buttons(d)) vbox.addLayout(ok_cancel_buttons(d))
d.setLayout(vbox) d.setLayout(vbox)

70
client/interface.py

@ -21,7 +21,7 @@ import random, socket, ast
import thread, threading, traceback, sys, time, json import thread, threading, traceback, sys, time, json
DEFAULT_TIMEOUT = 5 DEFAULT_TIMEOUT = 5
DEFAULT_SERVERS = ['ecdsa.org','electrum.novit.ro'] # list of default servers DEFAULT_SERVERS = ['electrum.bitcoins.sk','ecdsa.org','electrum.novit.ro'] # list of default servers
class Interface: class Interface:
@ -32,7 +32,7 @@ class Interface:
self.history_callback = history_callback self.history_callback = history_callback
self.newblock_callback = newblock_callback self.newblock_callback = newblock_callback
self.servers = DEFAULT_SERVERS # actual list from IRC self.servers = [] # actual list from IRC
self.rtime = 0 self.rtime = 0
self.blocks = 0 self.blocks = 0
self.message = '' self.message = ''
@ -60,8 +60,6 @@ class Interface:
self.tx_event.wait() self.tx_event.wait()
return self.tx_result return self.tx_result
def get_servers(self):
pass
def start_session(self, addresses, version): def start_session(self, addresses, version):
pass pass
@ -113,6 +111,7 @@ class Interface:
self.is_up_to_date = True self.is_up_to_date = True
elif method == 'server.peers': elif method == 'server.peers':
print "Received server list: ", result
self.servers = map( lambda x:x[1], result ) self.servers = map( lambda x:x[1], result )
elif method == 'address.subscribe': elif method == 'address.subscribe':
@ -148,11 +147,36 @@ class Interface:
self.send(messages) self.send(messages)
def get_servers(self, wallet):
# loop over default servers
# requesting servers could be an independent process
addresses = wallet.all_addresses()
version = wallet.electrum_version
for server in DEFAULT_SERVERS:
print "connecting to", server
try:
self.host = server
self.start_session(addresses, version)
wallet.host = self.host
break
except socket.timeout:
continue
except socket.error:
continue
except:
traceback.print_exc(file=sys.stdout)
class PollingInterface(Interface): class PollingInterface(Interface):
""" non-persistent connection. synchronous calls""" """ non-persistent connection. synchronous calls"""
def start_session(self, addresses, version): def start_session(self, addresses, version):
self.send([('session.new', [ version, addresses ])] ) self.send([('session.new', [ version, addresses ])] )
self.send([('server.peers',[])])
thread.start_new_thread(self.poll_thread, (5,)) thread.start_new_thread(self.poll_thread, (5,))
def get_history(self, address): def get_history(self, address):
@ -189,31 +213,6 @@ class PollingInterface(Interface):
self.disconnected_event.set() self.disconnected_event.set()
def get_servers(self):
#thread.start_new_thread(self.update_servers_thread, ())
pass
def update_servers_thread(self):
# if my server is not reachable, I should get the list from one of the default servers
# requesting servers could be an independent process
while True:
for server in DEFAULT_SERVERS:
try:
self.peers_server = server
self.send([('server.peers',[])])
# print "Received server list from %s" % self.peers_server, out
break
except socket.timeout:
continue
except socket.error:
continue
except:
traceback.print_exc(file=sys.stdout)
time.sleep(5*60)
@ -247,7 +246,7 @@ class NativeInterface(PollingInterface):
request = repr ( (cmd, str_params) ) + "#" request = repr ( (cmd, str_params) ) + "#"
s = socket.socket( socket.AF_INET, socket.SOCK_STREAM) s = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(DEFAULT_TIMEOUT) s.settimeout(DEFAULT_TIMEOUT)
s.connect(( self.host if cmd!='peers' else self.peers_server, self.port) ) s.connect(( self.host, self.port) )
s.send( request ) s.send( request )
out = '' out = ''
while 1: while 1:
@ -277,7 +276,7 @@ class HttpInterface(PollingInterface):
def start_session(self, addresses, version): def start_session(self, addresses, version):
self.session_id = None self.session_id = None
self.send([('client.version', [version]), ('server.banner',[]), ('numblocks.subscribe',[])]) self.send([('client.version', [version]), ('server.banner',[]), ('numblocks.subscribe',[]), ('server.peers',[])])
self.subscribe(addresses) self.subscribe(addresses)
thread.start_new_thread(self.poll_thread, (15,)) thread.start_new_thread(self.poll_thread, (15,))
@ -373,9 +372,6 @@ class AsynchronousInterface(Interface):
out += request + '\n' out += request + '\n'
self.s.send( out ) self.s.send( out )
def get_servers(self):
self.send([('server.peers',[])])
def get_history(self, addr): def get_history(self, addr):
self.send([('address.get_history', [addr])]) self.send([('address.get_history', [addr])])
self.addresses_waiting_for_history.append(addr) self.addresses_waiting_for_history.append(addr)
@ -385,7 +381,7 @@ class AsynchronousInterface(Interface):
self.s.settimeout(1) self.s.settimeout(1)
self.s.connect(( self.host, self.port)) self.s.connect(( self.host, self.port))
thread.start_new_thread(self.listen_thread, ()) thread.start_new_thread(self.listen_thread, ())
self.send([('client.version', [version]), ('server.banner',[]), ('numblocks.subscribe',[])]) self.send([('client.version', [version]), ('server.banner',[]), ('numblocks.subscribe',[]), ('server.peers',[])])
self.subscribe(addresses) self.subscribe(addresses)
@ -414,7 +410,7 @@ def new_interface(wallet):
interface = InterfaceClass(host, port, address_cb, history_cb) interface = InterfaceClass(host, port, address_cb, history_cb)
return interface return interface
def loop_interfaces_thread(wallet): def loop_interfaces_thread(wallet):
while True: while True:
@ -422,7 +418,6 @@ def loop_interfaces_thread(wallet):
addresses = wallet.all_addresses() addresses = wallet.all_addresses()
version = wallet.electrum_version version = wallet.electrum_version
wallet.interface.start_session(addresses, version) wallet.interface.start_session(addresses, version)
wallet.interface.get_servers()
wallet.interface.disconnected_event.wait() wallet.interface.disconnected_event.wait()
print "Disconnected" print "Disconnected"
@ -436,4 +431,3 @@ def loop_interfaces_thread(wallet):
print "Starting new session: %s:%d"%(wallet.host,wallet.port) print "Starting new session: %s:%d"%(wallet.host,wallet.port)
wallet.interface = new_interface(wallet) wallet.interface = new_interface(wallet)

Loading…
Cancel
Save