gprs: Use sim SPN watch API
authorOleg Zhurakivskyy <oleg.zhurakivskyy@intel.com>
Wed, 18 Jan 2012 11:56:26 +0000 (13:56 +0200)
committerDenis Kenzior <denkenz@gmail.com>
Wed, 18 Jan 2012 16:26:03 +0000 (10:26 -0600)
src/gprs.c

index 4e46743..bf7c66f 100644 (file)
@@ -94,7 +94,7 @@ struct ofono_gprs {
        const struct ofono_gprs_driver *driver;
        void *driver_data;
        struct ofono_atom *atom;
-       struct ofono_sim_context *sim_context;
+       unsigned int spn_watch;
 };
 
 struct ipv4_settings {
@@ -2502,6 +2502,17 @@ static void free_contexts(struct ofono_gprs *gprs)
        g_slist_free(gprs->contexts);
 }
 
+static inline struct ofono_sim *ofono_gprs_get_sim(struct ofono_gprs *gprs)
+{
+       struct ofono_atom *atom = __ofono_modem_find_atom(
+                                       __ofono_atom_get_modem(gprs->atom),
+                                       OFONO_ATOM_TYPE_SIM);
+       if (atom)
+               return __ofono_atom_get_data(atom);
+
+       return NULL;
+}
+
 static void gprs_unregister(struct ofono_atom *atom)
 {
        DBusConnection *conn = ofono_dbus_get_connection();
@@ -2530,6 +2541,10 @@ static void gprs_unregister(struct ofono_atom *atom)
                gprs->netreg = NULL;
        }
 
+       if (gprs->spn_watch)
+               ofono_sim_remove_spn_watch(ofono_gprs_get_sim(gprs),
+                                                       &gprs->spn_watch);
+
        ofono_modem_remove_interface(modem,
                                        OFONO_CONNECTION_MANAGER_INTERFACE);
        g_dbus_unregister_interface(conn, path,
@@ -2565,9 +2580,6 @@ static void gprs_remove(struct ofono_atom *atom)
        if (gprs->driver && gprs->driver->remove)
                gprs->driver->remove(gprs);
 
-       if (gprs->sim_context)
-               ofono_sim_context_free(gprs->sim_context);
-
        g_free(gprs);
 }
 
@@ -2955,57 +2967,36 @@ static void ofono_gprs_finish_register(struct ofono_gprs *gprs)
        __ofono_atom_register(gprs->atom, gprs_unregister);
 }
 
-static void sim_spn_read_cb(int ok, int length, int record,
-                               const unsigned char *data,
-                               int record_length, void *userdata)
+static void spn_read_cb(const char *spn, const char *dc, void *data)
 {
-       struct ofono_gprs *gprs = userdata;
-       char *spn = NULL;
-       struct ofono_atom *sim_atom;
-       struct ofono_sim *sim = NULL;
+       struct ofono_gprs *gprs = data;
+       struct ofono_sim *sim = ofono_gprs_get_sim(gprs);
 
-       if (ok)
-               spn = sim_string_to_utf8(data + 1, length - 1);
-
-       sim_atom = __ofono_modem_find_atom(__ofono_atom_get_modem(gprs->atom),
-                                               OFONO_ATOM_TYPE_SIM);
-       if (sim_atom) {
-               sim = __ofono_atom_get_data(sim_atom);
-               provision_contexts(gprs, ofono_sim_get_mcc(sim),
+       provision_contexts(gprs, ofono_sim_get_mcc(sim),
                                        ofono_sim_get_mnc(sim), spn);
-       }
 
-       g_free(spn);
+       ofono_sim_remove_spn_watch(sim, &gprs->spn_watch);
+
        ofono_gprs_finish_register(gprs);
 }
 
 void ofono_gprs_register(struct ofono_gprs *gprs)
 {
-       struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
-       struct ofono_atom *sim_atom;
-       struct ofono_sim *sim = NULL;
-
-       sim_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM);
-
-       if (sim_atom) {
-               const char *imsi;
-               sim = __ofono_atom_get_data(sim_atom);
+       struct ofono_sim *sim = ofono_gprs_get_sim(gprs);
 
-               imsi = ofono_sim_get_imsi(sim);
-               gprs_load_settings(gprs, imsi);
+       if (sim == NULL) {
+               ofono_gprs_finish_register(gprs);
+               return;
        }
 
-       if (gprs->contexts == NULL && sim != NULL) {
-               /* Get Service Provider Name from SIM for provisioning */
-               gprs->sim_context = ofono_sim_context_create(sim);
+       gprs_load_settings(gprs, ofono_sim_get_imsi(sim));
 
-               if (ofono_sim_read(gprs->sim_context, SIM_EFSPN_FILEID,
-                               OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
-                                       sim_spn_read_cb, gprs) >= 0)
-                       return;
+       if (gprs->contexts) {
+               ofono_gprs_finish_register(gprs);
+               return;
        }
 
-       ofono_gprs_finish_register(gprs);
+       ofono_sim_add_spn_watch(sim, &gprs->spn_watch, spn_read_cb, gprs, NULL);
 }
 
 void ofono_gprs_remove(struct ofono_gprs *gprs)