--- src/simutil.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/simutil.h | 2 ++ 2 files changed, 59 insertions(+), 0 deletions(-)
diff --git a/src/simutil.c b/src/simutil.c index 8abf3d5..b3e2f52 100644 --- a/src/simutil.c +++ b/src/simutil.c @@ -1465,3 +1465,60 @@ gboolean sim_sst_is_active(unsigned char *efsst, unsigned char len, return (efsst[index / 4] >> (((index % 4) * 2) + 1)) & 1; } + +GSList *sim_parse_app_template_entries(const unsigned char *buffer, int len) +{ + GSList *ret = NULL; + const unsigned char *dataobj; + int dataobj_len; + + /* Find all the application entries */ + while ((dataobj = ber_tlv_find_by_tag(buffer, 0x61, len, + &dataobj_len)) != NULL) { + struct ofono_sim_app_record app; + const unsigned char *aid, *label; + int label_len; + + /* Find the aid (mandatory) */ + aid = ber_tlv_find_by_tag(dataobj, 0x4f, dataobj_len, + &app.aid_len); + if (!aid || app.aid_len < 0x01 || app.aid_len > 0x10) + goto error; + + memcpy(app.aid, aid, app.aid_len); + + /* Find the label (optional) */ + label = ber_tlv_find_by_tag(dataobj, 0x50, dataobj_len, + &label_len); + if (label) { + /* + * Label field uses the extra complicated + * encoding in 102.221 Annex A + */ + app.label = sim_string_to_utf8(label, label_len); + + if (app.label == NULL) + goto error; + } else + app.label = NULL; + + ret = g_slist_prepend(ret, g_memdup(&app, sizeof(app))); + + len -= (dataobj - buffer) + dataobj_len; + buffer = dataobj + dataobj_len; + } + + return ret; + +error: + while (ret) { + GSList *t = ret; + + g_free(((struct ofono_sim_app_record *) ret->data)->label); + + ret = ret->next; + g_slist_free_1(t); + } + + return NULL; +} diff --git a/src/simutil.h b/src/simutil.h index ad84907..4418ec9 100644 --- a/src/simutil.h +++ b/src/simutil.h @@ -446,3 +446,5 @@ gboolean sim_sst_is_available(unsigned char *service_sst, unsigned char len, enum sim_sst_service index); gboolean sim_sst_is_active(unsigned char *service_sst, unsigned char len, enum sim_sst_service index); + +GSList *sim_parse_app_template_entries(const unsigned char *buffer, int len); -- 1.7.1.86.g0e460.dirty _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono