Hi Caiwen, On 08/16/2011 02:39 AM, Caiwen Zhang wrote: > Check whether air interface flash is valid: > > 1. Air interface flash should be sent during a call > > 2. flash string may include feature code, digits (0-9) and end marks(*, #), > along with any additional PIN information, called party number, etc. > Generally, should be characters can be input in dialer. > > 3. flash without a string is allowed, it is used to switch call status. > > --- > src/cdma-voicecall.c | 30 ++++++++++++++++++++++++++++++ > 1 files changed, 30 insertions(+), 0 deletions(-) > > diff --git a/src/cdma-voicecall.c b/src/cdma-voicecall.c > index bbf805f..8de94c7 100644 > --- a/src/cdma-voicecall.c > +++ b/src/cdma-voicecall.c > @@ -307,6 +307,30 @@ static DBusMessage *voicecall_manager_answer(DBusConnection *conn, > return NULL; > } > > +static ofono_bool_t is_valid_flash_string(const char *str) > +{ > + int len; > + int i; > + > + /* flash string is empty, it is allowed */ > + if (str == NULL) > + return TRUE; NULL strings are not valid here, they can't be sent over D-Bus. Please omit this check. > + > + len = strlen(str); > + if (len == 0) > + return TRUE; > + Please write this as: int len = strlen(str); int i; if (len == 0) return TRUE ... > + for (i = 0; i < len; i++) { > + if (g_ascii_isdigit(str[i]) || str[i] == '*' || > + str[i] == '#' || str[i] == '+') > + continue; > + else > + return FALSE; > + } > + > + return TRUE; > +} > + > static DBusMessage *voicecall_manager_flash(DBusConnection *conn, > DBusMessage *msg, void *data) > { > @@ -319,10 +343,16 @@ static DBusMessage *voicecall_manager_flash(DBusConnection *conn, > if (vc->driver->send_flash == NULL) > return __ofono_error_not_implemented(msg); > > + if (vc->status == CDMA_CALL_STATUS_DISCONNECTED) > + return __ofono_error_failed(msg); > + Just to double check, can a flash be sent during dialing/alerting/incoming stage? > if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &string, > DBUS_TYPE_INVALID) == FALSE) > return __ofono_error_invalid_args(msg); > > + if (is_valid_flash_string(string) == FALSE) > + return __ofono_error_invalid_args(msg); > + > vc->pending = dbus_message_ref(msg); > > vc->driver->send_flash(vc, string, generic_callback, vc); Regards, -Denis