<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>