sim: Add special callback for reading MSISDN value

This commit is contained in:
Marcel Holtmann 2012-06-16 20:52:18 -07:00
parent 1960dbbc79
commit c3124b66d9
2 changed files with 61 additions and 30 deletions

View File

@ -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,

View File

@ -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;