summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2009-07-13 12:31:23 -0500
committerDenis Kenzior <denkenz@gmail.com>2009-07-14 15:45:05 -0500
commit38eebca61fb71f5ac26ea54e2f0c7c57c102f3db (patch)
treecc0498b9b4189a33d9a0021a0fa64e7c96bb06b6
parent80f43ff849d60e5f23b1794ff0f84b093755c1a2 (diff)
downloadofono-38eebca61fb71f5ac26ea54e2f0c7c57c102f3db.tar.bz2
Move PNN operator parsing to simutil
-rw-r--r--src/sim.c27
-rw-r--r--src/simutil.c39
-rw-r--r--src/simutil.h12
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);