From 75715b95b442d861251e51b2c46cbda0f320617d Mon Sep 17 00:00:00 2001 From: Russell Bryant <russell@russellbryant.net> Date: Wed, 21 Mar 2018 15:54:48 -0400 Subject: [PATCH] app_originate: Add async option. Add an option to make app_originate not wait for the created channel to answer. Change-Id: I7fc2facd77079abc6321f44e8bcd4e39298de2ae Requested-by: Frederic Steinfels <fst@highdefinition.ch> Signed-off-by: Russell Bryant <russell@russellbryant.net> --- CHANGES | 7 +++++++ apps/app_originate.c | 12 ++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 09a7659d46..ac50a6dc9f 100644 --- a/CHANGES +++ b/CHANGES @@ -17,6 +17,13 @@ app_fax * The app_fax module is now deprecated, users should migrate to the replacement module res_fax. +app_originate +------------------ + * An 'a' option has been added to the Originate dialplan application which + will execute the originate in an asynchronous fashion. If set then the + application will return immediately without waiting for the originated + channel to answer. + Build System ------------------ * MALLOC_DEBUG no longer has an effect on Asterisk's ABI. Asterisk built diff --git a/apps/app_originate.c b/apps/app_originate.c index 30fa565bea..107be846da 100644 --- a/apps/app_originate.c +++ b/apps/app_originate.c @@ -74,6 +74,10 @@ static const char app_originate[] = "Originate"; </parameter> <parameter name="options" required="false"> <optionlist> + <option name="a"> + <para>Originate asynchronously. In other words, continue in the dialplan + without waiting for the originated channel to answer.</para> + </option> <option name="b" argsep="^"> <para>Before originating the outgoing call, Gosub to the specified location using the newly created channel.</para> @@ -123,6 +127,7 @@ static const char app_originate[] = "Originate"; enum { OPT_PREDIAL_CALLEE = (1 << 0), OPT_PREDIAL_CALLER = (1 << 1), + OPT_ASYNC = (1 << 2), }; enum { @@ -133,6 +138,7 @@ enum { }; AST_APP_OPTIONS(originate_exec_options, BEGIN_OPTIONS + AST_APP_OPTION('a', OPT_ASYNC), AST_APP_OPTION_ARG('b', OPT_PREDIAL_CALLEE, OPT_ARG_PREDIAL_CALLEE), AST_APP_OPTION_ARG('B', OPT_PREDIAL_CALLER, OPT_ARG_PREDIAL_CALLER), END_OPTIONS ); @@ -250,7 +256,8 @@ static int originate_exec(struct ast_channel *chan, const char *data) res = ast_pbx_outgoing_exten_predial(chantech, cap_slin, chandata, timeout * 1000, args.arg1, exten, priority, &outgoing_status, - AST_OUTGOING_WAIT, NULL, NULL, NULL, NULL, NULL, 0, NULL, + ast_test_flag64(&opts, OPT_ASYNC) ? AST_OUTGOING_NO_WAIT : AST_OUTGOING_WAIT, + NULL, NULL, NULL, NULL, NULL, 0, NULL, predial_callee); } else { ast_debug(1, "Originating call to '%s/%s' and connecting them to %s(%s)\n", @@ -258,7 +265,8 @@ static int originate_exec(struct ast_channel *chan, const char *data) res = ast_pbx_outgoing_app_predial(chantech, cap_slin, chandata, timeout * 1000, args.arg1, args.arg2, &outgoing_status, - AST_OUTGOING_WAIT, NULL, NULL, NULL, NULL, NULL, NULL, + ast_test_flag64(&opts, OPT_ASYNC) ? AST_OUTGOING_NO_WAIT : AST_OUTGOING_WAIT, + NULL, NULL, NULL, NULL, NULL, NULL, predial_callee); } -- GitLab