dexter has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/pysim/+/15501


Change subject: test please ignore
......................................................................

test please ignore

Change-Id: Ib757b1433c075c635fe43542103acae2167a1a15
---
M pySim/cards.py
1 file changed, 116 insertions(+), 48 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/01/15501/1

diff --git a/pySim/cards.py b/pySim/cards.py
index ec001ab..e1557c0 100644
--- a/pySim/cards.py
+++ b/pySim/cards.py
@@ -145,6 +145,107 @@
                return sw


+class _GenericSimBase(Card):
+        """
+        A comfortable wrapper for the Card class. This class provides methods
+        that just accept just the parameter array. All further decisions,
+        parameter checking, status word checking are then done in this class.
+        """
+
+       def __check_sw(self, par, sw):
+               if sw != '9000':
+                       print("Programming %s failed with code %s" % (par, sw))
+                       return False
+               return True
+
+       # Safely get a parameter from the parameter array. Ensure that it
+       # exists and that it is not empty. Also ensure that it is always
+       # a string so that we know what we are working with.
+       def __get_p(self, p, p_name):
+               p_val = p.get(p_name, None)
+               if p_val == None:
+                       return None
+               return str(p_val).strip()
+
+       def __get_mcc_mnc(self, p):
+               mcc = self.__get_p(p, 'mcc')
+               mnc = self.__get_p(p, 'mnc')
+
+               # If MCC is missing, try to obtain it from the IMSI
+               if mcc == None:
+                       imsi = self.__get_p(p, 'imsi')
+                       if imsi == None:
+                               return (None, None)
+                       mcc = mcc_from_imsi(imsi)
+
+               # If MNC is missing, try to obtain it from the IMSI
+               if mnc == None:
+                       imsi = self.__get_p(p, 'imsi')
+                       if imsi == None:
+                               return (None, None)
+                       mnc = mnc_from_imsi(imsi)
+               return mcc, mnc
+
+       def p_update_imsi(self, p):
+               imsi = self.__get_p(p, 'imsi')
+               if imsi != None:
+                       sw = self.update_imsi(imsi)
+                       return self.__check_sw('imsi',sw)
+               return False
+
+       def p_update_acc(self, p):
+               if p.get('acc'):
+                       sw = self.update_acc(p['acc'])
+                       return self.__check_sw('ACC',sw)
+
+       def p_update_plmnsel(self, p):
+               mcc, mnc = self.__get_mcc_mnc(p);
+               if mcc and mnc:
+                       sw = self.update_plmnsel(int(mcc), int(mnc))
+                       return self.__check_sw('PLMNsel',sw)
+               return False
+
+       def p_update_hplmn_act(self, p):
+               mcc, mnc = self.__get_mcc_mnc(p);
+               if mcc and mnc:
+                       sw = self.update_hplmn_act(int(mcc), int(mnc))
+                       return self.__check_sw('HPLMNwAcT',sw)
+               return False
+
+       def p_update_oplmn_act(self, p):
+               mcc, mnc = self.__get_mcc_mnc(p);
+               if mcc and mnc:
+                       sw = self.update_oplmn_act(int(mcc), int(mnc))
+                       return self.__check_sw('OPLMNwAcT',sw)
+               return False
+
+       def p_update_plmn_act(self, p):
+               mcc, mnc = self.__get_mcc_mnc(p);
+               if mcc and mnc:
+                       sw = self.update_plmn_act(int(mcc), int(mnc))
+                       return self.__check_sw('PLMNwAcT',sw)
+               return False
+
+       def p_update_smsp(self, p):
+               if p.get('smsp'):
+                       sw = self.update_smsp(p['smsp'])
+                       return self.__check_sw('SMSP',sw)
+
+       def p_update_ad(self, p):
+               mcc, mnc = self.__get_mcc_mnc(p);
+               if mcc and mnc:
+                       sw = self.update_ad(int(mnc))
+                       return self.__check_sw('AD',sw)
+               return False
+
+       def p_update_smsp(self, p):
+               smsp = self.__get_p(p, 'smsp')
+               if smsp:
+                       sw = self.update_smsp(smsp)
+                       return self.__check_sw('SMSP',sw)
+               return False
+
+
 class _MagicSimBase(Card):
        """
        Theses cards uses several record based EFs to store the provider infos,
@@ -542,7 +643,7 @@
        def erase(self):
                return

-class SysmoUSIMSJS1(Card):
+class SysmoUSIMSJS1(_GenericSimBase):
        """
        sysmocom sysmoUSIM-SJS1
        """
@@ -589,33 +690,21 @@
                        data, sw = self._scc.update_binary('00F7', content)

                # write EF.IMSI
-               data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))
+                self.p_update_imsi(p)

                # EF.PLMNsel
-                if p.get('mcc') and p.get('mnc'):
-                        sw = self.update_plmnsel(p['mcc'], p['mnc'])
-                        if sw != '9000':
-                               print("Programming PLMNsel failed with code 
%s"%sw)
+                self.p_update_plmnsel(p)

                 # EF.PLMNwAcT
-                if p.get('mcc') and p.get('mnc'):
-                       sw = self.update_plmn_act(p['mcc'], p['mnc'])
-                       if sw != '9000':
-                               print("Programming PLMNwAcT failed with code 
%s"%sw)
+                self.p_update_plmn_act(p)

                 # EF.OPLMNwAcT
-                if p.get('mcc') and p.get('mnc'):
-                       sw = self.update_oplmn_act(p['mcc'], p['mnc'])
-                       if sw != '9000':
-                               print("Programming OPLMNwAcT failed with code 
%s"%sw)
+                self.p_update_oplmn_act(p)

                 # EF.AD
-                if p.get('mcc') and p.get('mnc'):
-                       sw = self.update_ad(p['mnc'])
-                       if sw != '9000':
-                               print("Programming AD failed with code %s"%sw)
+               self.p_update_ad(p)

-               # EF.SMSP
+               # EF.SMSP (propritary method?, why different than the others?)
                if p.get('smsp'):
                        r = self._scc.select_file(['3f00', '7f10'])
                        data, sw = self._scc.update_record('6f42', 1, 
lpad(p['smsp'], 104), force_len=True)
@@ -817,7 +906,7 @@
                # write EF.IMSI
                data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))

-class WavemobileSim(Card):
+class WavemobileSim(_GenericSimBase):
        """
        WavemobileSim

@@ -864,46 +953,25 @@
                        print("Warning: Programming of the OPc is not 
implemented for this type of card.")

                 # EF.SMSP
-               if p.get('smsp'):
-                       sw = self.update_smsp(p['smsp'])
-                       if sw != '9000':
-                               print("Programming SMSP failed with code %s"%sw)
+               self.p_update_smsp(p)

                 # EF.IMSI
-               if p.get('imsi'):
-                       sw = self.update_imsi(p['imsi'])
-                       if sw != '9000':
-                               print("Programming IMSI failed with code %s"%sw)
+               self.p_update_imsi(p)

                # EF.ACC
-               if p.get('acc'):
-                       sw = self.update_acc(p['acc'])
-                       if sw != '9000':
-                               print("Programming ACC failed with code %s"%sw)
+               self.p_update_acc(p)

                # EF.PLMNsel
-                if p.get('mcc') and p.get('mnc'):
-                        sw = self.update_plmnsel(p['mcc'], p['mnc'])
-                        if sw != '9000':
-                               print("Programming PLMNsel failed with code 
%s"%sw)
+               self.p_update_plmnsel(p)

                 # EF.PLMNwAcT
-                if p.get('mcc') and p.get('mnc'):
-                       sw = self.update_plmn_act(p['mcc'], p['mnc'])
-                       if sw != '9000':
-                               print("Programming PLMNwAcT failed with code 
%s"%sw)
+               self.p_update_plmn_act(p)

                 # EF.OPLMNwAcT
-                if p.get('mcc') and p.get('mnc'):
-                       sw = self.update_oplmn_act(p['mcc'], p['mnc'])
-                       if sw != '9000':
-                               print("Programming OPLMNwAcT failed with code 
%s"%sw)
+               self.p_update_oplmn_act(p)

                 # EF.AD
-                if p.get('mcc') and p.get('mnc'):
-                       sw = self.update_ad(p['mnc'])
-                       if sw != '9000':
-                               print("Programming AD failed with code %s"%sw)
+               self.p_update_ad(p)

                 return None


--
To view, visit https://gerrit.osmocom.org/c/pysim/+/15501
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: Ib757b1433c075c635fe43542103acae2167a1a15
Gerrit-Change-Number: 15501
Gerrit-PatchSet: 1
Gerrit-Owner: dexter <pma...@sysmocom.de>
Gerrit-MessageType: newchange

Reply via email to