Merge branch 'master' of gitorious.org:electrum/electrum

This commit is contained in:
ThomasV 2012-03-15 00:18:07 +03:00
commit c6c8c5c077
5 changed files with 87 additions and 78 deletions

View File

@ -163,7 +163,7 @@ if __name__ == '__main__':
cmd = 'help'
# open session
if cmd not in ['password', 'mktx', 'history', 'label', 'contacts', 'help', 'validateaddress', 'signmessage', 'verifymessage', 'eval', 'create']:
if cmd not in ['password', 'mktx', 'history', 'label', 'contacts', 'help', 'validateaddress', 'signmessage', 'verifymessage', 'eval', 'create', 'addresses']:
interface.start_session(wallet)
interface.update_wallet(wallet)
wallet.save()

View File

@ -265,18 +265,18 @@ def run_settings_dialog(wallet, parent):
def run_network_dialog( wallet, parent ):
image = gtk.Image()
image.set_from_stock(gtk.STOCK_NETWORK, gtk.ICON_SIZE_DIALOG)
interface = wallet.interface
if parent:
if wallet.interface.is_connected:
status = "Connected to %s.\n%d blocks\nresponse time: %f"%(wallet.interface.host, wallet.interface.blocks, wallet.interface.rtime)
if interface.is_connected:
status = "Connected to %s:%d\n%d blocks\nresponse time: %f"%(interface.host, interface.port, interface.blocks, interface.rtime)
else:
status = "Not connected"
host = wallet.interface.host
port = wallet.interface.port
host = wallet.host
port = wallet.port
else:
import random
status = "Please choose a server."
host = random.choice( wallet.interface.servers )
host = random.choice( interface.servers )
port = 50000
dialog = gtk.MessageDialog( parent, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
@ -1031,37 +1031,37 @@ class ElectrumWindow:
return vbox
def update_status_bar(self):
interface = self.wallet.interface
if self.funds_error:
text = "Not enough funds"
elif self.wallet.interface.is_connected:
self.network_button.set_tooltip_text("Connected to %s.\n%d blocks\nresponse time: %f"%(self.wallet.interface.host, self.wallet.interface.blocks, self.wallet.interface.rtime))
if self.wallet.interface.blocks == 0:
elif interface.is_connected:
self.network_button.set_tooltip_text("Connected to %s:%d.\n%d blocks\nresponse time: %f"%(interface.host, interface.port, interface.blocks, interface.rtime))
if interface.blocks == 0:
self.status_image.set_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU)
text = "Server not ready"
elif not self.wallet.interface.is_up_to_date:
elif not interface.is_up_to_date:
self.status_image.set_from_stock(gtk.STOCK_REFRESH, gtk.ICON_SIZE_MENU)
text = "Synchronizing..."
else:
self.status_image.set_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU)
self.network_button.set_tooltip_text("Connected to %s.\n%d blocks\nresponse time: %f"%(self.wallet.interface.host, self.wallet.interface.blocks, self.wallet.interface.rtime))
self.network_button.set_tooltip_text("Connected to %s:%d.\n%d blocks\nresponse time: %f"%(interface.host, interface.port, interface.blocks, interface.rtime))
c, u = self.wallet.get_balance()
text = "Balance: %s "%( format_satoshis(c) )
if u: text += "[%s unconfirmed]"%( format_satoshis(u,True) )
else:
self.status_image.set_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU)
self.network_button.set_tooltip_text("Trying to contact %s.\n%d blocks"%(self.wallet.interface.host, self.wallet.interface.blocks))
self.network_button.set_tooltip_text("Trying to contact %s.\n%d blocks"%(interface.host, interface.blocks))
text = "Not connected"
self.status_bar.pop(self.context_id)
self.status_bar.push(self.context_id, text)
if self.wallet.interface.was_updated:
if interface.was_updated:
self.update_history_tab()
self.update_receiving_tab()
# addressbook too...
self.info.set_text( self.wallet.interface.message )
self.wallet.interface.was_updated = False
self.info.set_text( interface.message )
interface.was_updated = False
def update_receiving_tab(self):

View File

@ -208,7 +208,7 @@ class ElectrumWindow(QMainWindow):
self.statusBar().showMessage(text)
self.status_button.setIcon( icon )
if self.wallet.interface.was_updated:
if self.wallet.interface.was_updated and self.wallet.interface.is_up_to_date:
self.wallet.interface.was_updated = False
self.textbox.setText( self.wallet.interface.message )
self.update_history_tab()
@ -787,7 +787,8 @@ class ElectrumWindow(QMainWindow):
show_message("no seed")
sys.exit(1)
wallet.seed = seed
wallet.seed = str(seed)
#print repr(wallet.seed)
wallet.gap_limit = gap
return True
@ -828,19 +829,19 @@ class ElectrumWindow(QMainWindow):
@staticmethod
def network_dialog(wallet, parent=None):
interface = wallet.interface
if parent:
if wallet.interface.is_connected:
status = "Connected to %s.\n%d blocks\nresponse time: %f"%(wallet.interface.host, wallet.interface.blocks, wallet.interface.rtime)
if interface.is_connected:
status = "Connected to %s:%d\n%d blocks\nresponse time: %f"%(interface.host, interface.port, interface.blocks, interface.rtime)
else:
status = "Not connected"
host = wallet.interface.host
port = wallet.interface.port
host = wallet.host
port = wallet.port
else:
import random
status = "Please choose a server."
host = random.choice( wallet.interface.servers )
port = 50000
host = random.choice( interface.servers )
port = wallet.default_port
d = QDialog(parent)
d.setModal(1)
@ -869,7 +870,7 @@ class ElectrumWindow(QMainWindow):
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) + ':50000' ))
servers_list.connect(servers_list, SIGNAL('itemClicked(QTreeWidgetItem*, int)'), lambda x:host_line.setText( x.text(0) + ':%d'%wallet.default_port ))
vbox.addWidget(servers_list)
vbox.addLayout(ok_cancel_buttons(d))
@ -884,7 +885,7 @@ class ElectrumWindow(QMainWindow):
port = int(port)
else:
host = hh
port = 50000
port = wallet.default_port
except:
show_message("error")
if parent == None:
@ -925,7 +926,7 @@ class ElectrumGui():
else:
# ask for seed and gap.
if not ElectrumWindow.seed_dialog( wallet ): return False
wallet.init_mpk( wallet.seed ) # not encrypted at this point
wallet.init_mpk( wallet.seed ) # not encrypted at this point
wallet.synchronize()
if wallet.is_found():

View File

@ -22,13 +22,16 @@ import random, socket, ast
import thread, traceback, sys, time, json
DEFAULT_TIMEOUT=5
DEFAULT_TIMEOUT = 5
DEFAULT_SERVERS = ['ecdsa.org','electrum.novit.ro'] # list of default servers
class Interface:
def __init__(self):
self.default_servers = ['ecdsa.org','electrum.novit.ro'] # list of default servers
self.host = random.choice( self.default_servers ) # random choice when the wallet is created
self.servers = self.default_servers # actual list from IRC
def __init__(self, host, port):
self.host = host
self.port = port
self.servers = DEFAULT_SERVERS # actual list from IRC
self.rtime = 0
self.blocks = 0
self.message = ''
@ -58,10 +61,8 @@ class Interface:
class NativeInterface(Interface):
"""This is the original Electrum protocol. It uses polling, and a non-persistent tcp connection"""
def __init__(self, host=None, port=50000):
Interface.__init__(self)
if host: self.host = host
self.port = port
def __init__(self, host, port):
Interface.__init__(self, host, port)
def start_session(self, wallet):
addresses = wallet.all_addresses()
@ -159,7 +160,7 @@ class NativeInterface(Interface):
# 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 self.default_servers:
for server in DEFAULT_SERVERS:
try:
self.peers_server = server
out = self.handler('peers')
@ -177,17 +178,37 @@ class NativeInterface(Interface):
class HttpInterface(NativeInterface):
def handler(self, method, params = []):
import urllib2, json, time
if type(params) != type([]): params = [ params ]
t1 = time.time()
data = { 'method':method, 'id':'jsonrpc', 'params':params }
data_json = json.dumps(data)
host = 'http://%s:%d'%( self.host if method!='peers' else self.peers_server, self.port )
req = urllib2.Request(host, data_json, {'content-type': 'application/json'})
response_stream = urllib2.urlopen(req)
response = json.loads( response_stream.read() )
out = response.get('result')
if not out:
print response
self.rtime = time.time() - t1
self.is_connected = True
return out
import threading
class TCPInterface(Interface):
"""json-rpc over persistent TCP connection"""
def __init__(self, host=None, port=50001):
Interface.__init__(self)
if host: self.host = host
self.port = 50001
def __init__(self, host, port):
Interface.__init__(self, host, port)
self.tx_event = threading.Event()
self.addresses_waiting_for_status = []
self.addresses_waiting_for_history = []
# up to date
@ -300,41 +321,25 @@ class TCPInterface(Interface):
class HttpInterface(Interface):
def __init__(self):
self.port = 8081
def handler(self, method, params = []):
import urllib2, json, time
if type(params) != type([]): params = [ params ]
t1 = time.time()
data = { 'method':method, 'id':'jsonrpc', 'params':params }
data_json = json.dumps(data)
host = 'http://%s:%d'%( self.host if cmd!='peers' else self.peers_server, self.port )
req = urllib2.Request(host, data_json, {'content-type': 'application/json'})
response_stream = urllib2.urlopen(req)
response = json.loads( response_stream.read() )
out = response.get('result')
if not out:
print response
self.rtime = time.time() - t1
self.is_connected = True
return out
def new_interface(wallet):
host = wallet.host
if wallet.host:
host = wallet.host
else:
host = random.choice( DEFAULT_SERVERS ) # random choice when the wallet is created
port = wallet.port
if port == 50000:
interface = NativeInterface(host,port)
elif port == 50001:
interface = TCPInterface(host,port)
elif port in [80,8080,81,8181]:
elif port in [80, 81, 8080, 8081]:
interface = HttpInterface(host,port)
else:
raise BaseException("unknown protocol: %d"%port)
print "unknown port number: %d. using native protocol."%port
interface = NativeInterface(host,port)
return interface
@ -343,14 +348,16 @@ def loop_interfaces_thread(wallet):
try:
wallet.interface.start_session(wallet)
wallet.interface.get_servers()
wallet.interface.disconnected_event.wait()
print "Disconnected"
except socket.error:
print "Not connected"
print "socket error"
time.sleep(5)
continue
except:
traceback.print_exc(file=sys.stdout)
continue
wallet.interface.disconnected_event.wait()
print "Disconnected"
print "Starting new session: %s:%d"%(wallet.host,wallet.port)
wallet.interface = new_interface(wallet)

View File

@ -263,6 +263,7 @@ class Wallet:
self.imported_keys = {}
self.remote_url = None
self.default_port = 50001
def set_server(self, host, port):
@ -529,9 +530,9 @@ class Wallet:
'use_encryption':self.use_encryption,
'master_public_key': self.master_public_key.encode('hex'),
'fee':self.fee,
'host':self.interface.host,
'port':self.interface.port,
'blocks':self.interface.blocks,
'host':self.host,
'port':self.port,
#'blocks':self.interface.blocks,
'seed':self.seed,
'addresses':self.addresses,
'change_addresses':self.change_addresses,
@ -558,8 +559,8 @@ class Wallet:
data = f.read()
f.close()
except:
#self.interface = NativeInterface()
self.port = 50000
self.host = ''
self.port = self.default_port
return
try:
d = ast.literal_eval( data )