use arg parsing macros for WaitExten and Background (issue #6185)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@8687 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Russell Bryant 20 years ago
parent c1a2631101
commit 99872975bf

99
pbx.c

@ -5268,33 +5268,31 @@ static int pbx_builtin_wait(struct ast_channel *chan, void *data)
*/ */
static int pbx_builtin_waitexten(struct ast_channel *chan, void *data) static int pbx_builtin_waitexten(struct ast_channel *chan, void *data)
{ {
int ms, res, argc; int ms, res;
char *args;
char *argv[2];
char *options = NULL;
char *timeout = NULL;
struct ast_flags flags = {0}; struct ast_flags flags = {0};
char *opts[1] = { NULL }; char *opts[1] = { NULL };
char *parse;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(timeout);
AST_APP_ARG(options);
);
args = ast_strdupa(data); if (!ast_strlen_zero(data)) {
if (!(parse = ast_strdupa(data)))
if ((argc = ast_app_separate_args(args, '|', argv, sizeof(argv) / sizeof(argv[0])))) { return -1;
if (argc > 0) { AST_STANDARD_APP_ARGS(args, parse);
timeout = argv[0]; } else
if (argc > 1) memset(&args, 0, sizeof(args));
options = argv[1];
}
}
if (options) if (args.options)
ast_app_parse_options(waitexten_opts, &flags, opts, options); ast_app_parse_options(waitexten_opts, &flags, opts, args.options);
if (ast_test_flag(&flags, WAITEXTEN_MOH)) if (ast_test_flag(&flags, WAITEXTEN_MOH))
ast_moh_start(chan, opts[0]); ast_moh_start(chan, opts[0]);
/* Wait for "n" seconds */ /* Wait for "n" seconds */
if (timeout && atof((char *)timeout)) if (args.timeout && atof((char *)args.timeout))
ms = atof((char *)timeout) * 1000; ms = atof((char *)args.timeout) * 1000;
else if (chan->pbx) else if (chan->pbx)
ms = chan->pbx->rtimeout * 1000; ms = chan->pbx->rtimeout * 1000;
else else
@ -5327,48 +5325,37 @@ static int pbx_builtin_waitexten(struct ast_channel *chan, void *data)
static int pbx_builtin_background(struct ast_channel *chan, void *data) static int pbx_builtin_background(struct ast_channel *chan, void *data)
{ {
int res = 0; int res = 0;
int argc;
char *parse;
char *argv[4];
char *options = NULL;
char *filename = NULL;
char *front = NULL, *back = NULL; char *front = NULL, *back = NULL;
char *lang = NULL;
char *context = NULL;
struct ast_flags flags = {0}; struct ast_flags flags = {0};
char *parse;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(filename);
AST_APP_ARG(options);
AST_APP_ARG(lang);
AST_APP_ARG(context);
);
parse = ast_strdupa(data); if (ast_strlen_zero(data))
ast_log(LOG_WARNING, "Background requires an argument (filename)\n");
if ((argc = ast_app_separate_args(parse, '|', argv, sizeof(argv) / sizeof(argv[0])))) {
switch (argc) {
case 4:
context = argv[3];
case 3:
lang = argv[2];
case 2:
options = argv[1];
case 1:
filename = argv[0];
break;
default:
ast_log(LOG_WARNING, "Background requires an argument (filename)\n");
break;
}
}
if (!lang) if (!(parse = ast_strdupa(data)))
lang = chan->language; return -1;
if (!context) AST_STANDARD_APP_ARGS(args, parse);
context = chan->context;
if (options) { if (!args.lang)
if (!strcasecmp(options, "skip")) args.lang = chan->language;
if (!args.context)
args.context = chan->context;
if (args.options) {
if (!strcasecmp(args.options, "skip"))
flags.flags = BACKGROUND_SKIP; flags.flags = BACKGROUND_SKIP;
else if (!strcasecmp(options, "noanswer")) else if (!strcasecmp(args.options, "noanswer"))
flags.flags = BACKGROUND_NOANSWER; flags.flags = BACKGROUND_NOANSWER;
else else
ast_app_parse_options(background_opts, &flags, NULL, options); ast_app_parse_options(background_opts, &flags, NULL, args.options);
} }
/* Answer if need be */ /* Answer if need be */
@ -5384,19 +5371,19 @@ static int pbx_builtin_background(struct ast_channel *chan, void *data)
/* Stop anything playing */ /* Stop anything playing */
ast_stopstream(chan); ast_stopstream(chan);
/* Stream a file */ /* Stream a file */
front = filename; front = args.filename;
while(!res && front) { while(!res && front) {
if((back = strchr(front, '&'))) { if((back = strchr(front, '&'))) {
*back = '\0'; *back = '\0';
back++; back++;
} }
res = ast_streamfile(chan, front, lang); res = ast_streamfile(chan, front, args.lang);
if (!res) { if (!res) {
if (ast_test_flag(&flags, BACKGROUND_PLAYBACK)) { if (ast_test_flag(&flags, BACKGROUND_PLAYBACK)) {
res = ast_waitstream(chan, ""); res = ast_waitstream(chan, "");
} else { } else {
if (ast_test_flag(&flags, BACKGROUND_MATCHEXTEN)) { if (ast_test_flag(&flags, BACKGROUND_MATCHEXTEN)) {
res = ast_waitstream_exten(chan, context); res = ast_waitstream_exten(chan, args.context);
} else { } else {
res = ast_waitstream(chan, AST_DIGIT_ANY); res = ast_waitstream(chan, AST_DIGIT_ANY);
} }
@ -5410,9 +5397,9 @@ static int pbx_builtin_background(struct ast_channel *chan, void *data)
front = back; front = back;
} }
} }
if (context != chan->context && res) { if (args.context != chan->context && res) {
snprintf(chan->exten, sizeof(chan->exten), "%c", res); snprintf(chan->exten, sizeof(chan->exten), "%c", res);
ast_copy_string(chan->context, context, sizeof(chan->context)); ast_copy_string(chan->context, args.context, sizeof(chan->context));
chan->priority = 0; chan->priority = 0;
return 0; return 0;
} else { } else {

Loading…
Cancel
Save