From a4b7931815c7e1ee61280e21c408ef839db1f5eb Mon Sep 17 00:00:00 2001
From: Yaroslav Halchenko <debian@onerussian.com>
Date: Tue, 22 Jun 2010 14:52:19 -0400
Subject: [PATCH 2/2] ENH: adding filtering of phone # off illegal symbols before sending to gsm

---
 src/helpers.c             |   16 ++++++++++++++++
 src/helpers.h             |    2 ++
 src/phoneui-utils-calls.c |    5 ++++-
 3 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/src/helpers.c b/src/helpers.c
index 92d87e3..1dc4a1c 100644
--- a/src/helpers.c
+++ b/src/helpers.c
@@ -1,5 +1,6 @@
 
 #include <stdlib.h>
+#include <string.h>
 #include <glib.h>
 #include <glib-object.h>
 
@@ -49,3 +50,18 @@ _helpers_free_gvalue(gpointer val)
 	g_value_unset(value);
 	g_free(value);
 }
+
+void
+_helpers_strfilter(const char* s, const char *valid_chars, char** res)
+// remove occurrences of illegal symbols, return a new string
+{
+	if (!s) return;
+	*res = malloc(strlen(s)+1);
+	int k=0;						// index in res
+	while (s && *s) {
+		if (index(valid_chars, *s))
+			(*res)[k++] = *s;
+		s++;
+	}
+	(*res)[k] = 0;
+}
diff --git a/src/helpers.h b/src/helpers.h
index 945a506..115e2df 100644
--- a/src/helpers.h
+++ b/src/helpers.h
@@ -9,4 +9,6 @@ GValue *_helpers_new_gvalue_int(int value);
 GValue *_helpers_new_gvalue_boolean(gboolean value);
 void _helpers_free_gvalue(gpointer value);
 
+void _helpers_strfilter(const char* s, const char *valid_chars, char** res);
+
 #endif
diff --git a/src/phoneui-utils-calls.c b/src/phoneui-utils-calls.c
index 12e8a5a..1cf38b8 100644
--- a/src/phoneui-utils-calls.c
+++ b/src/phoneui-utils-calls.c
@@ -53,7 +53,9 @@ phoneui_utils_call_initiate(const char *number,
 			    gpointer userdata)
 {
 	struct _call_pack *pack;
+	char * number_ = NULL;		// Filtered phone #
 
+	_helpers_strfilter(number, "0123456789pP#*+wW", &number_);
 	g_message("Initiating a call to %s\n", number);
 	pack = malloc(sizeof(*pack));
 	pack->callback = callback;
@@ -61,8 +63,9 @@ phoneui_utils_call_initiate(const char *number,
 	pack->call = free_smartphone_gsm_get_call_proxy(_dbus(),
 					FSO_FRAMEWORK_GSM_ServiceDBusName,
 					FSO_FRAMEWORK_GSM_DeviceServicePath);
-	free_smartphone_gsm_call_initiate(pack->call, number, "voice",
+	free_smartphone_gsm_call_initiate(pack->call, number_, "voice",
 					  _call_initiate_callback, pack);
+	free(number_);
 	return 0;
 }
 
-- 
1.7.1

