summaryrefslogtreecommitdiff
path: root/apps/app_dial.c
diff options
context:
space:
mode:
authorMatthew Nicholson <mnicholson@digium.com>2009-11-04 21:39:33 +0000
committerMatthew Nicholson <mnicholson@digium.com>2009-11-04 21:39:33 +0000
commit317435a93200520218c4e9f4bbb8c0258f363876 (patch)
tree6610ca9e7f01a782eab19d12f5cdfb037b993ad3 /apps/app_dial.c
parented2ed2717a6e59ac93653fd6a6b942aef69c369d (diff)
Added the 'a' option to app dial and modified app_dial to set the answertime when the called channel answers.
This change causes answertime to be correct even if the called channel hangs up during an announcement triggered by the A() option. (closes issue #15936) Reported by: falves11 Patches: dial-macro-billsec-fix1.diff uploaded by mnicholson (license 96) dial-caller-answer1.diff uploaded by mnicholson (license 96) Tested by: falves11, mnicholson git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@227897 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps/app_dial.c')
-rw-r--r--apps/app_dial.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 7a74d8d22..c6747bffc 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -94,6 +94,15 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
</argument>
<para>Play an announcement to the called party, where <replaceable>x</replaceable> is the prompt to be played</para>
</option>
+ <option name="a">
+ <para>Immediately answer the calling channel when the called channel answers in
+ all cases. Normally, the calling channel is answered when the called channel
+ answers, but when options such as A() and M() are used, the calling channel is
+ not answered until all actions on the called channel (such as playing an
+ announcement) are completed. This option can be used to answer the calling
+ channel before doing anything on the called channel. You will rarely need to use
+ this option, the default behavior is adequate in most cases.</para>
+ </option>
<option name="C">
<para>Reset the call detail record (CDR) for this call.</para>
</option>
@@ -508,6 +517,7 @@ enum {
OPT_CALLEE_GOSUB = (1 << 28),
OPT_CALLEE_MIXMONITOR = (1 << 29),
OPT_CALLER_MIXMONITOR = (1 << 30),
+ OPT_CALLER_ANSWER = (1 << 31),
};
#define DIAL_STILLGOING (1 << 31)
@@ -537,6 +547,7 @@ enum {
AST_APP_OPTIONS(dial_exec_options, BEGIN_OPTIONS
AST_APP_OPTION_ARG('A', OPT_ANNOUNCE, OPT_ARG_ANNOUNCE),
+ AST_APP_OPTION('a', OPT_CALLER_ANSWER),
AST_APP_OPTION('C', OPT_RESETCDR),
AST_APP_OPTION('c', OPT_CANCEL_ELSEWHERE),
AST_APP_OPTION('d', OPT_DTMF_EXIT),
@@ -1987,6 +1998,9 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
} else {
const char *number;
+ if (ast_test_flag64(&opts, OPT_CALLER_ANSWER))
+ ast_answer(chan);
+
strcpy(pa.status, "ANSWER");
pbx_builtin_setvar_helper(chan, "DIALSTATUS", pa.status);
/* Ah ha! Someone answered within the desired timeframe. Of course after this
@@ -1994,9 +2008,11 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
conversation. */
hanguptree(outgoing, peer, 1);
outgoing = NULL;
- /* If appropriate, log that we have a destination channel */
- if (chan->cdr)
+ /* If appropriate, log that we have a destination channel and set the answer time */
+ if (chan->cdr) {
ast_cdr_setdestchan(chan->cdr, peer->name);
+ ast_cdr_setanswer(chan->cdr, peer->cdr->answer);
+ }
if (peer->name)
pbx_builtin_setvar_helper(chan, "DIALEDPEERNAME", peer->name);