Merge branch 'master' of git://github.com/spesmilo/electrum

This commit is contained in:
ThomasV 2015-11-12 14:32:19 +01:00
commit ae42576423
8 changed files with 23 additions and 26 deletions

View File

@ -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')

View File

@ -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)

View File

@ -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:

View File

@ -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)

View File

@ -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.'''

View File

@ -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')

View File

@ -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):

View File

@ -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"