From 38eebca61fb71f5ac26ea54e2f0c7c57c102f3db Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Mon, 13 Jul 2009 12:31:23 -0500 Subject: [PATCH] Move PNN operator parsing to simutil --- src/sim.c | 27 --------------------------- src/simutil.c | 39 +++++++++++++++++++++++++++++++++++++++ src/simutil.h | 12 ++++++++++++ 3 files changed, 51 insertions(+), 27 deletions(-) diff --git a/src/sim.c b/src/sim.c index d8bce300..71fa1fc2 100644 --- a/src/sim.c +++ b/src/sim.c @@ -103,11 +103,6 @@ static char **get_own_numbers(GSList *own_numbers) return ret; } -struct pnn_operator { - char *longname; - char *shortname; -}; - static void sim_file_op_free(struct sim_file_op *node) { g_free(node); @@ -594,28 +589,6 @@ const char *ofono_operator_name_sim_override(struct ofono_modem *modem, return sim->pnn[opl_op->id - 1].longname; } -static gboolean pnn_operator_parse(struct pnn_operator *oper, - const guint8 *tlv, int length) -{ - const char *name; - int namelength; - - name = ber_tlv_find_by_tag(tlv, 0x43, length, &namelength); - if (!name || !namelength) - return FALSE; - oper->longname = network_name_parse(name, namelength); - - name = ber_tlv_find_by_tag(tlv, 0x45, length, &namelength); - if (name && namelength) - oper->shortname = network_name_parse(name, namelength); - - if (ber_tlv_find_by_tag(tlv, 0x80, length, &namelength)) - ofono_debug("%i octets of addition PLMN information " - "present in EF-PNN"); - - return TRUE; -} - static void sim_pnn_read_cb(const struct ofono_error *error, const unsigned char *pnndata, int length, void *data) { diff --git a/src/simutil.c b/src/simutil.c index 003dd5d8..0257c64c 100644 --- a/src/simutil.c +++ b/src/simutil.c @@ -118,3 +118,42 @@ char *sim_network_name_parse(const unsigned char *buffer, int length, return ret; } + +gboolean sim_pnn_operator_parse(struct sim_pnn_operator *oper, + const guint8 *tlv, int length) +{ + const char *name; + int namelength; + gboolean add_ci; + + name = ber_tlv_find_by_tag(tlv, 0x43, length, &namelength); + + if (!name || !namelength) + return FALSE; + + oper->longname = sim_network_name_parse(name, namelength, + &oper->long_ci); + + name = ber_tlv_find_by_tag(tlv, 0x45, length, &namelength); + + oper->short_ci = FALSE; + oper->shortname = NULL; + + if (name && namelength) + oper->shortname = sim_network_name_parse(name, namelength, + &oper->short_ci); + + name = ber_tlv_find_by_tag(tlv, 0x80, length, &namelength); + + if (name && namelength) + oper->info = sim_string_to_utf8(name, namelength); + + return TRUE; +} + +void sim_pnn_operator_free(struct sim_pnn_operator *oper) +{ + g_free(oper->info); + g_free(oper->shortname); + g_free(oper->longname); +} diff --git a/src/simutil.h b/src/simutil.h index 673bafc7..ab34f7d5 100644 --- a/src/simutil.h +++ b/src/simutil.h @@ -30,7 +30,19 @@ enum sim_fileid { #define SIM_EFSPN_DC_HOME_PLMN_BIT 0x1 #define SIM_EFSPN_DC_ROAMING_SPN_BIT 0x2 +struct sim_pnn_operator { + char *longname; + gboolean long_ci; + char *shortname; + gboolean short_ci; + char *info; +}; + +void sim_pnn_operator_free(struct sim_pnn_operator *oper); + const guint8 *ber_tlv_find_by_tag(const guint8 *pdu, guint8 in_tag, int in_len, int *out_len); char *sim_network_name_parse(const unsigned char *buffer, int length, gboolean *add_ci); +gboolean sim_pnn_operator_parse(struct sim_pnn_operator *oper, + const guint8 *tlv, int length);