All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ifxmodem: emergency number list support
@ 2011-06-08 15:44 Jeevaka Badrappan
  2011-06-06 23:04 ` Denis Kenzior
  2011-07-20 13:23 ` Paccou, Nicolas
  0 siblings, 2 replies; 5+ messages in thread
From: Jeevaka Badrappan @ 2011-06-08 15:44 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 3825 bytes --]

---
 drivers/ifxmodem/voicecall.c |   95 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 95 insertions(+), 0 deletions(-)

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);
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread
[parent not found: <8250E4885F9967469CAC3FB5CBA2CE69946ABFF9C4@irsmsx501.ger.corp.intel.c om>]

end of thread, other threads:[~2011-07-20 13:43 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-08 15:44 [PATCH] ifxmodem: emergency number list support Jeevaka Badrappan
2011-06-06 23:04 ` Denis Kenzior
2011-06-09 13:44   ` jeevaka.badrappan
2011-07-20 13:23 ` Paccou, Nicolas
     [not found] <8250E4885F9967469CAC3FB5CBA2CE69946ABFF9C4@irsmsx501.ger.corp.intel.c om>
2011-07-20 13:43 ` jeevaka.badrappan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.