mirror of git://git.sysmocom.de/ofono
gprs: Use sim SPN watch API
This commit is contained in:
parent
f9fac7100b
commit
9ebdfe29db
71
src/gprs.c
71
src/gprs.c
|
@ -94,7 +94,7 @@ struct ofono_gprs {
|
||||||
const struct ofono_gprs_driver *driver;
|
const struct ofono_gprs_driver *driver;
|
||||||
void *driver_data;
|
void *driver_data;
|
||||||
struct ofono_atom *atom;
|
struct ofono_atom *atom;
|
||||||
struct ofono_sim_context *sim_context;
|
unsigned int spn_watch;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ipv4_settings {
|
struct ipv4_settings {
|
||||||
|
@ -2502,6 +2502,17 @@ static void free_contexts(struct ofono_gprs *gprs)
|
||||||
g_slist_free(gprs->contexts);
|
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)
|
static void gprs_unregister(struct ofono_atom *atom)
|
||||||
{
|
{
|
||||||
DBusConnection *conn = ofono_dbus_get_connection();
|
DBusConnection *conn = ofono_dbus_get_connection();
|
||||||
|
@ -2530,6 +2541,10 @@ static void gprs_unregister(struct ofono_atom *atom)
|
||||||
gprs->netreg = NULL;
|
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_modem_remove_interface(modem,
|
||||||
OFONO_CONNECTION_MANAGER_INTERFACE);
|
OFONO_CONNECTION_MANAGER_INTERFACE);
|
||||||
g_dbus_unregister_interface(conn, path,
|
g_dbus_unregister_interface(conn, path,
|
||||||
|
@ -2565,9 +2580,6 @@ static void gprs_remove(struct ofono_atom *atom)
|
||||||
if (gprs->driver && gprs->driver->remove)
|
if (gprs->driver && gprs->driver->remove)
|
||||||
gprs->driver->remove(gprs);
|
gprs->driver->remove(gprs);
|
||||||
|
|
||||||
if (gprs->sim_context)
|
|
||||||
ofono_sim_context_free(gprs->sim_context);
|
|
||||||
|
|
||||||
g_free(gprs);
|
g_free(gprs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2955,57 +2967,36 @@ static void ofono_gprs_finish_register(struct ofono_gprs *gprs)
|
||||||
__ofono_atom_register(gprs->atom, gprs_unregister);
|
__ofono_atom_register(gprs->atom, gprs_unregister);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sim_spn_read_cb(int ok, int length, int record,
|
static void spn_read_cb(const char *spn, const char *dc, void *data)
|
||||||
const unsigned char *data,
|
|
||||||
int record_length, void *userdata)
|
|
||||||
{
|
{
|
||||||
struct ofono_gprs *gprs = userdata;
|
struct ofono_gprs *gprs = data;
|
||||||
char *spn = NULL;
|
struct ofono_sim *sim = ofono_gprs_get_sim(gprs);
|
||||||
struct ofono_atom *sim_atom;
|
|
||||||
struct ofono_sim *sim = NULL;
|
|
||||||
|
|
||||||
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);
|
ofono_sim_get_mnc(sim), spn);
|
||||||
}
|
|
||||||
|
|
||||||
g_free(spn);
|
ofono_sim_remove_spn_watch(sim, &gprs->spn_watch);
|
||||||
|
|
||||||
ofono_gprs_finish_register(gprs);
|
ofono_gprs_finish_register(gprs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ofono_gprs_register(struct ofono_gprs *gprs)
|
void ofono_gprs_register(struct ofono_gprs *gprs)
|
||||||
{
|
{
|
||||||
struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
|
struct ofono_sim *sim = ofono_gprs_get_sim(gprs);
|
||||||
struct ofono_atom *sim_atom;
|
|
||||||
struct ofono_sim *sim = NULL;
|
|
||||||
|
|
||||||
sim_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM);
|
if (sim == NULL) {
|
||||||
|
ofono_gprs_finish_register(gprs);
|
||||||
if (sim_atom) {
|
|
||||||
const char *imsi;
|
|
||||||
sim = __ofono_atom_get_data(sim_atom);
|
|
||||||
|
|
||||||
imsi = ofono_sim_get_imsi(sim);
|
|
||||||
gprs_load_settings(gprs, imsi);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gprs->contexts == NULL && sim != NULL) {
|
|
||||||
/* Get Service Provider Name from SIM for provisioning */
|
|
||||||
gprs->sim_context = ofono_sim_context_create(sim);
|
|
||||||
|
|
||||||
if (ofono_sim_read(gprs->sim_context, SIM_EFSPN_FILEID,
|
|
||||||
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
|
|
||||||
sim_spn_read_cb, gprs) >= 0)
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gprs_load_settings(gprs, ofono_sim_get_imsi(sim));
|
||||||
|
|
||||||
|
if (gprs->contexts) {
|
||||||
ofono_gprs_finish_register(gprs);
|
ofono_gprs_finish_register(gprs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ofono_sim_add_spn_watch(sim, &gprs->spn_watch, spn_read_cb, gprs, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ofono_gprs_remove(struct ofono_gprs *gprs)
|
void ofono_gprs_remove(struct ofono_gprs *gprs)
|
||||||
|
|
Loading…
Reference in New Issue