diff --git a/pySim/esim/saip/personalization.py b/pySim/esim/saip/personalization.py index 3aa796a9..938bc1a0 100644 --- a/pySim/esim/saip/personalization.py +++ b/pySim/esim/saip/personalization.py @@ -665,69 +665,57 @@ class SmspTpScAddr(ConfigurableParameter): class MncLen(EnumParam): - """MNC length. Sets only the MNC length field in EF.AD (Administrative Data). - Accepted values: integer 2 or 3, digit strings '2' or '3', or enum names 'MNC2'/'MNC3'. - """ + """MNC length. Must be either 2 or 3. Sets only the MNC length field in EF-AD (Administrative Data).""" name = 'MNC-LEN' - example_input = '2' + value_map = { '2': 2, '3': 3 } default_source = param_source.ConstantSource - - class Values(enum.IntEnum): - MNC2 = 2 - MNC3 = 3 + example_input = '2' @classmethod - def validate_val(cls, val): - if isinstance(val, str) and val.isdigit(): - val = int(val) - return super().validate_val(val) - - @classmethod - def _get_f_ad(cls, pe: ProfileElement): - if not hasattr(pe, 'files'): - return None - f_ad = pe.files.get('ef-ad', None) - if f_ad and f_ad.body: - return f_ad - return None - - @classmethod - def _decode_f_ad(cls, f_ad): - try: - ef_ad_dec = EF_AD().decode_bin(f_ad.body) - except StreamError: - return None - if 'mnc_len' not in ef_ad_dec: - return None - return ef_ad_dec - - @classmethod - def apply_val(cls, pes: ProfileElementSequence, val: int): + def apply_val(cls, pes: ProfileElementSequence, val): + """val must be an int: either 2 or 3""" for pe in pes.get_pes_for_type('usim'): - f_ad = cls._get_f_ad(pe) - if f_ad is None: + if not hasattr(pe, 'files'): + continue + f_ad = pe.files.get('ef-ad') + if not f_ad: continue # decode existing values - ef_ad_dec = cls._decode_f_ad(f_ad) - if ef_ad_dec is None: + if not f_ad.body: + continue + try: + ef_ad = EF_AD() + ef_ad_dec = ef_ad.decode_bin(f_ad.body) + except StreamError: + continue + if 'mnc_len' not in ef_ad_dec: continue # change mnc_len ef_ad_dec['mnc_len'] = val # re-encode into the File body - f_ad.body = EF_AD().encode_bin(ef_ad_dec) + f_ad.body = ef_ad.encode_bin(ef_ad_dec) pe.file2pe(f_ad) @classmethod def get_values_from_pes(cls, pes: ProfileElementSequence): for pe in pes.get_pes_for_type('usim'): - f_ad = cls._get_f_ad(pe) + if not hasattr(pe, 'files'): + continue + f_ad = pe.files.get('ef-ad', None) if f_ad is None: continue - ef_ad_dec = cls._decode_f_ad(f_ad) - if ef_ad_dec is None: + + try: + ef_ad = EF_AD() + ef_ad_dec = ef_ad.decode_bin(f_ad.body) + except StreamError: continue - mnc_len = ef_ad_dec.get('mnc_len') - yield { cls.name: str(mnc_len) } + + mnc_len = ef_ad_dec.get('mnc_len', None) + if mnc_len is None: + continue + + yield { cls.name: cls.map_val_to_name(int(mnc_len)) } class SdKey(BinaryParam):