summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOleg Zhurakivskyy <oleg.zhurakivskyy@intel.com>2011-12-02 13:10:30 +0200
committerDenis Kenzior <denkenz@gmail.com>2011-12-02 12:44:52 -0600
commita67bc1a4b0113cddd96b51711beab4e2316fdc24 (patch)
tree92cbe0eeea21142fdac6ceaf8d4a7256e902afcd /src
parent58fc48c6c490033ec5fd19c0e255e5cea377b6c1 (diff)
downloadofono-a67bc1a4b0113cddd96b51711beab4e2316fdc24.tar.bz2
network: Refactor sim_spn_read_cb()
Refactor sim_spn_read_cb() for CPHS SPN, short-SPN inclusion
Diffstat (limited to 'src')
-rw-r--r--src/network.c82
1 files changed, 48 insertions, 34 deletions
diff --git a/src/network.c b/src/network.c
index e6636bb2..677b936d 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1656,18 +1656,30 @@ static void sim_spdi_read_cb(int ok, int length, int record,
}
}
-static void sim_spn_read_cb(int ok, int length, int record,
- const unsigned char *data,
- int record_length, void *user_data)
+static void ofono_netreg_operator_display_name_notify(
+ struct ofono_netreg *netreg)
{
- struct ofono_netreg *netreg = user_data;
- unsigned char dcbyte;
- char *spn;
+ const char *operator = get_operator_display_name(netreg);
- if (!ok)
- return;
+ ofono_dbus_signal_property_changed(ofono_dbus_get_connection(),
+ __ofono_atom_get_path(netreg->atom),
+ OFONO_NETWORK_REGISTRATION_INTERFACE,
+ "Name", DBUS_TYPE_STRING, &operator);
+}
- dcbyte = data[0];
+static void sim_spn_display_condition_parse(struct ofono_netreg *netreg,
+ guint8 dcbyte)
+{
+ if (dcbyte & SIM_EFSPN_DC_HOME_PLMN_BIT)
+ netreg->flags |= NETWORK_REGISTRATION_FLAG_HOME_SHOW_PLMN;
+
+ if (!(dcbyte & SIM_EFSPN_DC_ROAMING_SPN_BIT))
+ netreg->flags |= NETWORK_REGISTRATION_FLAG_ROAMING_SHOW_SPN;
+}
+
+static gboolean sim_spn_parse(const void *data, int length, char **dst)
+{
+ char *spn;
/*
* TS 31.102 says:
@@ -1685,40 +1697,42 @@ static void sim_spn_read_cb(int ok, int length, int record,
* itself which is not there either. 11.11 contains the same
* paragraph as 51.101 and has an Annex B which we implement.
*/
- spn = sim_string_to_utf8(data + 1, length - 1);
- if (spn == NULL) {
- ofono_error("EFspn read successfully, but couldn't parse");
- return;
+ spn = sim_string_to_utf8(data, length);
+ if (spn == NULL || strlen(spn) == 0) {
+ if (spn == NULL)
+ ofono_error("EFspn read successfully, "
+ "but couldn't parse");
+ g_free(spn);
+ return FALSE;
}
- if (strlen(spn) == 0) {
- g_free(spn);
+ *dst = spn;
+ return TRUE;
+}
+
+static void sim_spn_read_cb(int ok, int length, int record,
+ const unsigned char *data,
+ int record_length, void *user_data)
+{
+ struct ofono_netreg *netreg = user_data;
+ unsigned char dcbyte;
+
+ if (!ok)
+ return;
+
+ dcbyte = data[0];
+
+ if (!sim_spn_parse(data + 1, length - 1, &netreg->spname))
return;
- }
- netreg->spname = spn;
ofono_sim_read(netreg->sim_context, SIM_EFSPDI_FILEID,
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
sim_spdi_read_cb, netreg);
- if (dcbyte & SIM_EFSPN_DC_HOME_PLMN_BIT)
- netreg->flags |= NETWORK_REGISTRATION_FLAG_HOME_SHOW_PLMN;
+ sim_spn_display_condition_parse(netreg, dcbyte);
- if (!(dcbyte & SIM_EFSPN_DC_ROAMING_SPN_BIT))
- netreg->flags |= NETWORK_REGISTRATION_FLAG_ROAMING_SHOW_SPN;
-
- if (netreg->current_operator) {
- DBusConnection *conn = ofono_dbus_get_connection();
- const char *path = __ofono_atom_get_path(netreg->atom);
- const char *operator;
-
- operator = get_operator_display_name(netreg);
-
- ofono_dbus_signal_property_changed(conn, path,
- OFONO_NETWORK_REGISTRATION_INTERFACE,
- "Name", DBUS_TYPE_STRING,
- &operator);
- }
+ if (netreg->current_operator)
+ ofono_netreg_operator_display_name_notify(netreg);
}
int ofono_netreg_get_location(struct ofono_netreg *netreg)