Hi Jeevaka, On 03/28/2011 08:58 AM, Jeevaka Badrappan wrote: > --- > drivers/ifxmodem/voicecall.c | 98 ++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 98 insertions(+), 0 deletions(-) > > diff --git a/drivers/ifxmodem/voicecall.c b/drivers/ifxmodem/voicecall.c > index 87a48e6..a92ac11 100644 > --- a/drivers/ifxmodem/voicecall.c > +++ b/drivers/ifxmodem/voicecall.c > @@ -42,11 +42,13 @@ > #include "ifxmodem.h" > > static const char *none_prefix[] = { NULL }; > +static const char *xlema_prefix[] = { "+XLEMA:", NULL }; > > struct voicecall_data { > GSList *calls; > unsigned int local_release; > GAtChat *chat; > + GSList *en_list; > }; > > struct release_id_req { > @@ -786,6 +788,95 @@ static void xcolp_notify(GAtResult *result, gpointer user_data) > ofono_voicecall_notify(vc, call); > } > > +static gint number_compare(gconstpointer a, gconstpointer b) > +{ > + const char *s1 = a, *s2 = b; > + return strcmp(s1, s2); > +} > + > +static void xlema_notify(GAtResult *result, gpointer user_data) > +{ > + struct ofono_voicecall *vc = user_data; > + struct voicecall_data *vd = ofono_voicecall_get_data(vc); > + GAtResultIter iter; > + int index, total_cnt; > + const char *number; > + > + g_at_result_iter_init(&iter, result); > + > + if (!g_at_result_iter_next(&iter, "+XLEMA:")) > + return; > + > + if (!g_at_result_iter_next_number(&iter, &index)) > + return; > + > + if (!g_at_result_iter_next_number(&iter, &total_cnt)) > + return; > + > + if (!g_at_result_iter_next_string(&iter, &number)) > + return; > + > + // Skip the category, EN valid with simpresence and mcc fields Just a nitpick, but can you please use C-style comments ;) > + > + if (!g_slist_find_custom(vd->en_list, number, number_compare)) > + vd->en_list = g_slist_prepend(vd->en_list, g_strdup(number)); > + Does this duplicate detection belong in the core? It might be more efficient to bite the bullet and use something like a GHashtable to build the final list of ECCs. > + if (index != total_cnt) > + return; > + > + vd->en_list = g_slist_reverse(vd->en_list); > + > + ofono_voicecall_en_list_notify(vc, vd->en_list); > + > + g_slist_foreach(vd->en_list, (GFunc) g_free, NULL); > + g_slist_free(vd->en_list); > + vd->en_list = NULL; > +} > + > +static void xlema_read(gboolean ok, GAtResult *result, gpointer user_data) > +{ > + struct ofono_voicecall *vc = user_data; > + struct voicecall_data *vd = ofono_voicecall_get_data(vc); > + GAtResultIter iter; > + int index, total_cnt; > + const char *number; > + > + if (!ok) { > + DBG("Emergency number list read failed"); > + return; > + } > + > + g_at_result_iter_init(&iter, result); > + > + while (g_at_result_iter_next(&iter, "+XLEMA:")) { > + if (!g_at_result_iter_next_number(&iter, &index)) > + continue; > + > + if (!g_at_result_iter_next_number(&iter, &total_cnt)) > + continue; > + > + if (!g_at_result_iter_next_string(&iter, &number)) > + continue; > + > + // Skip the category, EN valid with simpresence and mcc fields Again about c-style comments > + g_at_result_iter_skip_next(&iter); > + g_at_result_iter_skip_next(&iter); > + g_at_result_iter_skip_next(&iter); > + > + if (!g_slist_find_custom(vd->en_list, number, number_compare)) > + vd->en_list = g_slist_prepend(vd->en_list, > + g_strdup(number)); > + } > + > + vd->en_list = g_slist_reverse(vd->en_list); > + > + ofono_voicecall_en_list_notify(vc, vd->en_list); > + > + g_slist_foreach(vd->en_list, (GFunc) g_free, NULL); > + g_slist_free(vd->en_list); > + vd->en_list = NULL; > +} > + > static void ifx_voicecall_initialized(gboolean ok, GAtResult *result, > gpointer user_data) > { > @@ -803,7 +894,14 @@ static void ifx_voicecall_initialized(gboolean ok, GAtResult *result, > FALSE, vc, NULL); > g_at_chat_register(vd->chat, "+XCOLP:", xcolp_notify, FALSE, vc, NULL); > > + g_at_chat_register(vd->chat, "+XLEMA:", xlema_notify, FALSE, vc, NULL); An empty line here please > + /* Enable emergency number list notification */ > + g_at_chat_send(vd->chat, "AT+XLEMA=1", none_prefix, NULL, NULL, NULL); > + > ofono_voicecall_register(vc); > + > + g_at_chat_send(vd->chat, "AT+XLEMA?", xlema_prefix, xlema_read, vc, > + NULL); > } > > static int ifx_voicecall_probe(struct ofono_voicecall *vc, unsigned int vendor, Regards, -Denis