<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/23582">View Change</a></p><div style="white-space:pre-wrap">Approvals:
laforge: Looks good to me, approved
Jenkins Builder: Verified
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Fix various mistakes around the CardADF <-> CardApplication dualism<br><br>When the CardFile hierarchy talks about 'application' it means CardADF.<br><br>When the RuntimeState and CardProfile talk about 'application' they mean<br>a CardApplication.<br><br>Let's clarify this in the file names, and make CardADF have an optional<br>reference to the CardApplication, so that application specific status<br>word interpretation really works.<br><br>Change-Id: Ibc80a41d79dca547f14d5d84f447742e6b46d7ca<br>---<br>M pySim-shell.py<br>M pySim/filesystem.py<br>2 files changed, 26 insertions(+), 17 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim-shell.py b/pySim-shell.py</span><br><span>index 3c56f51..c170398 100755</span><br><span>--- a/pySim-shell.py</span><br><span>+++ b/pySim-shell.py</span><br><span>@@ -45,8 +45,8 @@</span><br><span> from pySim.filesystem import CardMF, RuntimeState, CardDF, CardADF</span><br><span> from pySim.ts_51_011 import CardProfileSIM, DF_TELECOM, DF_GSM</span><br><span> from pySim.ts_102_221 import CardProfileUICC</span><br><span style="color: hsl(0, 100%, 40%);">-from pySim.ts_31_102 import ADF_USIM</span><br><span style="color: hsl(0, 100%, 40%);">-from pySim.ts_31_103 import ADF_ISIM</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.ts_31_102 import CardApplicationUSIM</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.ts_31_103 import CardApplicationISIM</span><br><span> </span><br><span> from pySim.card_data import CardDataCsv, card_data_register, card_data_get_field</span><br><span> </span><br><span>@@ -441,8 +441,8 @@</span><br><span> sys.exit(2)</span><br><span> </span><br><span> profile = CardProfileUICC()</span><br><span style="color: hsl(0, 100%, 40%);">- profile.add_application(ADF_USIM())</span><br><span style="color: hsl(0, 100%, 40%);">- profile.add_application(ADF_ISIM())</span><br><span style="color: hsl(120, 100%, 40%);">+ profile.add_application(CardApplicationUSIM)</span><br><span style="color: hsl(120, 100%, 40%);">+ profile.add_application(CardApplicationISIM)</span><br><span> </span><br><span> rs = RuntimeState(card, profile)</span><br><span> </span><br><span>diff --git a/pySim/filesystem.py b/pySim/filesystem.py</span><br><span>index be0aaf6..9a68d5a 100644</span><br><span>--- a/pySim/filesystem.py</span><br><span>+++ b/pySim/filesystem.py</span><br><span>@@ -284,8 +284,8 @@</span><br><span> def __str__(self):</span><br><span> return "MF(%s)" % (self.fid)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- def add_application(self, app:'CardADF'):</span><br><span style="color: hsl(0, 100%, 40%);">- """Add an ADF (Application Dedicated File) to the MF"""</span><br><span style="color: hsl(120, 100%, 40%);">+ def add_application_df(self, app:'CardADF'):</span><br><span style="color: hsl(120, 100%, 40%);">+ """Add an Application to the MF"""</span><br><span> if not isinstance(app, CardADF):</span><br><span> raise TypeError("Expected an ADF instance")</span><br><span> if app.aid in self.applications:</span><br><span>@@ -334,10 +334,12 @@</span><br><span> """ADF (Application Dedicated File) in the smart card filesystem"""</span><br><span> def __init__(self, aid:str, **kwargs):</span><br><span> super().__init__(**kwargs)</span><br><span style="color: hsl(120, 100%, 40%);">+ # reference to CardApplication may be set from CardApplication constructor</span><br><span style="color: hsl(120, 100%, 40%);">+ self.application:Optional[CardApplication] = None</span><br><span> self.aid = aid # Application Identifier</span><br><span> mf = self.get_mf()</span><br><span> if mf:</span><br><span style="color: hsl(0, 100%, 40%);">- mf.add_application(self)</span><br><span style="color: hsl(120, 100%, 40%);">+ mf.add_application_df(self)</span><br><span> </span><br><span> def __str__(self):</span><br><span> return "ADF(%s)" % (self.aid)</span><br><span>@@ -807,12 +809,13 @@</span><br><span> """</span><br><span> self.mf = CardMF()</span><br><span> self.card = card</span><br><span style="color: hsl(0, 100%, 40%);">- self.selected_file = self.mf</span><br><span style="color: hsl(120, 100%, 40%);">+ self.selected_file:CardDF = self.mf</span><br><span> self.profile = profile</span><br><span style="color: hsl(0, 100%, 40%);">- # add applications + MF-files from profile</span><br><span style="color: hsl(120, 100%, 40%);">+ # add application ADFs + MF-files from profile</span><br><span> apps = self._match_applications()</span><br><span> for a in apps:</span><br><span style="color: hsl(0, 100%, 40%);">- self.mf.add_application(a)</span><br><span style="color: hsl(120, 100%, 40%);">+ if a.adf:</span><br><span style="color: hsl(120, 100%, 40%);">+ self.mf.add_application_df(a.adf)</span><br><span> for f in self.profile.files_in_mf:</span><br><span> self.mf.add_file(f)</span><br><span> self.conserve_write = True</span><br><span>@@ -849,8 +852,8 @@</span><br><span> else:</span><br><span> return self.selected_file.parent</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- def get_application(self) -> Optional[CardADF]:</span><br><span style="color: hsl(0, 100%, 40%);">- """Obtain the currently selected application (if any).</span><br><span style="color: hsl(120, 100%, 40%);">+ def get_application_df(self) -> Optional[CardADF]:</span><br><span style="color: hsl(120, 100%, 40%);">+ """Obtain the currently selected application DF (if any).</span><br><span> </span><br><span> Returns:</span><br><span> CardADF() instance or None"""</span><br><span>@@ -872,16 +875,16 @@</span><br><span> Returns:</span><br><span> Tuple of two strings</span><br><span> """</span><br><span style="color: hsl(0, 100%, 40%);">- app = self.get_application()</span><br><span style="color: hsl(0, 100%, 40%);">- if app:</span><br><span style="color: hsl(120, 100%, 40%);">+ adf = self.get_application_df()</span><br><span style="color: hsl(120, 100%, 40%);">+ if adf:</span><br><span style="color: hsl(120, 100%, 40%);">+ app = adf.application</span><br><span> # The application either comes with its own interpret_sw</span><br><span> # method or we will use the interpret_sw method from the</span><br><span> # card profile.</span><br><span style="color: hsl(0, 100%, 40%);">- if hasattr(app, "interpret_sw"):</span><br><span style="color: hsl(120, 100%, 40%);">+ if app and hasattr(app, "interpret_sw"):</span><br><span> return app.interpret_sw(sw)</span><br><span> else:</span><br><span> return self.profile.interpret_sw(sw)</span><br><span style="color: hsl(0, 100%, 40%);">- return app.interpret_sw(sw)</span><br><span> else:</span><br><span> return self.profile.interpret_sw(sw)</span><br><span> </span><br><span>@@ -1078,7 +1081,7 @@</span><br><span> class CardApplication(object):</span><br><span> """A card application is represented by an ADF (with contained hierarchy) and optionally</span><br><span> some SW definitions."""</span><br><span style="color: hsl(0, 100%, 40%);">- def __init__(self, name, adf:str=None, sw:dict=None):</span><br><span style="color: hsl(120, 100%, 40%);">+ def __init__(self, name, adf:Optional[CardADF]=None, aid:str=None, sw:dict=None):</span><br><span> """</span><br><span> Args:</span><br><span> adf : ADF name</span><br><span>@@ -1087,6 +1090,12 @@</span><br><span> self.name = name</span><br><span> self.adf = adf</span><br><span> self.sw = sw or dict()</span><br><span style="color: hsl(120, 100%, 40%);">+ # back-reference from ADF to Applicaiton</span><br><span style="color: hsl(120, 100%, 40%);">+ if self.adf:</span><br><span style="color: hsl(120, 100%, 40%);">+ self.aid = aid or self.adf.aid</span><br><span style="color: hsl(120, 100%, 40%);">+ self.adf.application = self</span><br><span style="color: hsl(120, 100%, 40%);">+ else:</span><br><span style="color: hsl(120, 100%, 40%);">+ self.aid = aid</span><br><span> </span><br><span> def __str__(self):</span><br><span> return "APP(%s)" % (self.name)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/23582">change 23582</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/pysim/+/23582"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: pysim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ibc80a41d79dca547f14d5d84f447742e6b46d7ca </div>
<div style="display:none"> Gerrit-Change-Number: 23582 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>