URI: 
       tClean up trezor client interface - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 43d21de1b225eaf9ac4f25fb7c40d0a67e48eaeb
   DIR parent e2628977b37bb447032d521d5b113c832c416134
  HTML Author: Neil Booth <kyuupichan@gmail.com>
       Date:   Sun, 27 Dec 2015 19:29:57 +0900
       
       Clean up trezor client interface
       
       Diffstat:
         M plugins/trezor/client.py            |      20 +++++++++++++++++---
         M plugins/trezor/plugin.py            |      43 ++++++++++++++-----------------
       
       2 files changed, 37 insertions(+), 26 deletions(-)
       ---
   DIR diff --git a/plugins/trezor/client.py b/plugins/trezor/client.py
       t@@ -1,6 +1,7 @@
        from sys import stderr
        
        from electrum.i18n import _
       +from electrum.util import PrintError
        
        
        class GuiMixin(object):
       t@@ -58,18 +59,31 @@ class GuiMixin(object):
        def trezor_client_class(protocol_mixin, base_client, proto):
            '''Returns a class dynamically.'''
        
       -    class TrezorClient(protocol_mixin, GuiMixin, base_client):
       +    class TrezorClient(protocol_mixin, GuiMixin, base_client, PrintError):
        
       -        def __init__(self, transport, device):
       +        def __init__(self, transport, plugin):
                    base_client.__init__(self, transport)
                    protocol_mixin.__init__(self, transport)
                    self.proto = proto
       -            self.device = device
       +            self.device = plugin.device
       +            self.handler = plugin.handler
       +            self.tx_api = plugin
       +            self.bad = False
       +
       +        def firmware_version(self):
       +            f = self.features
       +            v = (f.major_version, f.minor_version, f.patch_version)
       +            self.print_error('firmware version', v)
       +            return v
       +
       +        def atleast_version(self, major, minor=0, patch=0):
       +            return cmp(self.firmware_version(), (major, minor, patch))
        
                def call_raw(self, msg):
                    try:
                        return base_client.call_raw(self, msg)
                    except:
       +                self.print_error("Marking %s client bad" % self.device)
                        self.bad = True
                        raise
        
   DIR diff --git a/plugins/trezor/plugin.py b/plugins/trezor/plugin.py
       t@@ -224,37 +224,33 @@ class TrezorCompatiblePlugin(BasePlugin):
                    return False
                return True
        
       -    def get_client(self):
       +    def create_client(self):
                if not self.libraries_available:
                    self.give_error(_('please install the %s libraries from %s')
                                    % (self.device, self.libraries_URL))
        
       +        devices = self.HidTransport.enumerate()
       +        if not devices:
       +            self.give_error(_('Could not connect to your %s. Please '
       +                              'verify the cable is connected and that no '
       +                              'other app is using it.' % self.device))
       +
       +        transport = self.HidTransport(devices[0])
       +        client = self.client_class(transport, self)
       +        if not client.atleast_version(*self.minimum_firmware):
       +            self.give_error(_('Outdated %s firmware. Please update the '
       +                              'firmware from %s')
       +                            % (self.device, self.firmware_URL))
       +        return client
       +
       +    def get_client(self):
                if not self.client or self.client.bad:
       -            d = self.HidTransport.enumerate()
       -            if not d:
       -                self.give_error(_('Could not connect to your %s. Please '
       -                                  'verify the cable is connected and that no '
       -                                  'other app is using it.' % self.device))
       -            transport = self.HidTransport(d[0])
       -            self.client = self.client_class(transport, self.device)
       -            self.client.handler = self.handler
       -            self.client.set_tx_api(self)
       -            self.client.bad = False
       -            if not self.atleast_version(*self.minimum_firmware):
       -                self.client = None
       -                self.give_error(_('Outdated %s firmware. Please update the '
       -                                  'firmware from %s') % (self.device,
       -                                                         self.firmware_URL))
       -        return self.client
       +            self.client = self.create_client()
        
       -    def compare_version(self, major, minor=0, patch=0):
       -        f = self.get_client().features
       -        v = [f.major_version, f.minor_version, f.patch_version]
       -        self.print_error('firmware version', v)
       -        return cmp(v, [major, minor, patch])
       +        return self.client
        
            def atleast_version(self, major, minor=0, patch=0):
       -        return self.compare_version(major, minor, patch) >= 0
       +        return self.get_client().atleast_version(major, minor, patch)
        
            @hook
            def close_wallet(self):
       t@@ -395,6 +391,7 @@ class TrezorCompatiblePlugin(BasePlugin):
                    o.script_pubkey = vout['scriptPubKey'].decode('hex')
                return t
        
       +    # This function is called from the trezor libraries (via tx_api)
            def get_tx(self, tx_hash):
                tx = self.prev_tx[tx_hash]
                tx.deserialize()