summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES4
-rw-r--r--apps/app_dial.c20
2 files changed, 22 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index 37144e051..f18e918d8 100644
--- a/CHANGES
+++ b/CHANGES
@@ -77,6 +77,10 @@ Applications
regardless if the call has been answered or not.
* Added functionality to the app_dial F() option to continue with execution
at the current location when no parameters are provided.
+ * Added the 'a' option to app_dial to answer the calling channel before any
+ announcements or macros are executed.
+ * Modified app_dial to set answertime when the called channel answers even if
+ the called channel hangs up during playback of an announcement.
* Added c() option to app_chanspy. This option allows custom DTMF to be set
to cycle through the next available channel. By default this is still '*'.
* Added x() option to app_chanspy. This option allows DTMF to be set to
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);