diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-11-21 18:38:18 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-11-21 18:38:18 +0000 |
commit | 21981c69ae3f2bb4f513c9b453ab96254a4e92d1 (patch) | |
tree | 8632447d3463937a4165357273a4fb730c76f1c9 /apps | |
parent | ef4c533d634b2c476534830bf5ab3b66dc5a0dca (diff) |
Change Read to set READSTATUS as an indication of the result
Also, some cleanup to CHANGES.
Reported by: michael-fig
Patch by: michael-fig,tilghman
(Closes issue #11004)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@89489 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_read.c | 66 |
1 files changed, 40 insertions, 26 deletions
diff --git a/apps/app_read.c b/apps/app_read.c index 81eb95ba9..c6a7e45df 100644 --- a/apps/app_read.c +++ b/apps/app_read.c @@ -73,8 +73,11 @@ static char *descrip = " attempts -- if greater than 1, that many attempts will be made in the \n" " event no data is entered.\n" " timeout -- The number of seconds to wait for a digit response. If greater\n" -" than 0, that value will override the default timeout. Can be floating point.\n\n" -"Read should disconnect if the function fails or errors out.\n"; +" than 0, that value will override the default timeout. Can be floating point.\n" +"This application sets the following channel variable upon completion:\n" +" READSTATUS - This is the status of the read operation.\n" +" Possible values are:\n" +" OK | ERROR | HANGUP | INTERRUPTED | SKIPPED | TIMEOUT\n"; #define ast_next_data(instr,ptr,delim) if((ptr=strchr(instr,delim))) { *(ptr) = '\0' ; ptr++;} @@ -87,10 +90,11 @@ static int read_exec(struct ast_channel *chan, void *data) int tries = 1, to = 0, x = 0; double tosec; char *argcopy = NULL; - struct ind_tone_zone_sound *ts; + struct ind_tone_zone_sound *ts = NULL; struct ast_flags flags = {0}; + const char *status = "ERROR"; - AST_DECLARE_APP_ARGS(arglist, + AST_DECLARE_APP_ARGS(arglist, AST_APP_ARG(variable); AST_APP_ARG(filename); AST_APP_ARG(maxdigits); @@ -99,9 +103,10 @@ static int read_exec(struct ast_channel *chan, void *data) AST_APP_ARG(timeout); ); + pbx_builtin_setvar_helper(chan, "READSTATUS", status); if (ast_strlen_zero(data)) { ast_log(LOG_WARNING, "Read requires an argument (variable)\n"); - return -1; + return 0; } argcopy = ast_strdupa(data); @@ -122,14 +127,8 @@ static int read_exec(struct ast_channel *chan, void *data) tosec = atof(arglist.timeout); if (tosec <= 0) to = 0; - else { + else to = tosec * 1000.0; - if (to <= 0) { - /* Make sure we don't use the default timeout. */ - ast_log(LOG_WARNING, "Read timeout less than 1 ms, assuming 1 ms timeout\n"); - to = 1; - } - } } if (ast_strlen_zero(arglist.filename)) { @@ -137,27 +136,27 @@ static int read_exec(struct ast_channel *chan, void *data) } if (!ast_strlen_zero(arglist.maxdigits)) { maxdigits = atoi(arglist.maxdigits); - if ((maxdigits<1) || (maxdigits>255)) { - maxdigits = 255; + if ((maxdigits < 1) || (maxdigits > 255)) { + maxdigits = 255; } else ast_verb(3, "Accepting a maximum of %d digits.\n", maxdigits); } if (ast_strlen_zero(arglist.variable)) { ast_log(LOG_WARNING, "Invalid! Usage: Read(variable[,filename][,maxdigits][,option][,attempts][,timeout])\n\n"); - return -1; + return 0; } - ts=NULL; - if (ast_test_flag(&flags,OPT_INDICATION)) { - if (!ast_strlen_zero(arglist.filename)) { - ts = ast_get_indication_tone(chan->zone,arglist.filename); + if (ast_test_flag(&flags, OPT_INDICATION)) { + if (! ast_strlen_zero(arglist.filename)) { + ts = ast_get_indication_tone(chan->zone, arglist.filename); } } if (chan->_state != AST_STATE_UP) { - if (ast_test_flag(&flags,OPT_SKIP)) { + if (ast_test_flag(&flags, OPT_SKIP)) { /* At the user's option, skip if the line is not up */ - pbx_builtin_setvar_helper(chan, arglist.variable, "\0"); + pbx_builtin_setvar_helper(chan, arglist.variable, ""); + pbx_builtin_setvar_helper(chan, "READSTATUS", "SKIPPED"); return 0; - } else if (!ast_test_flag(&flags,OPT_NOANSWER)) { + } else if (!ast_test_flag(&flags, OPT_NOANSWER)) { /* Otherwise answer unless we're supposed to read while on-hook */ res = ast_answer(chan); } @@ -173,17 +172,29 @@ static int read_exec(struct ast_channel *chan, void *data) res = ast_waitfordigit(chan, to); ast_playtones_stop(chan); if (res < 1) { + if (res == 0) + status = "TIMEOUT"; tmp[x]='\0'; break; } tmp[x++] = res; if (tmp[x-1] == '#') { tmp[x-1] = '\0'; + status = "OK"; break; } + if (x >= maxdigits) { + status = "OK"; + } } } else { res = ast_app_getdata(chan, arglist.filename, tmp, maxdigits, to); + if (res == 0) + status = "OK"; + else if (res == 1) + status = "TIMEOUT"; + else if (res == 2) + status = "INTERRUPTED"; } if (res > -1) { pbx_builtin_setvar_helper(chan, arglist.variable, tmp); @@ -192,11 +203,11 @@ static int read_exec(struct ast_channel *chan, void *data) tries = 0; } else { tries--; - if (tries) + if (tries) ast_verb(3, "User entered nothing, %d chance%s left\n", tries, (tries != 1) ? "s" : ""); - else + else ast_verb(3, "User entered nothing.\n"); - } + } res = 0; } else { pbx_builtin_setvar_helper(chan, arglist.variable, tmp); @@ -205,7 +216,10 @@ static int read_exec(struct ast_channel *chan, void *data) } } - return res; + if (ast_check_hangup(chan)) + status = "HANGUP"; + pbx_builtin_setvar_helper(chan, "READSTATUS", status); + return 0; } static int unload_module(void) |