From c3124b66d903a43ce639e3de8e838ef39419fc4f Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 16 Jun 2012 20:52:18 -0700 Subject: [PATCH] sim: Add special callback for reading MSISDN value --- include/sim.h | 6 ++++ src/sim.c | 85 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 61 insertions(+), 30 deletions(-) diff --git a/include/sim.h b/include/sim.h index cd2f1e38..8b5ff659 100644 --- a/include/sim.h +++ b/include/sim.h @@ -94,6 +94,10 @@ typedef void (*ofono_sim_read_cb_t)(const struct ofono_error *error, typedef void (*ofono_sim_write_cb_t)(const struct ofono_error *error, void *data); +typedef void (*ofono_sim_msisdn_cb_t)(const struct ofono_error *error, + const struct ofono_phone_number *ph, + void *data); + typedef void (*ofono_sim_iccid_cb_t)(const struct ofono_error *error, const char *iccid, void *data); @@ -147,6 +151,8 @@ struct ofono_sim_driver { void (*write_file_cyclic)(struct ofono_sim *sim, int fileid, int length, const unsigned char *value, ofono_sim_write_cb_t cb, void *data); + void (*read_msisdn)(struct ofono_sim *sim, + ofono_sim_msisdn_cb_t cb, void *data); void (*read_iccid)(struct ofono_sim *sim, ofono_sim_iccid_cb_t cb, void *data); void (*read_imsi)(struct ofono_sim *sim, diff --git a/src/sim.c b/src/sim.c index f02acedc..3d4eece4 100644 --- a/src/sim.c +++ b/src/sim.c @@ -1126,37 +1126,8 @@ static gboolean numbers_list_equal(GSList *a, GSList *b) return TRUE; } -static void sim_msisdn_read_cb(int ok, int length, int record, - const unsigned char *data, - int record_length, void *userdata) +static void sim_own_numbers_update_done(struct ofono_sim *sim) { - struct ofono_sim *sim = userdata; - int total; - struct ofono_phone_number ph; - - if (!ok) - goto check; - - if (record_length < 14 || length < record_length) - return; - - total = length / record_length; - - sim->efmsisdn_length = record_length; - sim->efmsisdn_records = total; - - if (sim_adn_parse(data, record_length, &ph, NULL) == TRUE) { - struct ofono_phone_number *own; - - own = g_new(struct ofono_phone_number, 1); - memcpy(own, &ph, sizeof(struct ofono_phone_number)); - sim->new_numbers = g_slist_prepend(sim->new_numbers, own); - } - - if (record != total) - return; - -check: /* All records retrieved */ if (sim->new_numbers) sim->new_numbers = g_slist_reverse(sim->new_numbers); @@ -1186,6 +1157,60 @@ check: sim->new_numbers = NULL; } +static void sim_msisdn_cb(const struct ofono_error *error, + const struct ofono_phone_number *ph, void *userdata) +{ + struct ofono_sim *sim = userdata; + + if (error->type == OFONO_ERROR_TYPE_NO_ERROR) { + struct ofono_phone_number *own; + + own = g_new(struct ofono_phone_number, 1); + memcpy(own, ph, sizeof(struct ofono_phone_number)); + sim->new_numbers = g_slist_prepend(sim->new_numbers, own); + } + + sim_own_numbers_update_done(sim); +} + +static void sim_msisdn_read_cb(int ok, int length, int record, + const unsigned char *data, + int record_length, void *userdata) +{ + struct ofono_sim *sim = userdata; + int total; + struct ofono_phone_number ph; + + if (!ok) { + if (sim->driver->read_msisdn) + sim->driver->read_msisdn(sim, sim_msisdn_cb, sim); + else + sim_own_numbers_update_done(sim); + return; + } + + if (record_length < 14 || length < record_length) + return; + + total = length / record_length; + + sim->efmsisdn_length = record_length; + sim->efmsisdn_records = total; + + if (sim_adn_parse(data, record_length, &ph, NULL) == TRUE) { + struct ofono_phone_number *own; + + own = g_new(struct ofono_phone_number, 1); + memcpy(own, &ph, sizeof(struct ofono_phone_number)); + sim->new_numbers = g_slist_prepend(sim->new_numbers, own); + } + + if (record != total) + return; + + sim_own_numbers_update_done(sim); +} + static gint service_number_compare(gconstpointer a, gconstpointer b) { const struct service_number *sdn = a;