From f4cfc00ddaafedf246c288bae1736e43d2382326 Mon Sep 17 00:00:00 2001 From: markster Date: Wed, 29 Dec 2004 13:06:53 +0000 Subject: Merge anthm's app_read addition, somewhat modified (bug #3013) git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4587 f38db490-d61c-443f-a65b-d21fe96a405b --- apps/app_read.c | 108 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 31 deletions(-) (limited to 'apps/app_read.c') diff --git a/apps/app_read.c b/apps/app_read.c index e91513845..e8bd66272 100755 --- a/apps/app_read.c +++ b/apps/app_read.c @@ -31,9 +31,9 @@ static char *app = "Read"; static char *synopsis = "Read a variable"; static char *descrip = -" Read(variable[|filename][|maxdigits][|option])\n\n" -"Reads a #-terminated string of digits from the user in to the given variable,\n" -"optionally playing a given filename first.\n" +" Read(variable[|filename][|maxdigits][|option][|attempts][|timeout])\n\n" +"Reads a #-terminated string of digits a certian number of times from the\n" +"user in to the given variable, optionally playing a given filename first.\n" " maxdigits -- maximum acceptable number of digits. Stops reading after\n" " maxdigits have been entered (without requiring the user to\n" " press the '#' key).\n" @@ -41,40 +41,75 @@ static char *descrip = " Any value below 0 means the same. Max accepted value is 255.\n" " option -- may be 'skip' to return immediately if the line is not up,\n" " or 'noanswer' to read digits even if the line is not up.\n\n" +"If attempts is greater than 1, that many attempts will be made in the event no data is entered.\n" +"If timeout is greater than 0, that value will override the default timeout.\n\n" "Returns -1 on hangup or error and 0 otherwise.\n"; STANDARD_LOCAL_USER; LOCAL_USER_DECL; +#define ast_next_data(instr,ptr,delim) if((ptr=strchr(instr,delim))) { *(ptr) = '\0' ; ptr++;} + static int read_exec(struct ast_channel *chan, void *data) { int res = 0; struct localuser *u; char tmp[256]; - char argdata[256] = ""; - char *varname; - char *filename; - char *stringp; - char *maxdigitstr; - char *options; + char *timeout = NULL; + char *varname = NULL; + char *filename = NULL; + char *loops; + char *maxdigitstr=NULL; + char *options=NULL; int option_skip = 0; int option_noanswer = 0; int maxdigits=255; - if (!data || ast_strlen_zero((char *)data)) { - ast_log(LOG_WARNING, "Read requires an argument (variable)\n"); + int tries = 1; + int to = 0; + int defined = 0, x = 0; + char *argcopy; + char *args[8]; + + if (data) + argcopy = ast_strdupa((char *)data); + + if (ast_seperate_app_args(argcopy, '|', args, sizeof(args) / sizeof(args[0])) < 1) { + ast_log(LOG_WARNING, "Cannot Parse Arguements.\n"); return -1; } - strncpy(argdata, (char *)data, sizeof(argdata)-1); - stringp=argdata; - varname = strsep(&stringp, "|"); - filename = strsep(&stringp, "|"); - maxdigitstr = strsep(&stringp,"|"); - options = strsep(&stringp, "|"); - if (options && !strcasecmp(options, "skip")) - option_skip = 1; - if (options && !strcasecmp(options, "noanswer")) - option_noanswer = 1; + + varname = args[x++]; + filename = args[x++]; + maxdigitstr = args[x++]; + options = args[x++]; + loops = args[x++]; + + if (options) { + if (!strcasecmp(options, "skip")) + option_skip = 1; + else if (!strcasecmp(options, "noanswer")) + option_noanswer = 1; + else { + if (strchr(options, 's')) + option_skip = 1; + if (strchr(options, 'n')) + option_noanswer = 1; + } + } + + if(loops) { + tries = atoi(loops); + if(tries <= 0) + tries = 1; + } + + if(timeout) { + to = atoi(timeout); + if(to <= 0) + to = 0; + } + if (!(filename) || ast_strlen_zero(filename)) filename = NULL; if (maxdigitstr) { @@ -82,8 +117,8 @@ static int read_exec(struct ast_channel *chan, void *data) if ((maxdigits<1) || (maxdigits>255)) { maxdigits = 255; } else - ast_verbose(VERBOSE_PREFIX_3 "Accepting a maximum of %i digits.\n", maxdigits); - } + ast_verbose(VERBOSE_PREFIX_3 "Accepting a maximum of %i digits.\n", maxdigits); + } if (!(varname) || ast_strlen_zero(varname)) { ast_log(LOG_WARNING, "Read requires an variable name\n"); return -1; @@ -101,14 +136,25 @@ static int read_exec(struct ast_channel *chan, void *data) } } if (!res) { - ast_stopstream(chan); - res = ast_app_getdata(chan, filename, tmp, maxdigits, 0); - if (res > -1) { - pbx_builtin_setvar_helper(chan, varname, tmp); - ast_verbose(VERBOSE_PREFIX_3 "User entered '%s'\n", tmp); - res = 0; - } else { - ast_verbose(VERBOSE_PREFIX_3 "User disconnected\n"); + while(tries && !res) { + ast_stopstream(chan); + res = ast_app_getdata(chan, filename, tmp, maxdigits, 0); + if (res > -1) { + pbx_builtin_setvar_helper(chan, varname, tmp); + if (!ast_strlen_zero(tmp)) { + ast_verbose(VERBOSE_PREFIX_3 "User entered '%s'\n", tmp); + tries = 0; + } else { + tries--; + if (tries) + ast_verbose(VERBOSE_PREFIX_3 "User entered nothing, %d chance(s) left\n", tries); + else + ast_verbose(VERBOSE_PREFIX_3 "User entered nothing.\n"); + } + res = 0; + } else { + ast_verbose(VERBOSE_PREFIX_3 "User disconnected\n"); + } } } LOCAL_USER_REMOVE(u); -- cgit v1.2.3