RE: [PATCH] ifxmodem: emergency number list support

2011-07-20 Thread jeevaka . badrappan
Hi,

> Hi Jeevaka,
>
> I'm Nicolas Paccou, I'm in charge of validating the changes applied in new
> oFono release.
> Unfortunately, I have not the hardware to be able to regress your patch:
> "Add support for handling IFX emergency number list"
>
> I wanted to know if you have tested your patch on IFX modem ?
> If yes, can you tell me if the result is ok ?
> If not, do you able to test it and tell me the result please ?

Yep, this has been tested with the IFX modem FW which supports XLEMA.

Regards,
Jeevaka
___
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono


RE: [PATCH] ifxmodem: emergency number list support

2011-07-20 Thread Paccou, Nicolas
Hi Jeevaka,

I'm Nicolas Paccou, I'm in charge of validating the changes applied in new 
oFono release.
Unfortunately, I have not the hardware to be able to regress your patch: "Add 
support for handling IFX emergency number list"

I wanted to know if you have tested your patch on IFX modem ?
If yes, can you tell me if the result is ok ?
If not, do you able to test it and tell me the result please ?

Thanks,
Nicolas

-Original Message-
From: ofono-boun...@ofono.org [mailto:ofono-boun...@ofono.org] On Behalf Of 
Jeevaka Badrappan
Sent: Wednesday, June 08, 2011 5:45 PM
To: ofono@ofono.org
Subject: [PATCH] ifxmodem: emergency number list support

---
 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,
+  

Re: [PATCH] ifxmodem: emergency number list support

2011-06-09 Thread jeevaka . badrappan
Hi Denis,

>> +
>> +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 */
>
> What is this comment referring to?

Following fields like category, valid in sim present state and mcc are
skipped as we are not going to use it. Just for information purpose.
I'll remove the comment.

>
>> +
>> +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);
>
> What are you trying to achieve here?  Since you're not checking the
> result, it doesn't look like this code serves any purpose.

Agreed no pointing in having this as we are not going to make use of the
fields. Will be removed.

Regards,
Jeevaka
___
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono


[PATCH] ifxmodem: emergency number list support

2011-06-08 Thread Jeevaka Badrappan
---
 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

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