#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 {
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)
{
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);
}
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);