diff options
author | Denis Kenzior <denkenz@gmail.com> | 2009-07-13 12:57:08 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2009-07-14 15:45:05 -0500 |
commit | 82ede4d647a2b9c7d5d7f919af0ba6b053d2ca3d (patch) | |
tree | 3de38a9c39efec86663bebd0def9879a90b63382 /src | |
parent | 9a565d88b1952f5771a1ae4ca80897eb9a302221 (diff) | |
download | ofono-82ede4d647a2b9c7d5d7f919af0ba6b053d2ca3d.tar.bz2 |
Move PNN reading to network.c
Diffstat (limited to 'src')
-rw-r--r-- | src/network.c | 42 | ||||
-rw-r--r-- | src/sim.c | 64 |
2 files changed, 42 insertions, 64 deletions
diff --git a/src/network.c b/src/network.c index 92e52e5a..e976fc0c 100644 --- a/src/network.c +++ b/src/network.c @@ -37,6 +37,7 @@ #include "driver.h" #include "common.h" #include "sim.h" +#include "simutil.h" #define NETWORK_REGISTRATION_INTERFACE "org.ofono.NetworkRegistration" #define NETWORK_OPERATOR_INTERFACE "org.ofono.NetworkOperator" @@ -64,6 +65,7 @@ struct network_registration_data { int signal_strength; char display_name[OFONO_MAX_OPERATOR_NAME_LENGTH]; char *spname; + GSList *pnn_list; }; static void operator_list_callback(const struct ofono_error *error, int total, @@ -565,6 +567,9 @@ static void network_registration_destroy(gpointer userdata) g_slist_free(data->operator_list); + g_slist_foreach(data->pnn_list, (GFunc)sim_pnn_operator_free, NULL); + g_slist_free(data->pnn_list); + if (data->spname) g_free(data->spname); @@ -1131,6 +1136,43 @@ static void ofono_update_spn(struct ofono_modem *modem, const char *spn, &operator); } +static void sim_pnn_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 network_registration_data *netreg = modem->network_registration; + struct sim_pnn_operator *oper; + int total = length / record_length; + + if (!ok) + return; + + if (structure != OFONO_SIM_FILE_STRUCTURE_FIXED) + return; + + if (length < 3 || record_length < 3 || length < record_length) + return; + + oper = sim_pnn_operator_parse(data, record_length); + + if (oper) + netreg->pnn_list = g_slist_prepend(netreg->pnn_list, oper); + + /* If PNN is not present then OPL is not useful, don't + * retrieve it. If OPL is not there then PNN[1] will + * still be used for the HPLMN and/or EHPLMN, if PNN + * is present. */ + if (record == total && g_slist_length(netreg->pnn_list) > 0) + ofono_sim_read(modem, SIM_EFOPL_FILEID, sim_opl_read_cb, NULL); +} + +static void sim_ready(struct ofono_modem *modem) +{ + ofono_sim_read(modem, SIM_EFPNN_FILEID, sim_pnn_read_cb, NULL); +} + int ofono_network_registration_register(struct ofono_modem *modem, struct ofono_network_registration_ops *ops) { @@ -589,70 +589,6 @@ const char *ofono_operator_name_sim_override(struct ofono_modem *modem, return sim->pnn[opl_op->id - 1].longname; } -static void sim_pnn_read_cb(const struct ofono_error *error, - const unsigned char *pnndata, int length, void *data) -{ - struct ofono_modem *modem = data; - struct sim_manager_data *sim = modem->sim_manager; - struct opl_operator *oper; - - if (error->type != OFONO_ERROR_TYPE_NO_ERROR) - goto skip; - - if (length < sim->pnn_size) - goto skip; - - pnn_operator_parse(&sim->pnn[sim->pnn_current], pnndata, length); - -skip: - sim->pnn_current ++; - if (sim->pnn_current < sim->pnn_num) - sim->ops->read_file_linear(modem, SIM_EFPNN_FILEID, - sim->pnn_current, - sim->pnn_size, - sim_pnn_read_cb, modem); - else - /* All records retrieved */ - /* We now need EF-OPL if it's there for PNN to be - * useful. */ - sim_retrieve_opl(modem); -} - -static void sim_pnn_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 < 3 || - record_length < 3 || - structure != OFONO_SIM_FILE_STRUCTURE_FIXED) - /* If PNN is not present then OPL is not useful, don't - * retrieve it. If OPL is not there then PNN[1] will - * still be used for the HPLMN and/or EHPLMN, if PNN - * is present. */ - return; - - sim->pnn_current = 0; - sim->pnn_size = record_length; - sim->pnn_num = length / record_length; - sim->pnn = g_new0(struct pnn_operator, sim->pnn_num); - sim->ops->read_file_linear(modem, SIM_EFPNN_FILEID, 0, - record_length, sim_pnn_read_cb, modem); -} - -static gboolean sim_retrieve_pnn(void *user_data) -{ - struct ofono_modem *modem = user_data; - struct sim_manager_data *sim = modem->sim_manager; - - sim->ops->read_file_info(modem, SIM_EFPNN_FILEID, - sim_pnn_info_cb, modem); - - return FALSE; -} - static void sim_ready(struct ofono_modem *modem) { ofono_sim_read(modem, SIM_EFMSISDN_FILEID, sim_msisdn_read_cb, NULL); |