new interface
This commit is contained in:
parent
3e49cfdbd4
commit
9e316b7d2b
|
@ -190,7 +190,7 @@ class ElectrumWindow(QMainWindow):
|
||||||
if self.wallet.interface.blocks == 0:
|
if self.wallet.interface.blocks == 0:
|
||||||
text = "Server not ready"
|
text = "Server not ready"
|
||||||
icon = QIcon(":icons/status_disconnected.png")
|
icon = QIcon(":icons/status_disconnected.png")
|
||||||
elif not self.wallet.interface.was_polled:
|
elif not self.wallet.interface.is_up_to_date:
|
||||||
text = "Synchronizing..."
|
text = "Synchronizing..."
|
||||||
icon = QIcon(":icons/status_waiting.svg")
|
icon = QIcon(":icons/status_waiting.svg")
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -34,7 +34,7 @@ class Interface:
|
||||||
self.message = ''
|
self.message = ''
|
||||||
self.is_connected = False
|
self.is_connected = False
|
||||||
self.was_updated = True # fixme: use a semaphore
|
self.was_updated = True # fixme: use a semaphore
|
||||||
self.was_polled = False # True after the first poll
|
self.is_up_to_date = False # True after the first poll
|
||||||
|
|
||||||
def send_tx(self, data):
|
def send_tx(self, data):
|
||||||
out = self.handler('blockchain.transaction.broadcast', data )
|
out = self.handler('blockchain.transaction.broadcast', data )
|
||||||
|
@ -66,7 +66,7 @@ class NativeInterface(Interface):
|
||||||
self.port = port
|
self.port = port
|
||||||
|
|
||||||
def new_session(self, addresses, version):
|
def new_session(self, addresses, version):
|
||||||
self.was_polled = False
|
self.is_up_to_date = False
|
||||||
out = self.handler('session.new', [ version, addresses ] )
|
out = self.handler('session.new', [ version, addresses ] )
|
||||||
self.session_id, self.message = ast.literal_eval( out )
|
self.session_id, self.message = ast.literal_eval( out )
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ class NativeInterface(Interface):
|
||||||
if blocks == -1: raise BaseException("session not found")
|
if blocks == -1: raise BaseException("session not found")
|
||||||
self.blocks = int(blocks)
|
self.blocks = int(blocks)
|
||||||
if changed_addr: self.was_updated = True
|
if changed_addr: self.was_updated = True
|
||||||
self.was_polled = True
|
self.is_up_to_date = True
|
||||||
return changed_addr
|
return changed_addr
|
||||||
|
|
||||||
def update_wallet_thread(self, wallet):
|
def update_wallet_thread(self, wallet):
|
||||||
|
@ -197,7 +197,7 @@ class NativeInterface(Interface):
|
||||||
|
|
||||||
|
|
||||||
class TCPInterface(Interface):
|
class TCPInterface(Interface):
|
||||||
"""json-rpc over TCP"""
|
"""json-rpc over persistent TCP connection"""
|
||||||
|
|
||||||
def __init__(self, host=None, port=50001):
|
def __init__(self, host=None, port=50001):
|
||||||
Interface.__init__(self)
|
Interface.__init__(self)
|
||||||
|
@ -210,29 +210,64 @@ class TCPInterface(Interface):
|
||||||
request = json.dumps( { 'method':cmd, 'params':params } )
|
request = json.dumps( { 'method':cmd, 'params':params } )
|
||||||
self.s.send( request + '\n' )
|
self.s.send( request + '\n' )
|
||||||
|
|
||||||
|
def send_tx(self, data):
|
||||||
|
out = self.send('transaction.broadcast', data )
|
||||||
|
return out
|
||||||
|
|
||||||
def listen_thread(self, wallet):
|
def listen_thread(self, wallet):
|
||||||
|
try:
|
||||||
|
self.is_connected = True
|
||||||
out = ''
|
out = ''
|
||||||
while True:
|
while True:
|
||||||
msg = self.s.recv(1024)
|
msg = self.s.recv(1024)
|
||||||
out += msg
|
out += msg
|
||||||
|
while True:
|
||||||
s = out.find('\n')
|
s = out.find('\n')
|
||||||
if s!=-1:
|
if s==-1: break
|
||||||
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')
|
cmd = c.get('method')
|
||||||
if cmd == 'server.banner':
|
if cmd == 'server.banner':
|
||||||
self.message = c.get('result')
|
self.message = c.get('result')
|
||||||
|
if cmd == 'numblocks.subscribe':
|
||||||
|
self.blocks = c.get('result')
|
||||||
|
print "received numblocks",self.blocks
|
||||||
|
elif cmd =='address.subscribe':
|
||||||
|
addr = c.get('address')
|
||||||
|
status = c.get('status')
|
||||||
|
if wallet.status.get(addr) != status:
|
||||||
|
self.send('address.get_history', addr)
|
||||||
|
wallet.status[addr] = status
|
||||||
|
self.is_up_to_date = False
|
||||||
|
else:
|
||||||
|
self.is_up_to_date = True
|
||||||
|
elif cmd == 'address.get_history':
|
||||||
|
addr = c.get('address')
|
||||||
|
print "updating history for", addr
|
||||||
|
wallet.history[addr] = c.get('result')
|
||||||
|
wallet.synchronize()
|
||||||
|
wallet.update_tx_history()
|
||||||
|
wallet.save()
|
||||||
|
self.was_updated = True
|
||||||
else:
|
else:
|
||||||
print "received message:", c
|
print "received message:", c
|
||||||
|
except:
|
||||||
|
traceback.print_exc(file=sys.stdout)
|
||||||
|
self.is_connected = False
|
||||||
|
|
||||||
|
|
||||||
|
def subscribe(self,address):
|
||||||
|
self.send('address.subscribe', address)
|
||||||
|
|
||||||
|
|
||||||
def start(self, wallet):
|
def start(self, wallet):
|
||||||
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', None)
|
self.send('server.banner')
|
||||||
|
self.send('numblocks.subscribe')
|
||||||
for address in wallet.all_addresses():
|
for address in wallet.all_addresses():
|
||||||
self.send('blockchain.address.subscribe', address)
|
self.subscribe(address)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class HttpInterface(Interface):
|
class HttpInterface(Interface):
|
||||||
|
|
|
@ -449,6 +449,9 @@ class Wallet:
|
||||||
|
|
||||||
def create_new_address(self, bool):
|
def create_new_address(self, bool):
|
||||||
address = self.create_new_address_without_history(bool)
|
address = self.create_new_address_without_history(bool)
|
||||||
|
if self.interface.port == 50001:
|
||||||
|
self.interface.subscribe(address)
|
||||||
|
else:
|
||||||
self.history[address] = h = self.interface.retrieve_history(address)
|
self.history[address] = h = self.interface.retrieve_history(address)
|
||||||
self.status[address] = h[-1]['blk_hash'] if h else None
|
self.status[address] = h[-1]['blk_hash'] if h else None
|
||||||
return address
|
return address
|
||||||
|
|
Loading…
Reference in New Issue