<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/23204">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">filesystem: add flags to filter selectables<br><br>When requesting what DF/EF/ADF are selectable it is useful to have some<br>control of what we do not want in the resulting list.<br><br>Change-Id: Idb50a512bfdbfdf2e98f2ce0e89928cb0ff19f5e<br>Related: OS#4963<br>---<br>M pySim/filesystem.py<br>1 file changed, 36 insertions(+), 25 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/04/23204/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim/filesystem.py b/pySim/filesystem.py</span><br><span>index 2bcbe10..a9f2318 100644</span><br><span>--- a/pySim/filesystem.py</span><br><span>+++ b/pySim/filesystem.py</span><br><span>@@ -86,33 +86,38 @@</span><br><span>             node = node.parent</span><br><span>         return node</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def _get_self_selectables(self, alias=None):</span><br><span style="color: hsl(120, 100%, 40%);">+    def _get_self_selectables(self, alias=None, flags = []):</span><br><span>         """Return a dict of {'identifier': self} tuples"""</span><br><span>         sels = {}</span><br><span>         if alias:</span><br><span>             sels.update({alias: self})</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.fid:</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.fid and (flags == [] or 'FIDS' in flags):</span><br><span>             sels.update({self.fid: self})</span><br><span style="color: hsl(0, 100%, 40%);">-        if self.name:</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.name and (flags == [] or 'NAMES' in flags):</span><br><span>             sels.update({self.name: self})</span><br><span>         return sels</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def get_selectables(self):</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_selectables(self, flags = []):</span><br><span>         """Return a dict of {'identifier': File} that is selectable from the current file."""</span><br><span style="color: hsl(120, 100%, 40%);">+        sels = {}</span><br><span>         # we can always select ourself</span><br><span style="color: hsl(0, 100%, 40%);">-        sels = self._get_self_selectables('.')</span><br><span style="color: hsl(120, 100%, 40%);">+        if flags == [] or 'SELF' in flags:</span><br><span style="color: hsl(120, 100%, 40%);">+            sels = self._get_self_selectables('.', flags)</span><br><span>         # we can always select our parent</span><br><span style="color: hsl(0, 100%, 40%);">-        sels = self.parent._get_self_selectables('..')</span><br><span style="color: hsl(120, 100%, 40%);">+        if flags == [] or 'PARENT' in flags:</span><br><span style="color: hsl(120, 100%, 40%);">+            sels = self.parent._get_self_selectables('..', flags)</span><br><span>         # if we have a MF, we can always select its applications</span><br><span style="color: hsl(0, 100%, 40%);">-        mf = self.get_mf()</span><br><span style="color: hsl(0, 100%, 40%);">-        if mf:</span><br><span style="color: hsl(0, 100%, 40%);">-            sels.update(mf._get_self_selectables())</span><br><span style="color: hsl(0, 100%, 40%);">-            sels.update(mf.get_app_selectables())</span><br><span style="color: hsl(120, 100%, 40%);">+        if flags == [] or 'MF' in flags:</span><br><span style="color: hsl(120, 100%, 40%);">+            mf = self.get_mf()</span><br><span style="color: hsl(120, 100%, 40%);">+            if mf:</span><br><span style="color: hsl(120, 100%, 40%);">+                sels.update(mf._get_self_selectables(flags = flags))</span><br><span style="color: hsl(120, 100%, 40%);">+                if flags == [] or 'APPS' in flags:</span><br><span style="color: hsl(120, 100%, 40%);">+                    sels.update(mf.get_app_selectables(flags))</span><br><span>         return sels</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def get_selectable_names(self):</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_selectable_names(self, flags = []):</span><br><span>         """Return a list of strings for all identifiers that are selectable from the current file."""</span><br><span style="color: hsl(0, 100%, 40%);">-        sels = self.get_selectables()</span><br><span style="color: hsl(120, 100%, 40%);">+        sels = self.get_selectables(flags)</span><br><span>         return sels.keys()</span><br><span> </span><br><span>     def decode_select_response(self, data_hex):</span><br><span>@@ -158,12 +163,14 @@</span><br><span>         for child in children:</span><br><span>             self.add_file(child, ignore_existing)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def get_selectables(self):</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_selectables(self, flags = []):</span><br><span>         """Get selectable (DF/EF names) from current DF"""</span><br><span>         # global selectables + our children</span><br><span style="color: hsl(0, 100%, 40%);">-        sels = super().get_selectables()</span><br><span style="color: hsl(0, 100%, 40%);">-        sels.update({x.fid: x for x in self.children.values() if x.fid})</span><br><span style="color: hsl(0, 100%, 40%);">-        sels.update({x.name: x for x in self.children.values() if x.name})</span><br><span style="color: hsl(120, 100%, 40%);">+        sels = super().get_selectables(flags)</span><br><span style="color: hsl(120, 100%, 40%);">+        if flags == [] or 'FIDS' in flags:</span><br><span style="color: hsl(120, 100%, 40%);">+                sels.update({x.fid: x for x in self.children.values() if x.fid})</span><br><span style="color: hsl(120, 100%, 40%);">+        if flags == [] or 'NAMES' in flags:</span><br><span style="color: hsl(120, 100%, 40%);">+                sels.update({x.name: x for x in self.children.values() if x.name})</span><br><span>         return sels</span><br><span> </span><br><span>     def lookup_file_by_name(self, name):</span><br><span>@@ -216,16 +223,20 @@</span><br><span>         """Get list of completions (AID names)"""</span><br><span>         return [x.name for x in self.applications]</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def get_selectables(self):</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_selectables(self, flags = []):</span><br><span>         """Get list of completions (DF/EF/ADF names) from current DF"""</span><br><span style="color: hsl(0, 100%, 40%);">-        sels = super().get_selectables()</span><br><span style="color: hsl(0, 100%, 40%);">-        sels.update(self.get_app_selectables())</span><br><span style="color: hsl(120, 100%, 40%);">+        sels = super().get_selectables(flags)</span><br><span style="color: hsl(120, 100%, 40%);">+        if flags == [] or 'APPS' in flags:</span><br><span style="color: hsl(120, 100%, 40%);">+                sels.update(self.get_app_selectables(flags))</span><br><span>         return sels</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def get_app_selectables(self):</span><br><span style="color: hsl(0, 100%, 40%);">-        # applications by AID + name</span><br><span style="color: hsl(0, 100%, 40%);">-        sels = {x.aid: x for x in self.applications.values()}</span><br><span style="color: hsl(0, 100%, 40%);">-        sels.update({x.name: x for x in self.applications.values() if x.name})</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_app_selectables(self, flags = []):</span><br><span style="color: hsl(120, 100%, 40%);">+        """Get applications by AID + name"""</span><br><span style="color: hsl(120, 100%, 40%);">+        sels = {}</span><br><span style="color: hsl(120, 100%, 40%);">+        if flags == [] or 'FIDS' in flags:</span><br><span style="color: hsl(120, 100%, 40%);">+                sels.update({x.aid: x for x in self.applications.values()})</span><br><span style="color: hsl(120, 100%, 40%);">+        if flags == [] or 'NAMES' in flags:</span><br><span style="color: hsl(120, 100%, 40%);">+                sels.update({x.name: x for x in self.applications.values() if x.name})</span><br><span>         return sels</span><br><span> </span><br><span>     def decode_select_response(self, data_hex):</span><br><span>@@ -261,10 +272,10 @@</span><br><span>     def __str__(self):</span><br><span>         return "EF(%s)" % (super().__str__())</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def get_selectables(self):</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_selectables(self, flags = []):</span><br><span>         """Get list of completions (EF names) from current DF"""</span><br><span>         #global selectable names + those of the parent DF</span><br><span style="color: hsl(0, 100%, 40%);">-        sels = super().get_selectables()</span><br><span style="color: hsl(120, 100%, 40%);">+        sels = super().get_selectables(flags)</span><br><span>         sels.update({x.name:x for x in self.parent.children.values() if x != self})</span><br><span>         return sels</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/23204">change 23204</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/+/23204"/><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: Idb50a512bfdbfdf2e98f2ce0e89928cb0ff19f5e </div>
<div style="display:none"> Gerrit-Change-Number: 23204 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>