From: Jeevaka Badrappan Date: Wed, 8 Jun 2011 15:44:47 +0000 (-0700) Subject: ifxmodem: emergency number list support X-Git-Tag: 0.50~11 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=377a512375597d2df9b88d8763f8bf512726bbb5;p=platform%2Fupstream%2Fofono.git ifxmodem: emergency number list support --- diff --git a/drivers/ifxmodem/voicecall.c b/drivers/ifxmodem/voicecall.c index 87a48e6..0aa83e4 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; + char **en_list; }; struct release_id_req { @@ -786,6 +788,93 @@ static void xcolp_notify(GAtResult *result, gpointer user_data) ofono_voicecall_notify(vc, call); } +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; + int count = (vd->en_list == NULL) ? 0 : g_strv_length(vd->en_list); + + 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, valid in simpresent and mcc fields */ + + if (vd->en_list == NULL) + vd->en_list = g_new0(char *, total_cnt + 1); + + vd->en_list[count] = g_strdup(number); + + if (index != total_cnt) + return; + + ofono_voicecall_en_list_notify(vc, vd->en_list); + + g_strfreev(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 num = 0; + 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:")) + num += 1; + + vd->en_list = g_new0(char *, num + 1); + + num = 0; + 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, valid in simpresent and mcc fields */ + g_at_result_iter_skip_next(&iter); + g_at_result_iter_skip_next(&iter); + g_at_result_iter_skip_next(&iter); + + vd->en_list[num++] = g_strdup(number); + } + + ofono_voicecall_en_list_notify(vc, vd->en_list); + + g_strfreev(vd->en_list); + vd->en_list = NULL; +} + static void ifx_voicecall_initialized(gboolean ok, GAtResult *result, gpointer user_data) { @@ -802,6 +891,10 @@ static void ifx_voicecall_initialized(gboolean ok, GAtResult *result, g_at_chat_register(vd->chat, "+XCALLSTAT:", xcallstat_notify, 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); + /* Enable emergency number list notification */ + g_at_chat_send(vd->chat, "AT+XLEMA=1", xlema_prefix, xlema_read, vc, + NULL); ofono_voicecall_register(vc); } @@ -840,6 +933,8 @@ static void ifx_voicecall_remove(struct ofono_voicecall *vc) g_slist_foreach(vd->calls, (GFunc) g_free, NULL); g_slist_free(vd->calls); + g_strfreev(vd->en_list); + ofono_voicecall_set_data(vc, NULL); g_at_chat_unref(vd->chat);