callbacks
This commit is contained in:
parent
47f466cbe1
commit
40bc4dbe64
|
@ -42,13 +42,8 @@ class Interface:
|
||||||
self.disconnected_event = threading.Event()
|
self.disconnected_event = threading.Event()
|
||||||
self.disconnected_event.clear()
|
self.disconnected_event.clear()
|
||||||
|
|
||||||
|
|
||||||
def send_tx(self, data):
|
def send_tx(self, data):
|
||||||
out = self.handler('blockchain.transaction.broadcast', data )
|
out = self.handler('transaction.broadcast', data )
|
||||||
return out
|
|
||||||
|
|
||||||
def retrieve_history(self, address):
|
|
||||||
out = self.handler('blockchain.address.get_history', address )
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
def get_servers(self):
|
def get_servers(self):
|
||||||
|
@ -67,7 +62,6 @@ class NativeInterface(Interface):
|
||||||
def start_session(self, wallet):
|
def start_session(self, wallet):
|
||||||
addresses = wallet.all_addresses()
|
addresses = wallet.all_addresses()
|
||||||
version = wallet.electrum_version
|
version = wallet.electrum_version
|
||||||
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 )
|
||||||
thread.start_new_thread(self.poll_thread, (wallet,))
|
thread.start_new_thread(self.poll_thread, (wallet,))
|
||||||
|
@ -82,8 +76,9 @@ class NativeInterface(Interface):
|
||||||
'peers':'peers',
|
'peers':'peers',
|
||||||
'session.poll':'poll',
|
'session.poll':'poll',
|
||||||
'session.update':'update_session',
|
'session.update':'update_session',
|
||||||
'blockchain.transaction.broadcast':'tx',
|
'transaction.broadcast':'tx',
|
||||||
'blockchain.address.get_history':'h'
|
'address.get_history':'h',
|
||||||
|
'address.subscribe':'address.subscribe'
|
||||||
}
|
}
|
||||||
cmd = cmds[method]
|
cmd = cmds[method]
|
||||||
if type(params) != type(''): params = repr( params )
|
if type(params) != type(''): params = repr( params )
|
||||||
|
@ -108,39 +103,51 @@ class NativeInterface(Interface):
|
||||||
def poll_interval(self):
|
def poll_interval(self):
|
||||||
return 5
|
return 5
|
||||||
|
|
||||||
def update_wallet(self, wallet):
|
def retrieve_history(self, address):
|
||||||
is_new = False
|
out = self.handler('address.get_history', address )
|
||||||
changed_addresses = self.poll()
|
return out
|
||||||
for addr, blk_hash in changed_addresses.items():
|
|
||||||
if wallet.status.get(addr) != blk_hash:
|
|
||||||
print "updating history for", addr
|
|
||||||
wallet.history[addr] = self.retrieve_history(addr)
|
|
||||||
wallet.status[addr] = blk_hash
|
|
||||||
is_new = True
|
|
||||||
|
|
||||||
if is_new or wallet.remote_url:
|
def get_history(self, addr, history_callback):
|
||||||
|
data = self.retrieve_history(addr)
|
||||||
|
apply(history_callback, (addr, data) )
|
||||||
self.was_updated = True
|
self.was_updated = True
|
||||||
is_new = wallet.synchronize()
|
|
||||||
wallet.update_tx_history()
|
def subscribe(self, addr, status_callback):
|
||||||
wallet.save()
|
status = self.handler('address.subscribe', [ self.session_id, addr ] )
|
||||||
return is_new
|
apply(status_callback, (addr, status) )
|
||||||
|
|
||||||
|
def update_wallet(self, wallet):
|
||||||
|
while True:
|
||||||
|
changed_addresses = self.poll()
|
||||||
|
if changed_addresses:
|
||||||
|
self.is_up_to_date = False
|
||||||
else:
|
else:
|
||||||
return False
|
self.is_up_to_date = True
|
||||||
|
break
|
||||||
|
|
||||||
|
for addr, status in changed_addresses.items():
|
||||||
|
wallet.receive_status_callback(addr, status)
|
||||||
|
|
||||||
|
#if is_new or wallet.remote_url:
|
||||||
|
# self.was_updated = True
|
||||||
|
# is_new = wallet.synchronize()
|
||||||
|
# wallet.update_tx_history()
|
||||||
|
# wallet.save()
|
||||||
|
# return is_new
|
||||||
|
#else:
|
||||||
|
# return False
|
||||||
|
|
||||||
def poll(self):
|
def poll(self):
|
||||||
out = self.handler('session.poll', self.session_id )
|
out = self.handler('session.poll', self.session_id )
|
||||||
blocks, changed_addr = ast.literal_eval( out )
|
blocks, changed_addr = ast.literal_eval( out )
|
||||||
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
|
|
||||||
self.is_up_to_date = True
|
|
||||||
return changed_addr
|
return changed_addr
|
||||||
|
|
||||||
def poll_thread(self, wallet):
|
def poll_thread(self, wallet):
|
||||||
while self.is_connected:
|
while self.is_connected:
|
||||||
try:
|
try:
|
||||||
if self.update_wallet(wallet):
|
self.update_wallet(wallet)
|
||||||
self.update_session( wallet.all_addresses() )
|
|
||||||
time.sleep(self.poll_interval())
|
time.sleep(self.poll_interval())
|
||||||
except socket.gaierror:
|
except socket.gaierror:
|
||||||
break
|
break
|
||||||
|
@ -305,14 +312,14 @@ class TCPInterface(Interface):
|
||||||
self.tx_event.wait()
|
self.tx_event.wait()
|
||||||
return self.tx_result
|
return self.tx_result
|
||||||
|
|
||||||
def subscribe(self,address):
|
def subscribe(self, address, callback):
|
||||||
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):
|
def get_history(self, addr, callback):
|
||||||
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)
|
||||||
|
|
||||||
|
@ -325,7 +332,7 @@ class TCPInterface(Interface):
|
||||||
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():
|
||||||
self.subscribe(address)
|
self.subscribe(address, wallet.receive_status_callback)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -456,11 +456,7 @@ 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, self.receive_status_callback)
|
||||||
self.interface.subscribe(address)
|
|
||||||
else:
|
|
||||||
self.history[address] = h = self.interface.retrieve_history(address)
|
|
||||||
self.status[address] = h[-1]['blk_hash'] if h else None
|
|
||||||
return address
|
return address
|
||||||
|
|
||||||
|
|
||||||
|
@ -706,9 +702,10 @@ class Wallet:
|
||||||
def receive_status_callback(self, addr, status):
|
def receive_status_callback(self, addr, status):
|
||||||
if self.status.get(addr) != status:
|
if self.status.get(addr) != status:
|
||||||
self.status[addr] = status
|
self.status[addr] = status
|
||||||
self.interface.get_history(addr)
|
self.interface.get_history(addr, self.receive_history_callback)
|
||||||
|
|
||||||
def receive_history_callback(self, addr, data):
|
def receive_history_callback(self, addr, data):
|
||||||
|
#print "updating history for", addr
|
||||||
self.history[addr] = data
|
self.history[addr] = data
|
||||||
self.synchronize()
|
self.synchronize()
|
||||||
self.update_tx_history()
|
self.update_tx_history()
|
||||||
|
|
Loading…
Reference in New Issue