---
src/gprs.c | 67 ++++++++++++++++++++++++++++++++---------------------------
1 files changed, 36 insertions(+), 31 deletions(-)
diff --git a/src/gprs.c b/src/gprs.c
index 4e46743..356479c 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -46,8 +46,9 @@
#include "simutil.h"
#include "util.h"
-#define GPRS_FLAG_ATTACHING 0x1
-#define GPRS_FLAG_RECHECK 0x2
+#define GPRS_FLAG_ATTACHING 0x1
+#define GPRS_FLAG_RECHECK 0x2
+#define GPRS_FLAG_READ_SPN 0x4
#define SETTINGS_STORE "gprs"
#define SETTINGS_GROUP "Settings"
@@ -87,6 +88,7 @@ struct ofono_gprs {
struct ofono_netreg *netreg;
unsigned int netreg_watch;
unsigned int status_watch;
+ unsigned int spn_watch;
GKeyFile *settings;
char *imsi;
DBusMessage *pending;
@@ -148,6 +150,7 @@ struct pri_context {
static void gprs_netreg_update(struct ofono_gprs *gprs);
static void gprs_deactivate_next(struct ofono_gprs *gprs);
+static void spn_read_cb(gpointer spn, gpointer user_data);
static GSList *g_drivers = NULL;
static GSList *g_context_drivers = NULL;
@@ -1528,11 +1531,15 @@ static void gprs_netreg_removed(struct ofono_gprs *gprs)
{
gprs->netreg = NULL;
- gprs->flags &= ~(GPRS_FLAG_RECHECK | GPRS_FLAG_ATTACHING);
+ gprs->flags &= ~(GPRS_FLAG_RECHECK | GPRS_FLAG_ATTACHING |
+ GPRS_FLAG_READ_SPN);
gprs->status_watch = 0;
gprs->netreg_status = NETWORK_REGISTRATION_STATUS_NOT_REGISTERED;
gprs->driver_attached = FALSE;
+ if (gprs->spn_watch)
+ __ofono_netreg_remove_spn_watch(gprs->netreg, &gprs->spn_watch);
+
gprs_attached_update(gprs);
}
@@ -2625,6 +2632,12 @@ static void netreg_watch(struct ofono_atom *atom,
netreg_status_changed, gprs, NULL);
gprs_netreg_update(gprs);
+
+ if (gprs->flags & GPRS_FLAG_READ_SPN) {
+ __ofono_netreg_add_spn_watch(gprs->netreg, &gprs->spn_watch,
+ spn_read_cb, gprs, NULL);
+ gprs->flags &= ~GPRS_FLAG_READ_SPN;
+ }
}
static gboolean load_context(struct ofono_gprs *gprs, const char *group)
@@ -2948,34 +2961,29 @@ static void ofono_gprs_finish_register(struct
ofono_gprs *gprs)
ofono_modem_add_interface(modem,
OFONO_CONNECTION_MANAGER_INTERFACE);
- gprs->netreg_watch = __ofono_modem_add_atom_watch(modem,
- OFONO_ATOM_TYPE_NETREG,
- netreg_watch, gprs, NULL);
-
__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(gpointer spn, gpointer user_data)
{
- struct ofono_gprs *gprs = userdata;
- char *spn = NULL;
+ struct ofono_gprs *gprs = user_data;
struct ofono_atom *sim_atom;
- struct ofono_sim *sim = NULL;
+ struct ofono_sim *sim;
- if (ok)
- spn = sim_string_to_utf8(data + 1, length - 1);
+ if (gprs->spn_watch == 0)
+ return;
+
+ __ofono_netreg_remove_spn_watch(gprs->netreg, &gprs->spn_watch);
sim_atom = __ofono_modem_find_atom(__ofono_atom_get_modem(gprs->atom),
OFONO_ATOM_TYPE_SIM);
- if (sim_atom) {
+ if (sim_atom)
sim = __ofono_atom_get_data(sim_atom);
+
+ if (sim != NULL && spn != NULL)
provision_contexts(gprs, ofono_sim_get_mcc(sim),
ofono_sim_get_mnc(sim), spn);
- }
- g_free(spn);
ofono_gprs_finish_register(gprs);
}
@@ -2985,27 +2993,24 @@ void ofono_gprs_register(struct ofono_gprs *gprs)
struct ofono_atom *sim_atom;
struct ofono_sim *sim = NULL;
- sim_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM);
+ sim_atom = __ofono_modem_find_atom(__ofono_atom_get_modem(gprs->atom),
+ OFONO_ATOM_TYPE_SIM);
if (sim_atom) {
- const char *imsi;
sim = __ofono_atom_get_data(sim_atom);
- imsi = ofono_sim_get_imsi(sim);
- gprs_load_settings(gprs, imsi);
+ gprs_load_settings(gprs, ofono_sim_get_imsi(sim));
}
- if (gprs->contexts == NULL && sim != NULL) {
- /* Get Service Provider Name from SIM for provisioning */
- gprs->sim_context = ofono_sim_context_create(sim);
+ if (gprs->contexts == NULL && sim != NULL)
+ gprs->flags |= GPRS_FLAG_READ_SPN;
- if (ofono_sim_read(gprs->sim_context, SIM_EFSPN_FILEID,
- OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
- sim_spn_read_cb, gprs) >= 0)
- return;
- }
+ gprs->netreg_watch = __ofono_modem_add_atom_watch(modem,
+ OFONO_ATOM_TYPE_NETREG,
+ netreg_watch, gprs, NULL);
- ofono_gprs_finish_register(gprs);
+ if (gprs->spn_watch == 0)
+ ofono_gprs_finish_register(gprs);
}
void ofono_gprs_remove(struct ofono_gprs *gprs)
--
1.7.5.4
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono