URI: 
       tMerge branch 'master' of gitorious.org:electrum/electrum - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit c5b122a779dc2c085739c97609cbe13b403db1b6
   DIR parent 8d88b0702da6102f2f2aeae801ab679382506367
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Mon, 19 Mar 2012 21:19:50 +0300
       
       Merge branch 'master' of gitorious.org:electrum/electrum
       
       Diffstat:
         M client/gui_qt.py                    |      24 ++++++++++++++++--------
         M client/interface.py                 |      70 ++++++++++++++-----------------
       
       2 files changed, 48 insertions(+), 46 deletions(-)
       ---
   DIR diff --git a/client/gui_qt.py b/client/gui_qt.py
       t@@ -854,8 +854,9 @@ class ElectrumWindow(QMainWindow):
                hbox = QHBoxLayout()
                l = QLabel()
                l.setPixmap(QPixmap(":icons/network.png"))
       -        hbox.addWidget(l)
       +        hbox.addWidget(l)        
                hbox.addWidget(QLabel(status))
       +
                vbox.addLayout(hbox)
        
                hbox = QHBoxLayout()
       t@@ -865,13 +866,20 @@ class ElectrumWindow(QMainWindow):
                hbox.addWidget(host_line)
                vbox.addLayout(hbox)
        
       -        servers_list = QTreeWidget(parent)
       -        servers_list.setHeaderLabels( [ 'Active servers'] )
       -        servers_list.setMaximumHeight(150)
       -        for item in wallet.interface.servers:
       -            servers_list.addTopLevelItem(QTreeWidgetItem( [ item ] ))
       -        servers_list.connect(servers_list, SIGNAL('itemClicked(QTreeWidgetItem*, int)'), lambda x:host_line.setText( x.text(0) + ':%d'%wallet.port ))
       -        vbox.addWidget(servers_list)
       +        if wallet.interface.servers:
       +            servers_list = QTreeWidget(parent)
       +            servers_list.setHeaderLabels( [ 'Active servers'] )
       +            servers_list.setMaximumHeight(150)
       +            for item in wallet.interface.servers:
       +                servers_list.addTopLevelItem(QTreeWidgetItem( [ item ] ))
       +            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))
                d.setLayout(vbox) 
   DIR diff --git a/client/interface.py b/client/interface.py
       t@@ -21,7 +21,7 @@ import random, socket, ast
        import thread, threading, traceback, sys, time, json
        
        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:
       t@@ -32,7 +32,7 @@ class Interface:
                self.history_callback = history_callback
                self.newblock_callback = newblock_callback
        
       -        self.servers = DEFAULT_SERVERS                            # actual list from IRC
       +        self.servers = [] # actual list from IRC
                self.rtime = 0
                self.blocks = 0 
                self.message = ''
       t@@ -60,8 +60,6 @@ class Interface:
                self.tx_event.wait()
                return self.tx_result
        
       -    def get_servers(self):
       -        pass
        
            def start_session(self, addresses, version):
                pass
       t@@ -113,6 +111,7 @@ class Interface:
                        self.is_up_to_date = True
        
                elif method == 'server.peers':
       +            print "Received server list: ", result
                    self.servers = map( lambda x:x[1], result )
        
                elif method == 'address.subscribe':
       t@@ -148,11 +147,36 @@ class Interface:
                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):
            """ non-persistent connection. synchronous calls"""
        
            def start_session(self, addresses, version):
                self.send([('session.new', [ version, addresses ])] )
       +        self.send([('server.peers',[])])
                thread.start_new_thread(self.poll_thread, (5,))
        
            def get_history(self, address):
       t@@ -189,31 +213,6 @@ class PollingInterface(Interface):
                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)
       -
        
        
        
       t@@ -247,7 +246,7 @@ class NativeInterface(PollingInterface):
                    request = repr ( (cmd, str_params) ) + "#"
                    s = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
                    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 )
                    out = ''
                    while 1:
       t@@ -277,7 +276,7 @@ class HttpInterface(PollingInterface):
        
            def start_session(self, addresses, version):
                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)
                thread.start_new_thread(self.poll_thread, (15,))
        
       t@@ -373,9 +372,6 @@ class AsynchronousInterface(Interface):
                    out += request + '\n'
                self.s.send( out )
        
       -    def get_servers(self):
       -        self.send([('server.peers',[])])
       -
            def get_history(self, addr):
                self.send([('address.get_history', [addr])])
                self.addresses_waiting_for_history.append(addr)
       t@@ -385,7 +381,7 @@ class AsynchronousInterface(Interface):
                self.s.settimeout(1)
                self.s.connect(( self.host, self.port))
                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)
        
        
       t@@ -414,7 +410,7 @@ def new_interface(wallet):
            interface = InterfaceClass(host, port, address_cb, history_cb)
                
            return interface
       -       
       +
        
        def loop_interfaces_thread(wallet):
            while True:
       t@@ -422,7 +418,6 @@ def loop_interfaces_thread(wallet):
                    addresses = wallet.all_addresses()
                    version = wallet.electrum_version
                    wallet.interface.start_session(addresses, version)
       -            wallet.interface.get_servers()
        
                    wallet.interface.disconnected_event.wait()
                    print "Disconnected"
       t@@ -436,4 +431,3 @@ def loop_interfaces_thread(wallet):
        
                print "Starting new session: %s:%d"%(wallet.host,wallet.port)
                wallet.interface = new_interface(wallet)
       -