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