URI: 
       tLedger: handler belongs on wallet - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit deccca1827e027739b6ac32787aeee2578e5c8d1
   DIR parent 1ec3ad59cc91241045482c063b180d561d1acff0
  HTML Author: Neil Booth <kyuupichan@gmail.com>
       Date:   Mon, 11 Jan 2016 14:38:45 +0900
       
       Ledger: handler belongs on wallet
       
       Move closer to trezor sanity
       
       Diffstat:
         M plugins/ledger/ledger.py            |      31 +++++++++++++++++--------------
         M plugins/ledger/qt.py                |       8 ++++----
       
       2 files changed, 21 insertions(+), 18 deletions(-)
       ---
   DIR diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py
       t@@ -36,11 +36,16 @@ class BTChipWallet(BIP44_Wallet):
        
            def __init__(self, storage):
                BIP44_Wallet.__init__(self, storage)
       +        # Errors and other user interaction is done through the wallet's
       +        # handler.  The handler is per-window and preserved across
       +        # device reconnects
       +        self.handler = None
       +        self.force_watching_only = False
       +
                self.transport = None
                self.client = None
                self.device_checked = False
                self.signing = False
       -        self.force_watching_only = False
        
            def give_error(self, message, clear_client = False):
                print_error(message)
       t@@ -79,7 +84,6 @@ class BTChipWallet(BIP44_Wallet):
                    try:
                        d = getDongle(BTCHIP_DEBUG)
                        self.client = btchip(d)
       -                self.client.handler = self.plugin.handler
                        firmware = self.client.getFirmwareVersion()['version'].split(".")
                        if not checkFirmware(firmware):
                            d.close()
       t@@ -153,7 +157,7 @@ class BTChipWallet(BIP44_Wallet):
                # it manually from the previous node
                # This only happens once so it's bearable
                self.get_client() # prompt for the PIN before displaying the dialog if necessary
       -        self.plugin.handler.show_message("Computing master public key")
       +        self.handler.show_message("Computing master public key")
                try:
                    splitPath = bip32_path.split('/')
                    fingerprint = 0
       t@@ -176,7 +180,7 @@ class BTChipWallet(BIP44_Wallet):
                except Exception, e:
                    self.give_error(e, True)
                finally:
       -            self.plugin.handler.stop()
       +            self.handler.stop()
        
                return EncodeBase58Check(xpub)
        
       t@@ -193,7 +197,7 @@ class BTChipWallet(BIP44_Wallet):
                if not self.check_proper_device():
                    self.give_error('Wrong device or password')
                address_path = self.address_id(address)
       -        self.plugin.handler.show_message("Signing message ...")
       +        self.handler.show_message("Signing message ...")
                try:
                    info = self.get_client().signMessagePrepare(address_path, message)
                    pin = ""
       t@@ -216,7 +220,7 @@ class BTChipWallet(BIP44_Wallet):
                except Exception, e:
                    self.give_error(e, True)
                finally:
       -            self.plugin.handler.stop()
       +            self.handler.stop()
                self.client.bad = use2FA
                self.signing = False
        
       t@@ -282,7 +286,7 @@ class BTChipWallet(BIP44_Wallet):
                if not self.check_proper_device():
                    self.give_error('Wrong device or password')
        
       -        self.plugin.handler.show_message("Signing Transaction ...")
       +        self.handler.show_message("Signing Transaction ...")
                try:
                    # Get trusted inputs from the original transactions
                    for utxo in inputs:
       t@@ -302,7 +306,7 @@ class BTChipWallet(BIP44_Wallet):
                            transactionOutput = outputData['outputData']
                        if outputData['confirmationNeeded']:
                            # TODO : handle different confirmation types. For the time being only supports keyboard 2FA
       -                    self.plugin.handler.stop()
       +                    self.handler.stop()
                            if 'keycardData' in outputData:
                                pin2 = ""
                                for keycardIndex in range(len(outputData['keycardData'])):
       t@@ -333,7 +337,7 @@ class BTChipWallet(BIP44_Wallet):
                                self.client.bad = True
                                self.device_checked = False
                                self.get_client(True)
       -                    self.plugin.handler.show_message("Signing ...")
       +                    self.handler.show_message("Signing ...")
                        else:
                            # Sign input with the provided PIN
                            inputSignature = self.get_client().untrustedHashSign(inputsPaths[inputIndex],
       t@@ -345,7 +349,7 @@ class BTChipWallet(BIP44_Wallet):
                except Exception, e:
                    self.give_error(e, True)
                finally:
       -            self.plugin.handler.stop()
       +            self.handler.stop()
        
                # Reformat transaction
                inputIndex = 0
       t@@ -363,13 +367,13 @@ class BTChipWallet(BIP44_Wallet):
            def check_proper_device(self):
                pubKey = DecodeBase58Check(self.master_public_keys["x/0'"])[45:]
                if not self.device_checked:
       -            self.plugin.handler.show_message("Checking device")
       +            self.handler.show_message("Checking device")
                    try:
                        nodeData = self.get_client().getWalletPublicKey("44'/0'/0'")
                    except Exception, e:
                        self.give_error(e, True)
                    finally:
       -                self.plugin.handler.stop()
       +                self.handler.stop()
                    pubKeyDevice = compress_public_key(nodeData['publicKey'])
                    self.device_checked = True
                    if pubKey != pubKeyDevice:
       t@@ -387,7 +391,7 @@ class BTChipWallet(BIP44_Wallet):
                            "It should show itself to your computer as a keyboard and output the second factor along with a summary of the transaction it is signing into the text-editor.\r\n\r\n" \
                            "Check that summary and then enter the second factor code here.\r\n" \
                            "Before clicking OK, re-plug the device once more (unplug it and plug it again if you read the second factor code on the same computer)")
       -        response = self.plugin.handler.prompt_auth(msg)
       +        response = self.handler.prompt_auth(msg)
                if response is None:
                    return False, None, None
                return True, response, response
       t@@ -400,7 +404,6 @@ class LedgerPlugin(BasePlugin):
                BasePlugin.__init__(self, parent, config, name)
                self.wallet_class.plugin = self
                self.device = self.wallet_class.device
       -        self.handler = None
        
            def is_enabled(self):
                return BTCHIP
   DIR diff --git a/plugins/ledger/qt.py b/plugins/ledger/qt.py
       t@@ -1,4 +1,5 @@
       -from PyQt4.Qt import QDialog, QInputDialog, QLineEdit, QVBoxLayout, QLabel, SIGNAL
       +from PyQt4.Qt import (QDialog, QInputDialog, QLineEdit,
       +                      QVBoxLayout, QLabel, SIGNAL)
        import PyQt4.QtCore as QtCore
        import threading
        
       t@@ -12,8 +13,7 @@ class Plugin(LedgerPlugin):
            def load_wallet(self, wallet, window):
                if type(wallet) != BTChipWallet:
                    return
       -        if self.handler is None:
       -            self.handler = BTChipQTHandler(window)
       +        wallet.handler = BTChipQTHandler(window)
                if self.btchip_is_connected(wallet):
                    if not wallet.check_proper_device():
                        window.show_error(_("This wallet does not match your Ledger device"))
       t@@ -24,7 +24,7 @@ class Plugin(LedgerPlugin):
        
            def on_create_wallet(self, wallet, wizard):
                assert type(wallet) == self.wallet_class
       -        self.handler = BTChipQTHandler(wizard)
       +        wallet.handler = BTChipQTHandler(wizard)
        #        self.select_device(wallet)
                wallet.create_hd_account(None)