diff --git a/apps/app_read.c b/apps/app_read.c index f4a965c8b46d36b64772a2803f4e677467b20d44..e2ac60cc96a1ef33511309b688df275a609ae980 100644 --- a/apps/app_read.c +++ b/apps/app_read.c @@ -85,6 +85,13 @@ and you will need to rely on duration and max digits for ending input.</para> </option> + <option name="e"> + <para>to read the terminator as the digit string if the + only digit read is the terminator. This is for cases + where the terminator is a valid digit, but only by itself. + ie; <literal>1234</literal> and <literal>#</literal> are + valid, but <literal>1234#</literal> is not.</para> + </option> </optionlist> </parameter> <parameter name="attempts"> @@ -125,6 +132,7 @@ enum read_option_flags { OPT_INDICATION = (1 << 1), OPT_NOANSWER = (1 << 2), OPT_TERMINATOR = (1 << 3), + OPT_KEEP_TERMINATOR = (1 << 4), }; enum { @@ -138,6 +146,7 @@ AST_APP_OPTIONS(read_app_options, { AST_APP_OPTION('i', OPT_INDICATION), AST_APP_OPTION('n', OPT_NOANSWER), AST_APP_OPTION_ARG('t', OPT_TERMINATOR, OPT_ARG_TERMINATOR), + AST_APP_OPTION('e', OPT_KEEP_TERMINATOR), }); static char *app = "Read"; @@ -261,12 +270,20 @@ static int read_exec(struct ast_channel *chan, const char *data) } } else { res = ast_app_getdata_terminator(chan, arglist.filename, tmp, maxdigits, to, terminator); - if (res == AST_GETDATA_COMPLETE || res == AST_GETDATA_EMPTY_END_TERMINATED) + if (res == AST_GETDATA_COMPLETE) { + status = "OK"; + } else if (res == AST_GETDATA_EMPTY_END_TERMINATED) { + if (ast_test_flag(&flags, OPT_KEEP_TERMINATOR)) { + /* if the option is set to do so, read the + returned string as the terminator string */ + ast_copy_string(tmp, terminator, sizeof(tmp)); + } status = "OK"; - else if (res == AST_GETDATA_TIMEOUT) + } else if (res == AST_GETDATA_TIMEOUT) { status = "TIMEOUT"; - else if (res == AST_GETDATA_INTERRUPTED) + } else if (res == AST_GETDATA_INTERRUPTED) { status = "INTERRUPTED"; + } } if (res > -1) { pbx_builtin_setvar_helper(chan, arglist.variable, tmp); diff --git a/doc/CHANGES-staging/app_read_return_terminator.txt b/doc/CHANGES-staging/app_read_return_terminator.txt new file mode 100644 index 0000000000000000000000000000000000000000..2987f77ea7ca0ae7f19b18449deac4d6be480507 --- /dev/null +++ b/doc/CHANGES-staging/app_read_return_terminator.txt @@ -0,0 +1,5 @@ +Subject: app_read + +A new option 'e' has been added to allow Read() to return the +terminator as the dialed digits in the case where only the terminator +is entered.