All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Teach USSD to recognise password change strings.
@ 2009-06-18  4:04 Andrzej Zaborowski
  2009-06-18 22:02 ` Denis Kenzior
  0 siblings, 1 reply; 2+ messages in thread
From: Andrzej Zaborowski @ 2009-06-18  4:04 UTC (permalink / raw)
  To: ofono

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

This is slightly hacky, part of ussd.c responsible for registering services
is duplicated and parse_ss_control_string is modified to accept a fourth
SI fragment in the input string.
---
 src/common.c       |    3 +-
 src/common.h       |    2 +-
 src/modem.h        |    1 +
 src/ussd.c         |  144 +++++++++++++++++++++++++++++++++++++++++++++++++---
 src/ussd.h         |   10 ++++
 unit/test-common.c |   10 +++-
 6 files changed, 159 insertions(+), 11 deletions(-)

diff --git a/src/common.c b/src/common.c
index 8653432..a9166bf 100644
--- a/src/common.c
+++ b/src/common.c
@@ -465,7 +465,7 @@ const char *ss_control_type_to_string(enum ss_control_type type)
 gboolean parse_ss_control_string(char *str, int *ss_type,
 					char **sc, char **sia,
 					char **sib, char **sic,
-					char **dn)
+					char **sid, char **dn)
 {
 	int len = strlen(str);
 	int cur = 0;
@@ -533,6 +533,7 @@ gboolean parse_ss_control_string(char *str, int *ss_type,
 	NEXT_FIELD(c, *sia);
 	NEXT_FIELD(c, *sib);
 	NEXT_FIELD(c, *sic);
+	NEXT_FIELD(c, *sid);
 
 	if (*c == '\0')
 		ret = TRUE;
diff --git a/src/common.h b/src/common.h
index 1c0a776..0f7684e 100644
--- a/src/common.h
+++ b/src/common.h
@@ -192,7 +192,7 @@ gboolean valid_ussd_string(const char *str);
 gboolean parse_ss_control_string(char *str, int *ss_type,
 					char **sc, char **sia,
 					char **sib, char **sic,
-					char **dn);
+					char **sid, char **dn);
 
 const char *ss_control_type_to_string(enum ss_control_type type);
 
diff --git a/src/modem.h b/src/modem.h
index 22655f7..bbe7f99 100644
--- a/src/modem.h
+++ b/src/modem.h
@@ -28,6 +28,7 @@ struct ofono_modem {
 	void 		*userdata;
 
 	GSList *ss_control_list;
+	GSList *ss_passwd_list;
 
 	struct ofono_modem_data *modem_info;
 	struct network_registration_data *network_registration;
diff --git a/src/ussd.c b/src/ussd.c
index 7225398..d2251c8 100644
--- a/src/ussd.c
+++ b/src/ussd.c
@@ -165,22 +165,148 @@ void ss_control_unregister(struct ofono_modem *modem, const char *str,
 						l->data);
 }
 
+struct ss_passwd_entry {
+	char *service;
+	ss_passwd_cb_t cb;
+};
+
+static struct ss_passwd_entry *ss_passwd_entry_create(const char *service,
+							ss_passwd_cb_t cb)
+{
+	struct ss_passwd_entry *r;
+
+	r = g_try_new0(struct ss_passwd_entry, 1);
+
+	if (!r)
+		return r;
+
+	r->service = g_strdup(service);
+	r->cb = cb;
+
+	return r;
+}
+
+static void ss_passwd_entry_destroy(struct ss_passwd_entry *ca)
+{
+	g_free(ca->service);
+	g_free(ca);
+}
+
+static gint ss_passwd_entry_compare(gconstpointer a, gconstpointer b)
+{
+	const struct ss_passwd_entry *ca = a;
+	const struct ss_passwd_entry *cb = b;
+	int ret;
+
+	ret = strcmp(ca->service, cb->service);
+
+	if (ret)
+		return ret;
+
+	if (ca->cb < cb->cb)
+		return -1;
+
+	if (ca->cb > cb->cb)
+		return 1;
+
+	return 0;
+}
+
+static gint ss_passwd_entry_find_by_service(gconstpointer a, gconstpointer b)
+{
+	const struct ss_passwd_entry *ca = a;
+
+	return strcmp(ca->service, b);
+}
+
+gboolean ss_passwd_register(struct ofono_modem *modem, const char *str,
+				ss_passwd_cb_t cb)
+{
+	struct ss_passwd_entry *entry;
+
+	if (!modem)
+		return FALSE;
+
+	entry = ss_passwd_entry_create(str, cb);
+
+	if (!entry)
+		return FALSE;
+
+	modem->ss_passwd_list = g_slist_append(modem->ss_passwd_list, entry);
+
+	return TRUE;
+}
+
+void ss_passwd_unregister(struct ofono_modem *modem, const char *str,
+				ss_passwd_cb_t cb)
+{
+	const struct ss_passwd_entry entry = { (char *)str, cb };
+	GSList *l;
+
+	if (!modem)
+		return;
+
+	l = g_slist_find_custom(modem->ss_passwd_list, &entry,
+				ss_passwd_entry_compare);
+
+	if (!l)
+		return;
+
+	ss_passwd_entry_destroy(l->data);
+	modem->ss_passwd_list = g_slist_remove(modem->ss_passwd_list,
+						l->data);
+}
+
+static gboolean recognized_passwd_change_string(struct ofono_modem *modem,
+						int type, char *sc,
+						char *sia, char *sib,
+						char *sic, char *sid,
+						char *dn, DBusMessage *msg)
+{
+	GSList *l = modem->ss_passwd_list;
+
+	switch (type) {
+	case SS_CONTROL_TYPE_ACTIVATION:
+	case SS_CONTROL_TYPE_REGISTRATION:
+		break;
+
+	default:
+		return FALSE;
+	}
+
+	if (strcmp(sc, "03") || strlen(dn) || strcmp(sic, sid))
+		return FALSE;
+
+	while ((l = g_slist_find_custom(l, sia,
+			ss_passwd_entry_find_by_service)) != NULL) {
+		struct ss_passwd_entry *entry = l->data;
+
+		if (entry->cb(modem, sia, sib, sic, msg))
+			return TRUE;
+
+		l = l->next;
+	}
+
+	return FALSE;
+}
+
 static gboolean recognized_control_string(struct ofono_modem *modem,
 						const char *ss_str,
 						DBusMessage *msg)
 {
 	char *str = g_strdup(ss_str);
-	char *sc, *sia, *sib, *sic, *dn;
+	char *sc, *sia, *sib, *sic, *sid, *dn;
 	int type;
 	gboolean ret = FALSE;
 
 	ofono_debug("parsing control string");
 
-	if (parse_ss_control_string(str, &type, &sc, &sia, &sib, &sic, &dn)) {
+	if (parse_ss_control_string(str, &type, &sc,
+				&sia, &sib, &sic, &sid, &dn)) {
 		GSList *l = modem->ss_control_list;
 
-		ofono_debug("Got parse result: %d, %s, %s, %s, %s, %s",
-				type, sc, sia, sib, sic, dn);
+		ofono_debug("Got parse result: %d, %s, %s, %s, %s, %s, %s",
+				type, sc, sia, sib, sic, sid, dn);
 
 		while ((l = g_slist_find_custom(l, sc,
 				ss_control_entry_find_by_service)) != NULL) {
@@ -193,6 +319,13 @@ static gboolean recognized_control_string(struct ofono_modem *modem,
 
 			l = l->next;
 		}
+
+		/* A password change string needs to be treated separately
+		 * because it uses a fourth SI and is thus not a valid
+		 * control string.  */
+		if (recognized_passwd_change_string(modem, type, sc,
+					sia, sib, sic, sid, dn, msg))
+			goto out;
 	}
 
 	/* TODO: Handle all strings that control voice calls */
@@ -205,9 +338,6 @@ static gboolean recognized_control_string(struct ofono_modem *modem,
 	 * by SEND and are not valid USSD requests.
 	 */
 
-	/* TODO: Handle Password registration according to 22.030 Section 6.5.4
-	 */
-
 out:
 	g_free(str);
 
diff --git a/src/ussd.h b/src/ussd.h
index 5b956e5..5f40f61 100644
--- a/src/ussd.h
+++ b/src/ussd.h
@@ -26,8 +26,18 @@ typedef gboolean (*ss_control_cb_t)(struct ofono_modem *modem,
 					const char *sic, const char *dn,
 					DBusMessage *msg);
 
+typedef gboolean (*ss_passwd_cb_t)(struct ofono_modem *modem, const char *sc,
+					const char *old, const char *new,
+					DBusMessage *msg);
+
 gboolean ss_control_register(struct ofono_modem *modem, const char *str,
 				ss_control_cb_t cb);
 
 void ss_control_unregister(struct ofono_modem *modem, const char *str,
 				ss_control_cb_t cb);
+
+gboolean ss_passwd_register(struct ofono_modem *modem, const char *str,
+				ss_passwd_cb_t cb);
+
+void ss_passwd_unregister(struct ofono_modem *modem, const char *str,
+				ss_passwd_cb_t cb);
diff --git a/unit/test-common.c b/unit/test-common.c
index 5c753d3..96509bd 100644
--- a/unit/test-common.c
+++ b/unit/test-common.c
@@ -57,6 +57,7 @@ static void test_invalid()
 	char *sia;
 	char *sib;
 	char *sic;
+	char *sid;
 	char *dn;
 	int type;
 
@@ -71,7 +72,9 @@ static void test_invalid()
 		str = strdup(invalid_strings[i]);
 
 		ret = parse_ss_control_string(str, &type, &sc,
-						&sia, &sib, &sic, &dn);
+						&sia, &sib, &sic, &sid, &dn);
+		if (strlen(sid))
+			ret = FALSE;
 
 		g_assert(ret == FALSE);
 
@@ -105,6 +108,7 @@ static void test_valid()
 	char *sia;
 	char *sib;
 	char *sic;
+	char *sid;
 	char *dn;
 	int type;
 	gboolean ret;
@@ -119,7 +123,9 @@ static void test_valid()
 		str = strdup(valid_strings[i]);
 
 		ret = parse_ss_control_string(str, &type, &sc,
-						&sia, &sib, &sic, &dn);
+						&sia, &sib, &sic, &sid, &dn);
+		if (strlen(sid))
+			ret = FALSE;
 
 		g_assert(ret == TRUE);
 
-- 
1.6.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] Teach USSD to recognise password change strings.
  2009-06-18  4:04 [PATCH] Teach USSD to recognise password change strings Andrzej Zaborowski
@ 2009-06-18 22:02 ` Denis Kenzior
  0 siblings, 0 replies; 2+ messages in thread
From: Denis Kenzior @ 2009-06-18 22:02 UTC (permalink / raw)
  To: ofono

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

On Wednesday 17 June 2009 23:04:23 Andrzej Zaborowski wrote:
> This is slightly hacky, part of ussd.c responsible for registering services
> is duplicated and parse_ss_control_string is modified to accept a fourth
> SI fragment in the input string.

Patch has been applied, along with fixes to two minor logic flaws.

Regards,
-Denis

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2009-06-18 22:02 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-18  4:04 [PATCH] Teach USSD to recognise password change strings Andrzej Zaborowski
2009-06-18 22:02 ` Denis Kenzior

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.