From: Pekka Pessi <[email protected]>
The valid_ussd_string() returns true if MMI input is to be sent as USSD.
---
src/common.c | 39 ++++++++++++++-------------------------
src/common.h | 2 +-
src/ussd.c | 2 +-
3 files changed, 16 insertions(+), 27 deletions(-)
diff --git a/src/common.c b/src/common.c
index 55c4b40..e0a8387 100644
--- a/src/common.c
+++ b/src/common.c
@@ -393,7 +393,7 @@ void string_to_phone_number(const char *str, struct
ofono_phone_number *ph)
}
}
-int valid_ussd_string(const char *str)
+gboolean valid_ussd_string(const char *str, gboolean call_in_progress)
{
int len = strlen(str);
@@ -401,37 +401,26 @@ int valid_ussd_string(const char *str)
return FALSE;
/*
- * It is hard to understand exactly what constitutes a valid USSD string
- * According to 22.090:
- * Case a - 1, 2 or 3 digits from the set (*, #) followed by 1X(Y),
- * where X=any number 0â4, Y=any number 0â9, then, optionally "*
- * followed by any number of any characters", and concluding with #SEND
- *
- * Case b - 1, 2 or 3 digits from the set (*, #) followed by 1X(Y),
- * where X=any number 5â9, Y=any number 0â9, then, optionally "*
- * followed by any number of any characters", and concluding with #SEND
- *
- * Case c - 7(Y) SEND, where Y=any number 0â9
- *
- * Case d - All other formats
- *
* According to 22.030 Figure 3.5.3.2 USSD strings can be:
*
- * Supplementary service control
- * SIM control
- * Manufacturer defined
- * Terminated by '#'
- * Short String - This can be any 2 digit short string. If the string
- * starts with a '1' and no calls are in progress then
- * this string is treated as a call setup request
+ * 1) Terminated by '#'
+ * 2) A short string of 1 or 2 digits.
*
- * Everything else is not a valid USSD string
+ * If a 2 digit string starts with a '1' and no calls are in
+ * progress then this string is treated as a call setup request
+ * instead.
*/
- if (len != 2 && str[len-1] != '#')
+ if (str[len-1] == '#')
+ return TRUE;
+
+ if (!call_in_progress && len == 2 && str[0] != '1')
return FALSE;
- return TRUE;
+ if (len <= 2)
+ return TRUE;
+
+ return FALSE;
}
const char *ss_control_type_to_string(enum ss_control_type type)
diff --git a/src/common.h b/src/common.h
index c43e46d..8b5798a 100644
--- a/src/common.h
+++ b/src/common.h
@@ -130,7 +130,7 @@ void string_to_phone_number(const char *str, struct
ofono_phone_number *ph);
int mmi_service_code_to_bearer_class(int code);
-gboolean valid_ussd_string(const char *str);
+gboolean valid_ussd_string(const char *str, gboolean call_in_progress);
gboolean parse_ss_control_string(char *str, int *ss_type,
char **sc, char **sia,
diff --git a/src/ussd.c b/src/ussd.c
index aad7d32..24950ac 100644
--- a/src/ussd.c
+++ b/src/ussd.c
@@ -565,7 +565,7 @@ static DBusMessage *ussd_initiate(DBusConnection *conn,
DBusMessage *msg,
return NULL;
DBG("No.., checking if this is a USSD string");
- if (!valid_ussd_string(str))
+ if (!valid_ussd_string(str, ussd->call_in_progress))
return __ofono_error_invalid_format(msg);
if (!ussd_encode(str, &num_packed, buf))
--
1.7.0.4
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono