summaryrefslogtreecommitdiffstats
path: root/src/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common.c')
-rw-r--r--src/common.c44
1 files changed, 19 insertions, 25 deletions
diff --git a/src/common.c b/src/common.c
index bcd42f63..91892bb1 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,31 @@ 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
+ * Return true if an MMI input string is to be sent as USSD.
*
- * 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
+ * According to 3GPP TS 22.030, after checking the well-known
+ * supplementary service control, SIM control and manufacturer
+ * defined control codes, the terminal should check if the input
+ * should be sent as USSD according to the following rules:
*
- * Case c - 7(Y) SEND, where Y=any number 0‑9
+ * 1) Terminated by '#'
+ * 2) A short string of 1 or 2 digits
*
- * 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
- *
- * Everything else is not a valid USSD string
+ * As an exception, if a 2 digit string starts with a '1' and
+ * there are no calls 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)