Harald Welte | 21caf32 | 2022-07-16 14:06:46 +0200 | [diff] [blame] | 1 | import abc |
| 2 | import logging |
| 3 | from typing import Union |
| 4 | from pySim.apdu import Apdu, Tpdu, CardReset, TpduFilter |
| 5 | |
| 6 | PacketType = Union[Apdu, Tpdu, CardReset] |
| 7 | |
| 8 | logger = logging.getLogger(__name__) |
| 9 | |
| 10 | class ApduSource(abc.ABC): |
| 11 | def __init__(self): |
| 12 | self.apdu_filter = TpduFilter(None) |
| 13 | |
| 14 | @abc.abstractmethod |
| 15 | def read_packet(self) -> PacketType: |
| 16 | """Read one packet from the source.""" |
| 17 | pass |
| 18 | |
| 19 | def read(self) -> Union[Apdu, CardReset]: |
| 20 | """Main function to call by the user: Blocking read, returns Apdu or CardReset.""" |
| 21 | apdu = None |
| 22 | # loop until we actually have an APDU to return |
| 23 | while not apdu: |
| 24 | r = self.read_packet() |
| 25 | if not r: |
| 26 | continue |
| 27 | if isinstance(r, Tpdu): |
| 28 | apdu = self.apdu_filter.input_tpdu(r) |
| 29 | elif isinstance(r, Apdu): |
| 30 | apdu = r |
| 31 | elif isinstance(r, CardReset): |
| 32 | apdu = r |
| 33 | else: |
| 34 | ValueError('Unknown read_packet() return %s' % r) |
| 35 | return apdu |