---
 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
+
+       if (!g_slist_find_custom(vd->en_list, number, number_compare))
+               vd->en_list = g_slist_prepend(vd->en_list, g_strdup(number));
+
+       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
+               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);
+       /* 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,
-- 
1.7.0.4

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

Reply via email to