Browse Source

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

283
ThomasV 10 years ago
parent
commit
ae42576423
  1. 3
      gui/android.py
  2. 1
      gui/qt/main_window.py
  3. 13
      gui/stdio.py
  4. 3
      gui/text.py
  5. 14
      lib/network.py
  6. 5
      lib/synchronizer.py
  7. 7
      lib/wallet.py
  8. 3
      plugins/labels.py

3
gui/android.py

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

1
gui/qt/main_window.py

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

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

3
gui/text.py

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

14
lib/network.py

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

5
lib/synchronizer.py

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

7
lib/wallet.py

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

3
plugins/labels.py

@ -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…
Cancel
Save