Hi Andrew,

> It does not look like the list can be used directly for filtering CBs
> because for that, the ME should choose one language, if there is one
> that is supported by the UI (aka MMI).

It actually can, since the preferred language list for cell broadcasts can be 
of any length...

And now for some nitpicks:

> +static int parse_language_list(char **out_list, const unsigned char
> *sim_list, +                          int length)
> +{
> +     unsigned char code[3];
> +     int count, i;
> +     long written;
> +
> +     count = 0;
> +     length--;
> +
> +     for (i = 0; i < length; i += 2) {
> +             code[0] = sim_list[i + 0];
> +             code[1] = sim_list[i + 1];
> +             code[2] = 0;
> +
> +             if (code[0] == 0xff || code[1] == 0xff)
> +                     continue;
> +
> +             out_list[count] = convert_gsm_to_utf8(code, 2,
> +                                                     NULL, &written, 0);

Lets skip the gsm conversion.  The ISO639 standard only uses latin characters 
which are guaranteed to be the same between utf8 / gsm.

> +static void sim_efpl_read_cb(int ok,
> +                             enum ofono_sim_file_structure structure,
> +                             int length, int record,
> +                             const unsigned char *data,
> +                             int record_length, void *userdata)
> +{
> +     struct ofono_sim *sim = userdata;
> +     unsigned char *efli = sim->efli;
> +     const unsigned char *efpl = data;
> +     int efli_length = sim->efli_length;
> +     int efpl_length = length;
> +     int count;
> +     const char *path = __ofono_atom_get_path(sim->atom);
> +     DBusConnection *conn = ofono_dbus_get_connection();
> +
> +     if (!ok || structure != OFONO_SIM_FILE_STRUCTURE_TRANSPARENT)
> +             efpl = NULL;
> +
> +     if (length < 2)
> +             efpl = NULL;
> +
> +     sim->language_prefs = g_malloc(((efli_length + efpl_length) / 2 + 1) *
> +                     sizeof(char *));
> +
> +     count = 0;
> +
> +     /* Make a list of languages in both files in order of preferences
> +      * following 31.102.
> +      */
> +
> +     if (efli && efpl && efli[0] == 0xff && efli[1] == 0xff) {
> +             count += parse_language_list(sim->language_prefs + count,
> +                                             efpl, efpl_length);
> +             efpl = NULL;
> +     }
> +
> +     if (efli) {
> +             count += parse_language_list(sim->language_prefs + count,
> +                                             efli, efli_length);
> +             g_free(efli);
> +             sim->efli = NULL;
> +     }
> +
> +     if (efpl)
> +             count += parse_language_list(sim->language_prefs + count,
> +                                             efpl, efpl_length);

If we're going down the path of preserving both EFli and EFpl, then you should 
make sure no duplicates exist. Alternatively we can assume that oFono/UI will 
support all languages and simply not read EFpl if there is useable information 
in EFli.

> +static void sim_retrieve_efli(struct ofono_sim *sim)
> +{
> +     /* According to 31.102 the EFli is read first and EFpl is then
> +      * only read if none of the EFli languages are supported by user
> +      * interface.  51.011 mandates the exact opposite, making EFpl/EFelp
> +      * preferred over EFlp (same ID as EFli, different format).
> +      * However we don't depend on the user interface and so
> +      * need to read both files now.
> +      */
> +     ofono_sim_read(sim, SIM_EFLI_FILEID, sim_efli_read_cb, sim);
> +     ofono_sim_read(sim, SIM_EFPL_FILEID, sim_efpl_read_cb, sim);

Strictly speaking 31.101 & 31.102 supersede 51.011.

Regards,
-Denis
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to