blob: 098d3caf1c23a2ef4c99bff70f8db0fe3b24e83c [file] [log] [blame]
Harald Welte21caf322022-07-16 14:06:46 +02001import abc
2import logging
3from typing import Union
4from pySim.apdu import Apdu, Tpdu, CardReset, TpduFilter
5
6PacketType = Union[Apdu, Tpdu, CardReset]
7
8logger = logging.getLogger(__name__)
9
10class 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