sim: Add special callback for reading MCC and MNC value
authorMarcel Holtmann <marcel@holtmann.org>
Sun, 17 Jun 2012 04:30:28 +0000 (21:30 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 17 Jun 2012 04:30:28 +0000 (21:30 -0700)
include/sim.h
src/sim.c

index 8b5ff65..3e13564 100644 (file)
@@ -104,6 +104,10 @@ typedef void (*ofono_sim_iccid_cb_t)(const struct ofono_error *error,
 typedef void (*ofono_sim_imsi_cb_t)(const struct ofono_error *error,
                                        const char *imsi, void *data);
 
+typedef void (*ofono_sim_mccmnc_cb_t)(const struct ofono_error *error,
+                                       const char *mcc, const char *mnc,
+                                       void *data);
+
 typedef void (*ofono_sim_state_event_cb_t)(enum ofono_sim_state new_state,
                                        void *data);
 
@@ -157,6 +161,8 @@ struct ofono_sim_driver {
                        ofono_sim_iccid_cb_t cb, void *data);
        void (*read_imsi)(struct ofono_sim *sim,
                        ofono_sim_imsi_cb_t cb, void *data);
+       void (*read_mccmnc)(struct ofono_sim *sim,
+                       ofono_sim_mccmnc_cb_t cb, void *data);
        void (*query_passwd_state)(struct ofono_sim *sim,
                        ofono_sim_passwd_cb_t cb, void *data);
        void (*send_passwd)(struct ofono_sim *sim, const char *passwd,
index 3d4eece..afb94ff 100644 (file)
--- a/src/sim.c
+++ b/src/sim.c
@@ -1721,6 +1721,20 @@ static void sim_cphs_information_read_cb(int ok, int length, int record,
        memcpy(sim->cphs_service_table, data + 1, 2);
 }
 
+static void sim_mccmnc_cb(const struct ofono_error *error,
+                       const char *mcc, const char *mnc, void *userdata)
+{
+       struct ofono_sim *sim = userdata;
+
+       if (error->type != OFONO_ERROR_TYPE_NO_ERROR)
+               return;
+
+       if (!mcc || !mnc)
+               return;
+
+       sim->mnc_length = strlen(mnc);
+}
+
 static void sim_ad_read_cb(int ok, int length, int record,
                                const unsigned char *data,
                                int record_length, void *userdata)
@@ -1728,8 +1742,11 @@ static void sim_ad_read_cb(int ok, int length, int record,
        struct ofono_sim *sim = userdata;
        int new_mnc_length;
 
-       if (!ok)
+       if (!ok) {
+               if (sim->driver->read_mccmnc)
+                       sim->driver->read_mccmnc(sim, sim_mccmnc_cb, sim);
                return;
+       }
 
        if (length < 4)
                return;