From 31a1addce5c3c400ad4a805b2c496966c165b6a4 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Fri, 16 Mar 2012 22:18:58 +0100 Subject: [PATCH 1/3] callbacks --- client/interface.py | 14 ++++++-------- client/wallet.py | 12 +++++++++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/client/interface.py b/client/interface.py index fbc283b5..c8a452fe 100644 --- a/client/interface.py +++ b/client/interface.py @@ -270,19 +270,13 @@ class TCPInterface(Interface): status = c.get('status') if addr in self.addresses_waiting_for_status: self.addresses_waiting_for_status.remove(addr) - if wallet.status.get(addr) != status: - wallet.status[addr] = status - self.send('address.get_history', addr) - self.addresses_waiting_for_history.append(addr) + wallet.get_status_callback(addr, status) elif cmd == 'address.get_history': addr = c.get('address') if addr in self.addresses_waiting_for_history: self.addresses_waiting_for_history.remove(addr) - wallet.history[addr] = data - wallet.synchronize() - wallet.update_tx_history() - wallet.save() + wallet.get_history_callback(addr, data) self.was_updated = True else: print "received message:", c @@ -308,6 +302,10 @@ class TCPInterface(Interface): 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) + def start_session(self, wallet): self.s = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) self.s.settimeout(1) diff --git a/client/wallet.py b/client/wallet.py index 993a51b8..58dd14ad 100644 --- a/client/wallet.py +++ b/client/wallet.py @@ -703,6 +703,17 @@ class Wallet: else: return s + def get_status_callback(self, addr, status): + if self.status.get(addr) != status: + self.status[addr] = status + self.interface.get_history(addr) + + def get_history_callback(self, addr, data): + self.history[addr] = data + self.synchronize() + self.update_tx_history() + self.save() + def get_tx_history(self): lines = self.tx_history.values() lines = sorted(lines, key=operator.itemgetter("nTime")) @@ -828,7 +839,6 @@ class Wallet: self.imported_keys[k] = c self.save() - def get_alias(self, alias, interactive = False, show_message=None, question = None): try: target, signing_address, auth_name = self.read_alias(alias) From f33e347fad729b50ab749feea2d3379451186777 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Fri, 16 Mar 2012 22:24:28 +0100 Subject: [PATCH 2/3] rename methods --- client/interface.py | 4 ++-- client/wallet.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/interface.py b/client/interface.py index c8a452fe..8c90891c 100644 --- a/client/interface.py +++ b/client/interface.py @@ -270,13 +270,13 @@ class TCPInterface(Interface): status = c.get('status') if addr in self.addresses_waiting_for_status: self.addresses_waiting_for_status.remove(addr) - wallet.get_status_callback(addr, status) + wallet.receive_status_callback(addr, status) elif cmd == 'address.get_history': addr = c.get('address') if addr in self.addresses_waiting_for_history: self.addresses_waiting_for_history.remove(addr) - wallet.get_history_callback(addr, data) + wallet.receive_history_callback(addr, data) self.was_updated = True else: print "received message:", c diff --git a/client/wallet.py b/client/wallet.py index 58dd14ad..2539adc3 100644 --- a/client/wallet.py +++ b/client/wallet.py @@ -703,12 +703,12 @@ class Wallet: else: return s - def get_status_callback(self, addr, status): + def receive_status_callback(self, addr, status): if self.status.get(addr) != status: self.status[addr] = status self.interface.get_history(addr) - def get_history_callback(self, addr, data): + def receive_history_callback(self, addr, data): self.history[addr] = data self.synchronize() self.update_tx_history() From 47f466cbe13a377da295cb7d070bbf6218ec4da2 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Sat, 17 Mar 2012 00:02:20 +0100 Subject: [PATCH 3/3] message IDs --- client/interface.py | 80 +++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/client/interface.py b/client/interface.py index 8c90891c..d507e56d 100644 --- a/client/interface.py +++ b/client/interface.py @@ -208,6 +208,8 @@ class TCPInterface(Interface): def __init__(self, host, port): Interface.__init__(self, host, port) + self.message_id = 0 + self.messages = {} self.tx_event = threading.Event() self.addresses_waiting_for_status = [] @@ -217,18 +219,11 @@ class TCPInterface(Interface): self.up_to_date_event = threading.Event() self.up_to_date_event.clear() - def send(self, cmd, params = []): - request = json.dumps( { 'method':cmd, 'params':params } ) + def send(self, method, params = []): + request = json.dumps( { 'id':self.message_id, 'method':method, 'params':params } ) + self.messages[self.message_id] = (method, params) self.s.send( request + '\n' ) - - 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 + self.message_id += 1 def listen_thread(self, wallet): try: @@ -248,36 +243,45 @@ class TCPInterface(Interface): c = out[0:s] out = out[s+1:] c = json.loads(c) - cmd = c.get('method') - data = c.get('result') - if cmd == 'server.banner': - self.message = data + #print c + msg_id = c.get('id') + result = c.get('result') + error = c.get('error') + + if msg_id is None: + print "error: message without ID" + continue + + method, params = self.messages[msg_id] + + if method == 'server.banner': + self.message = result self.was_updated = True - elif cmd == 'server.peers': - self.servers = map( lambda x:x[1], data ) + elif method == 'server.peers': + self.servers = map( lambda x:x[1], result ) - elif cmd == 'transaction.broadcast': - self.tx_result = data - self.tx_event.set() - - elif cmd == 'numblocks.subscribe': - self.blocks = data - - elif cmd =='address.subscribe': - addr = c.get('address') - status = c.get('status') + elif method == 'address.subscribe': + addr = params[0] if addr in self.addresses_waiting_for_status: self.addresses_waiting_for_status.remove(addr) - wallet.receive_status_callback(addr, status) - - elif cmd == 'address.get_history': - addr = c.get('address') + wallet.receive_status_callback(addr, result) + + elif method == 'address.get_history': + addr = params[0] if addr in self.addresses_waiting_for_history: self.addresses_waiting_for_history.remove(addr) - wallet.receive_history_callback(addr, data) + wallet.receive_history_callback(addr, result) self.was_updated = True + + elif method == 'transaction.broadcast': + self.tx_result = result + self.tx_event.set() + + elif method == 'numblocks.subscribe': + self.blocks = result + else: print "received message:", c @@ -295,15 +299,21 @@ class TCPInterface(Interface): def update_wallet(self,wallet): 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): - self.send('address.subscribe', address) + self.send('address.subscribe', [address]) self.addresses_waiting_for_status.append(address) def get_servers(self): self.send('server.peers') def get_history(self,addr): - self.send('address.get_history', addr) + self.send('address.get_history', [addr]) self.addresses_waiting_for_history.append(addr) def start_session(self, wallet): @@ -311,7 +321,7 @@ class TCPInterface(Interface): self.s.settimeout(1) self.s.connect(( self.host, self.port)) 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('numblocks.subscribe') for address in wallet.all_addresses():