diff options
author | Oleg Zhurakivskyy <oleg.zhurakivskyy@intel.com> | 2011-12-02 13:10:30 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2011-12-02 12:44:52 -0600 |
commit | a67bc1a4b0113cddd96b51711beab4e2316fdc24 (patch) | |
tree | 92cbe0eeea21142fdac6ceaf8d4a7256e902afcd /src | |
parent | 58fc48c6c490033ec5fd19c0e255e5cea377b6c1 (diff) | |
download | ofono-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.c | 82 |
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) |