common: fixup logic of valid_ussd_string()

The logic of valid_ussd_string was not quite correct as it didn't take
care of size 1 USSD strings.  In addition, call_in_progress parameter is
passed in to take care of size 2 USSD strings which might start with a
'1' according to the rules of 22.030.

The comment about USSD routing is removed, it is out of scope of oFono.
The cellular network routes the USSD requests based on the rules laid
out in the 22.090, however, any string that can be encoded according to
the rules of 23.030 is valid USSD.
This commit is contained in:
Pekka Pessi 2010-10-06 17:52:16 +03:00 committed by Denis Kenzior
parent 10299facac
commit 919e305aa1
3 changed files with 21 additions and 27 deletions

View File

@ -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 04, Y=any number 09, 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 59, Y=any number 09, 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 09
* 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)

View File

@ -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,

View File

@ -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, FALSE))
return __ofono_error_invalid_format(msg);
if (!ussd_encode(str, &num_packed, buf))