sim: Add special callback for reading MSISDN value
authorMarcel Holtmann <marcel@holtmann.org>
Sun, 17 Jun 2012 03:52:18 +0000 (20:52 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 17 Jun 2012 03:52:18 +0000 (20:52 -0700)
include/sim.h
src/sim.c

index cd2f1e3..8b5ff65 100644 (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,
index f02aced..3d4eece 100644 (file)
--- 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;