* [PATCH 1/2] voicecall: add ofono_voicecall_en_list_notify api
2011-03-25 14:08 [PATCH 0/2] Add support for emergency number list from modem Jeevaka Badrappan
@ 2011-03-25 14:08 ` Jeevaka Badrappan
2011-03-25 17:44 ` Denis Kenzior
2011-03-25 14:08 ` [PATCH 2/2] ifxmodem: add support for emergency number list Jeevaka Badrappan
1 sibling, 1 reply; 4+ messages in thread
From: Jeevaka Badrappan @ 2011-03-25 14:08 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 1239 bytes --]
---
include/voicecall.h | 3 +++
src/voicecall.c | 12 ++++++++++++
2 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/include/voicecall.h b/include/voicecall.h
index f00eb08..3710646 100644
--- a/include/voicecall.h
+++ b/include/voicecall.h
@@ -140,6 +140,9 @@ struct ofono_voicecall_driver {
ofono_voicecall_cb_t cb, void *data);
};
+void ofono_voicecall_en_list_notify(struct ofono_voicecall *vc,
+ GSList *nw_en_list);
+
void ofono_voicecall_notify(struct ofono_voicecall *vc,
const struct ofono_call *call);
void ofono_voicecall_disconnected(struct ofono_voicecall *vc, int id,
diff --git a/src/voicecall.c b/src/voicecall.c
index d6e8539..74fe910 100644
--- a/src/voicecall.c
+++ b/src/voicecall.c
@@ -2150,6 +2150,18 @@ check:
set_new_ecc(vc);
}
+void ofono_voicecall_en_list_notify(struct ofono_voicecall *vc,
+ GSList *new_en_list)
+{
+ GSList *l;
+
+ for (l = new_en_list; l; l = l->next)
+ vc->new_en_list = g_slist_prepend(vc->new_en_list,
+ g_strdup(l->data));
+
+ set_new_ecc(vc);
+}
+
int ofono_voicecall_driver_register(const struct ofono_voicecall_driver *d)
{
DBG("driver: %p, name: %s", d, d->name);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH 2/2] ifxmodem: add support for emergency number list
2011-03-25 14:08 [PATCH 0/2] Add support for emergency number list from modem Jeevaka Badrappan
2011-03-25 14:08 ` [PATCH 1/2] voicecall: add ofono_voicecall_en_list_notify api Jeevaka Badrappan
@ 2011-03-25 14:08 ` Jeevaka Badrappan
1 sibling, 0 replies; 4+ messages in thread
From: Jeevaka Badrappan @ 2011-03-25 14:08 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 3862 bytes --]
---
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
^ permalink raw reply related [flat|nested] 4+ messages in thread