diff options
author | Harald Welte <laforge@osmocom.org> | 2021-10-11 10:55:00 +0200 |
---|---|---|
committer | Philipp Maier <pmaier@sysmocom.de> | 2021-10-11 10:56:44 +0200 |
commit | 913e6166d80364df309c06fe31a61495e84d3f47 (patch) | |
tree | 377898b25b2a98fdb19c7c7b2f2fb6a83f07b5de | |
parent | 2bc21316e5debab2b43f0698a1b761c54b088f6f (diff) |
card_handler: clean-up
* introduce type annotations
* introduce + derive implementations from base class
* move shared code to base class
Change-Id: I7168506cbebb1ebb67f47453419b860824912051
-rw-r--r-- | pySim/card_handler.py | 89 |
1 files changed, 63 insertions, 26 deletions
diff --git a/pySim/card_handler.py b/pySim/card_handler.py index 385c55e..0425e33 100644 --- a/pySim/card_handler.py +++ b/pySim/card_handler.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- -""" pySim: card handler utilities +""" pySim: card handler utilities. A 'card handler' is some method +by which cards can be inserted/removed into the card reader. For +normal smart card readers, this has to be done manually. However, +there are also automatic card feeders. """ # @@ -21,47 +24,81 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # +from pySim.transport import LinkBase import subprocess import sys import yaml -# Manual card handler: User is prompted to insert/remove card from the reader. -class CardHandler: +class CardHandlerBase: + """Abstract base class representing a mechanism for card insertion/removal.""" - sl = None - - def __init__(self, sl): + def __init__(self, sl:LinkBase): self.sl = sl - def get(self, first = False): - print("Ready for Programming: Insert card now (or CTRL-C to cancel)") - self.sl.wait_for_card(newcardonly=not first) + def get(self, first:bool = False): + """Method called when pySim needs a new card to be inserted. + + Args: + first : set to true when the get method is called the + first time. This is required to prevent blocking + when a card is already inserted into the reader. + The reader API would not recognize that card as + "new card" until it would be removed and re-inserted + again. + """ + print("Ready for Programming: ", end='') + self._get(first) def error(self): - print("Programming failed: Remove card from reader") - print("") + """Method called when pySim failed to program a card. Move card to 'bad' batch.""" + print("Programming failed: ", end='') + self._error() def done(self): - print("Programming successful: Remove card from reader") + """Method called when pySim failed to program a card. Move card to 'good' batch.""" + print("Programming successful: ", end='') + self._done() + + def _get(self, first:bool = False): + pass + + def _error(self): + pass + + def _done(self): + pass + + +class CardHandler(CardHandlerBase): + """Manual card handler: User is prompted to insert/remove card from the reader.""" + + def _get(self, first:bool = False): + print("Insert card now (or CTRL-C to cancel)") + self.sl.wait_for_card(newcardonly=not first) + + def _error(self): + print("Remove card from reader") print("") -# Automatic card handler: A machine is used to handle the cards. -class CardHandlerAuto: + def _done(self): + print("Remove card from reader") + print("") + + +class CardHandlerAuto(CardHandlerBase): + """Automatic card handler: A machine is used to handle the cards.""" - sl = None - cmds = None verbose = True - def __init__(self, sl, config_file): + def __init__(self, sl:LinkBase, config_file:str): + super().__init__(sl) print("Card handler Config-file: " + str(config_file)) - self.sl = sl with open(config_file) as cfg: self.cmds = yaml.load(cfg, Loader=yaml.FullLoader) - self.verbose = (self.cmds.get('verbose') == True) - def __print_outout(self,out): + def __print_outout(self, out): print("") print("Card handler output:") print("---------------------8<---------------------") @@ -91,18 +128,18 @@ class CardHandlerAuto: print("Error: Card handler failure! (rc=" + str(rc) + ")") sys.exit(rc) - def get(self, first = False): - print("Ready for Programming: Transporting card into the reader-bay...") + def _get(self, first:bool = False): + print("Transporting card into the reader-bay...") self.__exec_cmd(self.cmds['get']) if self.sl: self.sl.connect() - def error(self): - print("Programming failed: Transporting card to the error-bin...") + def _error(self): + print("Transporting card to the error-bin...") self.__exec_cmd(self.cmds['error']) print("") - def done(self): - print("Programming successful: Transporting card into the collector bin...") + def _done(self): + print("Transporting card into the collector bin...") self.__exec_cmd(self.cmds['done']) print("") |