Merge branch 'master' of git://github.com/spesmilo/electrum
This commit is contained in:
commit
ae42576423
|
@ -909,9 +909,6 @@ class ElectrumGui:
|
||||||
network = _network
|
network = _network
|
||||||
config = _config
|
config = _config
|
||||||
network.register_callback('updated', update_callback)
|
network.register_callback('updated', update_callback)
|
||||||
network.register_callback('connected', update_callback)
|
|
||||||
network.register_callback('disconnected', update_callback)
|
|
||||||
network.register_callback('disconnecting', update_callback)
|
|
||||||
|
|
||||||
contacts = util.StoreDict(config, 'contacts')
|
contacts = util.StoreDict(config, 'contacts')
|
||||||
|
|
||||||
|
|
|
@ -163,7 +163,6 @@ class ElectrumWindow(QMainWindow, PrintError):
|
||||||
self.network.register_callback('updated', lambda: self.need_update.set())
|
self.network.register_callback('updated', lambda: self.need_update.set())
|
||||||
self.network.register_callback('new_transaction', self.new_transaction)
|
self.network.register_callback('new_transaction', self.new_transaction)
|
||||||
self.register_callback('status', self.update_status)
|
self.register_callback('status', self.update_status)
|
||||||
self.register_callback('close', self.close)
|
|
||||||
self.register_callback('banner', self.console.showMessage)
|
self.register_callback('banner', self.console.showMessage)
|
||||||
self.register_callback('verified', self.history_list.update_item)
|
self.register_callback('verified', self.history_list.update_item)
|
||||||
|
|
||||||
|
|
13
gui/stdio.py
13
gui/stdio.py
|
@ -35,9 +35,7 @@ class ElectrumGui:
|
||||||
self.contacts = StoreDict(self.config, 'contacts')
|
self.contacts = StoreDict(self.config, 'contacts')
|
||||||
|
|
||||||
self.wallet.network.register_callback('updated', self.updated)
|
self.wallet.network.register_callback('updated', self.updated)
|
||||||
self.wallet.network.register_callback('connected', self.connected)
|
|
||||||
self.wallet.network.register_callback('disconnected', self.disconnected)
|
|
||||||
self.wallet.network.register_callback('disconnecting', self.disconnecting)
|
|
||||||
self.wallet.network.register_callback('peers', self.peers)
|
self.wallet.network.register_callback('peers', self.peers)
|
||||||
self.wallet.network.register_callback('banner', self.print_banner)
|
self.wallet.network.register_callback('banner', self.print_banner)
|
||||||
self.commands = [_("[h] - displays this help text"), \
|
self.commands = [_("[h] - displays this help text"), \
|
||||||
|
@ -73,15 +71,6 @@ class ElectrumGui:
|
||||||
for s in l:
|
for s in l:
|
||||||
print (s)
|
print (s)
|
||||||
|
|
||||||
def connected(self):
|
|
||||||
print ("connected")
|
|
||||||
|
|
||||||
def disconnected(self):
|
|
||||||
print ("disconnected")
|
|
||||||
|
|
||||||
def disconnecting(self):
|
|
||||||
print ("disconnecting")
|
|
||||||
|
|
||||||
def updated(self):
|
def updated(self):
|
||||||
s = self.get_balance()
|
s = self.get_balance()
|
||||||
if s != self.last_balance:
|
if s != self.last_balance:
|
||||||
|
|
|
@ -54,9 +54,6 @@ class ElectrumGui:
|
||||||
|
|
||||||
if self.network:
|
if self.network:
|
||||||
self.network.register_callback('updated', self.update)
|
self.network.register_callback('updated', self.update)
|
||||||
self.network.register_callback('connected', self.refresh)
|
|
||||||
self.network.register_callback('disconnected', self.refresh)
|
|
||||||
self.network.register_callback('disconnecting', self.refresh)
|
|
||||||
|
|
||||||
self.tab_names = [_("History"), _("Send"), _("Receive"), _("Addresses"), _("Contacts"), _("Banner")]
|
self.tab_names = [_("History"), _("Send"), _("Receive"), _("Addresses"), _("Contacts"), _("Banner")]
|
||||||
self.num_tabs = len(self.tab_names)
|
self.num_tabs = len(self.tab_names)
|
||||||
|
|
|
@ -198,10 +198,10 @@ class Network(util.DaemonThread):
|
||||||
with self.lock:
|
with self.lock:
|
||||||
self.callbacks[event].append(callback)
|
self.callbacks[event].append(callback)
|
||||||
|
|
||||||
def trigger_callback(self, event, params=()):
|
def trigger_callback(self, event, *args):
|
||||||
with self.lock:
|
with self.lock:
|
||||||
callbacks = self.callbacks[event][:]
|
callbacks = self.callbacks[event][:]
|
||||||
[callback(*params) for callback in callbacks]
|
[callback(*args) for callback in callbacks]
|
||||||
|
|
||||||
def read_recent_servers(self):
|
def read_recent_servers(self):
|
||||||
if not self.config.path:
|
if not self.config.path:
|
||||||
|
@ -294,11 +294,10 @@ class Network(util.DaemonThread):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
def notify(self, key):
|
def notify(self, key):
|
||||||
value = self.get_status_value(key)
|
|
||||||
if key in ['status', 'updated']:
|
if key in ['status', 'updated']:
|
||||||
self.trigger_callback(key)
|
self.trigger_callback(key)
|
||||||
else:
|
else:
|
||||||
self.trigger_callback(key, (value,))
|
self.trigger_callback(key, self.get_status_value(key))
|
||||||
|
|
||||||
def get_parameters(self):
|
def get_parameters(self):
|
||||||
host, port, protocol = deserialize_server(self.default_server)
|
host, port, protocol = deserialize_server(self.default_server)
|
||||||
|
@ -556,6 +555,13 @@ class Network(util.DaemonThread):
|
||||||
message_id = self.queue_request(method, params)
|
message_id = self.queue_request(method, params)
|
||||||
self.unanswered_requests[message_id] = method, params, callback
|
self.unanswered_requests[message_id] = method, params, callback
|
||||||
|
|
||||||
|
def unsubscribe(self, callback):
|
||||||
|
'''Unsubscribe a callback to free object references to enable GC.'''
|
||||||
|
# Note: we can't unsubscribe from the server, so if we receive
|
||||||
|
# subsequent notifications process_response() will emit a harmless
|
||||||
|
# "received unexpected notification" warning
|
||||||
|
self.subscriptions.pop(callback, None)
|
||||||
|
|
||||||
def connection_down(self, server):
|
def connection_down(self, server):
|
||||||
'''A connection to server either went down, or was never made.
|
'''A connection to server either went down, or was never made.
|
||||||
We distinguish by whether it is in self.interfaces.'''
|
We distinguish by whether it is in self.interfaces.'''
|
||||||
|
|
|
@ -56,6 +56,9 @@ class Synchronizer(ThreadJob):
|
||||||
return (not self.requested_tx and not self.requested_histories
|
return (not self.requested_tx and not self.requested_histories
|
||||||
and not self.requested_addrs)
|
and not self.requested_addrs)
|
||||||
|
|
||||||
|
def release(self):
|
||||||
|
self.network.unsubscribe(self.addr_subscription_response)
|
||||||
|
|
||||||
def add(self, address):
|
def add(self, address):
|
||||||
'''This can be called from the proxy or GUI threads.'''
|
'''This can be called from the proxy or GUI threads.'''
|
||||||
with self.lock:
|
with self.lock:
|
||||||
|
@ -126,7 +129,7 @@ class Synchronizer(ThreadJob):
|
||||||
self.print_error("received tx %s height: %d bytes: %d" %
|
self.print_error("received tx %s height: %d bytes: %d" %
|
||||||
(tx_hash, tx_height, len(tx.raw)))
|
(tx_hash, tx_height, len(tx.raw)))
|
||||||
# callbacks
|
# callbacks
|
||||||
self.network.trigger_callback('new_transaction', (tx,))
|
self.network.trigger_callback('new_transaction', tx)
|
||||||
if not self.requested_tx:
|
if not self.requested_tx:
|
||||||
self.network.trigger_callback('updated')
|
self.network.trigger_callback('updated')
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ from transaction import Transaction
|
||||||
from plugins import run_hook
|
from plugins import run_hook
|
||||||
import bitcoin
|
import bitcoin
|
||||||
from synchronizer import Synchronizer
|
from synchronizer import Synchronizer
|
||||||
|
from verifier import SPV
|
||||||
from mnemonic import Mnemonic
|
from mnemonic import Mnemonic
|
||||||
|
|
||||||
import paymentrequest
|
import paymentrequest
|
||||||
|
@ -434,7 +435,7 @@ class Abstract_Wallet(PrintError):
|
||||||
self.storage.put('verified_tx3', self.verified_tx, True)
|
self.storage.put('verified_tx3', self.verified_tx, True)
|
||||||
|
|
||||||
conf, timestamp = self.get_confirmations(tx_hash)
|
conf, timestamp = self.get_confirmations(tx_hash)
|
||||||
self.network.trigger_callback('verified', (tx_hash, conf, timestamp))
|
self.network.trigger_callback('verified', tx_hash, conf, timestamp)
|
||||||
|
|
||||||
def get_unverified_txs(self):
|
def get_unverified_txs(self):
|
||||||
'''Returns a map from tx hash to transaction height'''
|
'''Returns a map from tx hash to transaction height'''
|
||||||
|
@ -1131,7 +1132,6 @@ class Abstract_Wallet(PrintError):
|
||||||
self.transactions.pop(tx_hash)
|
self.transactions.pop(tx_hash)
|
||||||
|
|
||||||
def start_threads(self, network):
|
def start_threads(self, network):
|
||||||
from verifier import SPV
|
|
||||||
self.network = network
|
self.network = network
|
||||||
if self.network is not None:
|
if self.network is not None:
|
||||||
self.prepare_for_verifier()
|
self.prepare_for_verifier()
|
||||||
|
@ -1145,8 +1145,11 @@ class Abstract_Wallet(PrintError):
|
||||||
def stop_threads(self):
|
def stop_threads(self):
|
||||||
if self.network:
|
if self.network:
|
||||||
self.network.remove_jobs([self.synchronizer, self.verifier])
|
self.network.remove_jobs([self.synchronizer, self.verifier])
|
||||||
|
self.synchronizer.release()
|
||||||
self.synchronizer = None
|
self.synchronizer = None
|
||||||
self.verifier = None
|
self.verifier = None
|
||||||
|
# Now no references to the syncronizer or verifier
|
||||||
|
# remain so they will be GC-ed
|
||||||
self.storage.put('stored_height', self.get_local_height(), True)
|
self.storage.put('stored_height', self.get_local_height(), True)
|
||||||
|
|
||||||
def wait_until_synchronized(self, callback=None):
|
def wait_until_synchronized(self, callback=None):
|
||||||
|
|
|
@ -53,6 +53,9 @@ class Plugin(BasePlugin):
|
||||||
t.setDaemon(True)
|
t.setDaemon(True)
|
||||||
t.start()
|
t.start()
|
||||||
|
|
||||||
|
def on_close_window(self, window):
|
||||||
|
self.wallets.pop(window.wallet)
|
||||||
|
|
||||||
def version(self):
|
def version(self):
|
||||||
return "0.0.1"
|
return "0.0.1"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue