Move PNN operator parsing to simutil

This commit is contained in:
Denis Kenzior 2009-07-13 12:31:23 -05:00
parent 80f43ff849
commit 38eebca61f
3 changed files with 51 additions and 27 deletions

View File

@ -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)
{

View File

@ -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);
}

View File

@ -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);