Browse Source

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

283
ThomasV 13 years ago
parent
commit
6b1079be7c
  1. 84
      client/interface.py
  2. 12
      client/wallet.py

84
client/interface.py

@ -208,6 +208,8 @@ class TCPInterface(Interface):
def __init__(self, host, port): def __init__(self, host, port):
Interface.__init__(self, host, port) Interface.__init__(self, host, port)
self.message_id = 0
self.messages = {}
self.tx_event = threading.Event() self.tx_event = threading.Event()
self.addresses_waiting_for_status = [] self.addresses_waiting_for_status = []
@ -217,18 +219,11 @@ class TCPInterface(Interface):
self.up_to_date_event = threading.Event() self.up_to_date_event = threading.Event()
self.up_to_date_event.clear() self.up_to_date_event.clear()
def send(self, cmd, params = []): def send(self, method, params = []):
request = json.dumps( { 'method':cmd, 'params':params } ) request = json.dumps( { 'id':self.message_id, 'method':method, 'params':params } )
self.messages[self.message_id] = (method, params)
self.s.send( request + '\n' ) self.s.send( request + '\n' )
self.message_id += 1
def send_tx(self, data):
self.tx_event.clear()
self.send('transaction.broadcast', data )
print "waiting for event.."
self.tx_event.wait()
out = self.tx_result
print "result:", out
return out
def listen_thread(self, wallet): def listen_thread(self, wallet):
try: try:
@ -248,42 +243,45 @@ class TCPInterface(Interface):
c = out[0:s] c = out[0:s]
out = out[s+1:] out = out[s+1:]
c = json.loads(c) c = json.loads(c)
cmd = c.get('method')
data = c.get('result')
if cmd == 'server.banner': #print c
self.message = data msg_id = c.get('id')
self.was_updated = True result = c.get('result')
error = c.get('error')
elif cmd == 'server.peers': if msg_id is None:
self.servers = map( lambda x:x[1], data ) print "error: message without ID"
continue
elif cmd == 'transaction.broadcast': method, params = self.messages[msg_id]
self.tx_result = data
self.tx_event.set() if method == 'server.banner':
self.message = result
self.was_updated = True
elif cmd == 'numblocks.subscribe': elif method == 'server.peers':
self.blocks = data self.servers = map( lambda x:x[1], result )
elif cmd =='address.subscribe': elif method == 'address.subscribe':
addr = c.get('address') addr = params[0]
status = c.get('status')
if addr in self.addresses_waiting_for_status: if addr in self.addresses_waiting_for_status:
self.addresses_waiting_for_status.remove(addr) self.addresses_waiting_for_status.remove(addr)
if wallet.status.get(addr) != status: wallet.receive_status_callback(addr, result)
wallet.status[addr] = status
self.send('address.get_history', addr)
self.addresses_waiting_for_history.append(addr)
elif cmd == 'address.get_history': elif method == 'address.get_history':
addr = c.get('address') addr = params[0]
if addr in self.addresses_waiting_for_history: if addr in self.addresses_waiting_for_history:
self.addresses_waiting_for_history.remove(addr) self.addresses_waiting_for_history.remove(addr)
wallet.history[addr] = data wallet.receive_history_callback(addr, result)
wallet.synchronize()
wallet.update_tx_history()
wallet.save()
self.was_updated = True self.was_updated = True
elif method == 'transaction.broadcast':
self.tx_result = result
self.tx_event.set()
elif method == 'numblocks.subscribe':
self.blocks = result
else: else:
print "received message:", c print "received message:", c
@ -301,19 +299,29 @@ class TCPInterface(Interface):
def update_wallet(self,wallet): def update_wallet(self,wallet):
self.up_to_date_event.wait() self.up_to_date_event.wait()
def send_tx(self, data):
self.tx_event.clear()
self.send('transaction.broadcast', [data] )
self.tx_event.wait()
return self.tx_result
def subscribe(self,address): def subscribe(self,address):
self.send('address.subscribe', address) self.send('address.subscribe', [address])
self.addresses_waiting_for_status.append(address) self.addresses_waiting_for_status.append(address)
def get_servers(self): def get_servers(self):
self.send('server.peers') self.send('server.peers')
def get_history(self,addr):
self.send('address.get_history', [addr])
self.addresses_waiting_for_history.append(addr)
def start_session(self, wallet): def start_session(self, wallet):
self.s = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) self.s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
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, (wallet,)) thread.start_new_thread(self.listen_thread, (wallet,))
self.send('client.version', wallet.electrum_version) self.send('client.version', [wallet.electrum_version])
self.send('server.banner') self.send('server.banner')
self.send('numblocks.subscribe') self.send('numblocks.subscribe')
for address in wallet.all_addresses(): for address in wallet.all_addresses():

12
client/wallet.py

@ -703,6 +703,17 @@ class Wallet:
else: else:
return s return s
def receive_status_callback(self, addr, status):
if self.status.get(addr) != status:
self.status[addr] = status
self.interface.get_history(addr)
def receive_history_callback(self, addr, data):
self.history[addr] = data
self.synchronize()
self.update_tx_history()
self.save()
def get_tx_history(self): def get_tx_history(self):
lines = self.tx_history.values() lines = self.tx_history.values()
lines = sorted(lines, key=operator.itemgetter("nTime")) lines = sorted(lines, key=operator.itemgetter("nTime"))
@ -828,7 +839,6 @@ class Wallet:
self.imported_keys[k] = c self.imported_keys[k] = c
self.save() self.save()
def get_alias(self, alias, interactive = False, show_message=None, question = None): def get_alias(self, alias, interactive = False, show_message=None, question = None):
try: try:
target, signing_address, auth_name = self.read_alias(alias) target, signing_address, auth_name = self.read_alias(alias)

Loading…
Cancel
Save