diff options
author | Denis Kenzior <denkenz@gmail.com> | 2009-07-10 18:54:20 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2009-07-14 15:45:04 -0500 |
commit | 1df261cdb9fb77d5abb1a95c02c8d5e874dc62d5 (patch) | |
tree | aaed1057831f553286570077e147021e33eea23c /src/sim.c | |
parent | 5207f4063e75db024b48f6a42a5964b1b334a168 (diff) | |
download | ofono-1df261cdb9fb77d5abb1a95c02c8d5e874dc62d5.tar.bz2 |
Refactor MSISDN reading
Diffstat (limited to 'src/sim.c')
-rw-r--r-- | src/sim.c | 83 |
1 files changed, 33 insertions, 50 deletions
@@ -341,29 +341,35 @@ static gboolean sim_retrieve_spn(void *user_data) return FALSE; } -static void sim_msisdn_read_cb(const struct ofono_error *error, - const unsigned char *sdata, int length, void *data) +static void sim_msisdn_read_cb(struct ofono_modem *modem, int ok, + enum ofono_sim_file_structure structure, + int length, int record, + const unsigned char *data, + int record_length, void *userdata) { - struct ofono_modem *modem = data; struct sim_manager_data *sim = modem->sim_manager; + int total = length / record_length; struct ofono_phone_number *ph; int number_len; int ton_npi; - if (error->type != OFONO_ERROR_TYPE_NO_ERROR) - goto skip; + if (!ok) + return; - if (length < sim->own_numbers_size) - goto skip; + if (structure != OFONO_SIM_FILE_STRUCTURE_FIXED) + return; + + if (length < 14 || record_length < 14 || length < record_length) + return; /* Skip Alpha-Identifier field */ - sdata += sim->own_numbers_size - 14; + data += record_length - 14; - number_len = *sdata++; - ton_npi = *sdata++; + number_len = *data++; + ton_npi = *data++; if (number_len > 11 || ton_npi == 0xff) - goto skip; + goto check; ph = g_new(struct ofono_phone_number, 1); @@ -372,51 +378,27 @@ static void sim_msisdn_read_cb(const struct ofono_error *error, /* BCD coded, however the TON/NPI is given by the first byte */ number_len = (number_len - 1) * 2; - extract_bcd_number(sdata, number_len, ph->number); + extract_bcd_number(data, number_len, ph->number); sim->own_numbers = g_slist_prepend(sim->own_numbers, ph); -skip: - sim->own_numbers_current ++; - if (sim->own_numbers_current < sim->own_numbers_num) - sim->ops->read_file_linear(modem, SIM_EFMSISDN_FILEID, - sim->own_numbers_current, - sim->own_numbers_size, - sim_msisdn_read_cb, modem); - else - /* All records retrieved */ - if (sim->own_numbers) - sim->own_numbers = g_slist_reverse(sim->own_numbers); -} - -static void sim_msisdn_info_cb(const struct ofono_error *error, int length, - enum ofono_sim_file_structure structure, - int record_length, void *data) -{ - struct ofono_modem *modem = data; - struct sim_manager_data *sim = modem->sim_manager; - - if (error->type != OFONO_ERROR_TYPE_NO_ERROR || length < 14 || - record_length < 14 || - structure != OFONO_SIM_FILE_STRUCTURE_FIXED) - return; +check: + if (record == total && sim->own_numbers) { + char **own_numbers; + DBusConnection *conn = dbus_gsm_connection(); - sim->own_numbers_current = 0; - sim->own_numbers_size = record_length; - sim->own_numbers_num = length / record_length; - sim->ops->read_file_linear(modem, SIM_EFMSISDN_FILEID, 0, - record_length, sim_msisdn_read_cb, modem); -} - -static gboolean sim_retrieve_own_number(void *user_data) -{ - struct ofono_modem *modem = user_data; - struct sim_manager_data *sim = modem->sim_manager; + /* All records retrieved */ + sim->own_numbers = g_slist_reverse(sim->own_numbers); - sim->ops->read_file_info(modem, SIM_EFMSISDN_FILEID, - sim_msisdn_info_cb, modem); + own_numbers = get_own_numbers(sim->own_numbers); - return FALSE; + dbus_gsm_signal_array_property_changed(conn, modem->path, + SIM_MANAGER_INTERFACE, + "SubscriberNumbers", + DBUS_TYPE_STRING, + &own_numbers); + dbus_gsm_free_string_array(own_numbers); + } } struct sim_operator { @@ -766,6 +748,7 @@ static gboolean sim_retrieve_pnn(void *user_data) static void sim_ready(struct ofono_modem *modem) { + ofono_sim_read(modem, SIM_EFMSISDN_FILEID, sim_msisdn_read_cb, NULL); } static void sim_imsi_cb(const struct ofono_error *error, const char *imsi, |