Hi Jukka,

>  Makefile.am          |    3 +
>  examples/provision.c |  198 
> ++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 201 insertions(+), 0 deletions(-)
>  create mode 100644 examples/provision.c
> 
> diff --git a/Makefile.am b/Makefile.am
> index 0f330a7..d57509d 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -305,6 +305,9 @@ builtin_sources += examples/history.c
>  
>  builtin_modules += example_nettime
>  builtin_sources += examples/nettime.c
> +
> +builtin_modules += example_gprs_provision
> +builtin_sources += examples/provision.c
>  endif

I like to have these match. So just call it example_provision.

> +struct provisioning_request {
> +     struct ofono_modem *modem;
> +     ofono_gprs_provision_cb_t cb;
> +     void *userdata;

Same as I mentioned in the other patch. Please use user_data.

> +};
> +
> +static void sim_spn_read_cb(int ok, int length, int record,
> +                             const unsigned char *data,
> +                             int record_length, void *userdata)
> +{
> +     struct provisioning_request *req = userdata;
> +     char *spn = NULL;
> +
> +     struct ofono_atom *sim_atom;
> +     struct ofono_sim *sim;
> +     const char *imsi;
> +
> +     unsigned char mnc_length;
> +     char mcc[OFONO_MAX_MCC_LENGTH + 1];
> +     char mnc[OFONO_MAX_MNC_LENGTH + 1];
> +
> +     GSList *settings = NULL;
> +     struct ofono_gprs_provisioning_data *entry;
> +
> +     sim_atom = __ofono_modem_find_atom(req->modem, OFONO_ATOM_TYPE_SIM);
> +
> +     if (sim_atom == NULL) {
> +             ofono_debug("No SIM atom");
> +             goto finish;
> +     }
> +
> +     sim = __ofono_atom_get_data(sim_atom);
> +     imsi = ofono_sim_get_imsi(sim);
> +     if (imsi == NULL) {
> +             ofono_debug("No IMSI available");
> +             goto finish;
> +     }
> +
> +     mnc_length = ofono_sim_get_mnc_length(sim);
> +     if (mnc_length == 0) {
> +             ofono_debug("No MNC length available");
> +             goto finish;
> +     }
> +
> +     strncpy(mcc, imsi, OFONO_MAX_MCC_LENGTH);
> +     mcc[OFONO_MAX_MCC_LENGTH] = '\0';
> +     strncpy(mnc, imsi + OFONO_MAX_MCC_LENGTH, mnc_length);
> +     mnc[mnc_length] = '\0';
> +
> +     if (ok)
> +             spn = sim_string_to_utf8(data + 1, length - 1);
> +
> +     ofono_debug("Finding settings for MCC %s, MNC %s, SPN '%s'",
> +                     mcc, mnc, spn);
> +
> +     if (spn == NULL || strcmp(spn, "oFono") != 0)
> +             goto finish;

I think we need to also take some MCC and MNC into account. People will
be by accident compiling this plugin and I wanna make sure nothing bad
gets provisioned ;)

> +static void example_gprs_provision_get_settings(
> +     struct ofono_modem *modem,
> +     ofono_gprs_provision_cb_t cb,
> +     void *userdata)
> +{
> +     struct provisioning_request *req;
> +     struct ofono_atom *sim_atom;
> +     struct ofono_sim *sim = NULL;
> +
> +     ofono_debug("Provisioning...");
> +
> +     req = g_try_new0(struct provisioning_request, 1);
> +     if (req == NULL)
> +             goto error;
> +
> +     req->modem = modem;
> +     req->cb = cb;
> +     req->userdata = userdata;
> +
> +     /* Start SPN query from SIM */
> +     sim_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM);
> +
> +     if (sim_atom != NULL)
> +             sim = __ofono_atom_get_data(sim_atom);
> +
> +     if (sim != NULL) {
> +             ofono_sim_read(sim, SIM_EFSPN_FILEID,
> +                             OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
> +                             sim_spn_read_cb, req);
> +             return;
> +     }

Should this not be provided somehow by the SIM atom?

Denis, any idea why we are not keeping this information available?

Regards

Marcel


_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to