[asterisk-commits] oej: branch oej/cancel_elsewhere_1.4 r74260 - in /team/oej/cancel_elsewhere_1...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Jul 10 02:08:30 CDT 2007
Author: oej
Date: Tue Jul 10 02:08:29 2007
New Revision: 74260
URL: http://svn.digium.com/view/asterisk?view=rev&rev=74260
Log:
Integrating the patch for cancel_elsewhere
Modified:
team/oej/cancel_elsewhere_1.4/apps/app_dial.c
team/oej/cancel_elsewhere_1.4/channels/chan_local.c
team/oej/cancel_elsewhere_1.4/channels/chan_sip.c
team/oej/cancel_elsewhere_1.4/include/asterisk/channel.h
Modified: team/oej/cancel_elsewhere_1.4/apps/app_dial.c
URL: http://svn.digium.com/view/asterisk/team/oej/cancel_elsewhere_1.4/apps/app_dial.c?view=diff&rev=74260&r1=74259&r2=74260
==============================================================================
--- team/oej/cancel_elsewhere_1.4/apps/app_dial.c (original)
+++ team/oej/cancel_elsewhere_1.4/apps/app_dial.c Tue Jul 10 02:08:29 2007
@@ -99,6 +99,8 @@
" Options:\n"
" A(x) - Play an announcement to the called party, using 'x' as the file.\n"
" C - Reset the CDR for this call.\n"
+" c - If DIAL cancels this call, always set the flag to tell the channel\n"
+" driver that the call is answered elsewhere.\n"
" d - Allow the calling user to dial a 1 digit extension while waiting for\n"
" a call to be answered. Exit to that extension if it exists in the\n"
" current context, or the context defined in the EXITCONTEXT variable,\n"
@@ -241,6 +243,7 @@
OPT_CALLEE_PARK = (1 << 25),
OPT_CALLER_PARK = (1 << 26),
OPT_IGNORE_FORWARDING = (1 << 27),
+ OPT_CANCEL_ELSEWHERE = (1 << 29),
} dial_exec_option_flags;
#define DIAL_STILLGOING (1 << 30)
@@ -263,6 +266,7 @@
AST_APP_OPTIONS(dial_exec_options, {
AST_APP_OPTION_ARG('A', OPT_ANNOUNCE, OPT_ARG_ANNOUNCE),
AST_APP_OPTION('C', OPT_RESETCDR),
+ AST_APP_OPTION('c', OPT_CANCEL_ELSEWHERE),
AST_APP_OPTION('d', OPT_DTMF_EXIT),
AST_APP_OPTION_ARG('D', OPT_SENDDTMF, OPT_ARG_SENDDTMF),
AST_APP_OPTION('f', OPT_FORCECLID),
@@ -303,14 +307,17 @@
};
-static void hanguptree(struct dial_localuser *outgoing, struct ast_channel *exception)
+static void hanguptree(struct dial_localuser *outgoing, struct ast_channel *exception, const int answered_elsewhere)
{
/* Hang up a tree of stuff */
struct dial_localuser *oo;
while (outgoing) {
/* Hangup any existing lines we have open */
- if (outgoing->chan && (outgoing->chan != exception))
+ if (outgoing->chan && (outgoing->chan != exception)) {
+ if (answered_elsewhere)
+ ast_set_flag(outgoing->chan, AST_FLAG_ANSWERED_ELSEWHERE);
ast_hangup(outgoing->chan);
+ }
oo = outgoing;
outgoing=outgoing->next;
free(oo);
@@ -1091,6 +1098,7 @@
goto out;
if (opts.flags) {
ast_copy_flags(tmp, &opts,
+ OPT_CANCEL_ELSEWHERE |
OPT_CALLEE_TRANSFER | OPT_CALLER_TRANSFER |
OPT_CALLEE_HANGUP | OPT_CALLER_HANGUP |
OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR |
@@ -1299,7 +1307,7 @@
/* Ah ha! Someone answered within the desired timeframe. Of course after this
we will always return with -1 so that it is hung up properly after the
conversation. */
- hanguptree(outgoing, peer);
+ hanguptree(outgoing, peer, 1);
outgoing = NULL;
/* If appropriate, log that we have a destination channel */
if (chan->cdr)
@@ -1500,7 +1508,7 @@
ast_parseable_goto(peer, opt_args[OPT_ARG_GOTO]);
peer->priority++;
ast_pbx_start(peer);
- hanguptree(outgoing, NULL);
+ hanguptree(outgoing, NULL, ast_test_flag(&opts, OPT_CANCEL_ELSEWHERE ? 1 : 0));
if (continue_exec)
*continue_exec = 1;
res = 0;
@@ -1680,7 +1688,7 @@
ast_indicate(chan, -1);
}
ast_rtp_early_bridge(chan, NULL);
- hanguptree(outgoing, NULL);
+ hanguptree(outgoing, NULL, 0);
pbx_builtin_setvar_helper(chan, "DIALSTATUS", status);
if (option_debug)
ast_log(LOG_DEBUG, "Exiting with DIALSTATUS=%s.\n", status);
Modified: team/oej/cancel_elsewhere_1.4/channels/chan_local.c
URL: http://svn.digium.com/view/asterisk/team/oej/cancel_elsewhere_1.4/channels/chan_local.c?view=diff&rev=74260&r1=74259&r2=74260
==============================================================================
--- team/oej/cancel_elsewhere_1.4/channels/chan_local.c (original)
+++ team/oej/cancel_elsewhere_1.4/channels/chan_local.c Tue Jul 10 02:08:29 2007
@@ -485,6 +485,8 @@
return -1;
ast_mutex_lock(&p->lock);
+ if (p->chan && ast_test_flag(ast, AST_FLAG_ANSWERED_ELSEWHERE))
+ ast_set_flag(p->chan, AST_FLAG_ANSWERED_ELSEWHERE);
isoutbound = IS_OUTBOUND(ast, p);
if (isoutbound) {
const char *status = pbx_builtin_getvar_helper(p->chan, "DIALSTATUS");
Modified: team/oej/cancel_elsewhere_1.4/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/oej/cancel_elsewhere_1.4/channels/chan_sip.c?view=diff&rev=74260&r1=74259&r2=74260
==============================================================================
--- team/oej/cancel_elsewhere_1.4/channels/chan_sip.c (original)
+++ team/oej/cancel_elsewhere_1.4/channels/chan_sip.c Tue Jul 10 02:08:29 2007
@@ -719,7 +719,7 @@
#define SIP_REALTIME (1 << 11) /*!< Flag for realtime users */
#define SIP_USECLIENTCODE (1 << 12) /*!< Trust X-ClientCode info message */
#define SIP_OUTGOING (1 << 13) /*!< Direction of the last transaction in this dialog */
-#define SIP_FREE_BIT (1 << 14) /*!< ---- */
+#define SIP_DIALOG_ANSWEREDELSEWHERE (1 << 14) /*!< This call is cancelled due to another phone answering the call */
#define SIP_DEFER_BYE_ON_TRANSFER (1 << 15) /*!< Do not hangup at first ast_hangup */
#define SIP_DTMF (3 << 16) /*!< DTMF Support: four settings, uses two bits */
#define SIP_DTMF_RFC2833 (0 << 16) /*!< DTMF Support: RTP DTMF - "rfc2833" */
@@ -3341,6 +3341,12 @@
ast_log(LOG_DEBUG, "Asked to hangup channel that was not connected\n");
return 0;
}
+ if (ast_test_flag(ast, AST_FLAG_ANSWERED_ELSEWHERE)) {
+ if (option_debug)
+ ast_log(LOG_DEBUG, "This call was answered elsewhere");
+ append_history(p, "Cancel", "Call answered elsewhere");
+ ast_set_flag(&p->flags[0], SIP_DIALOG_ANSWEREDELSEWHERE);
+ }
if (ast_test_flag(&p->flags[0], SIP_DEFER_BYE_ON_TRANSFER)) {
if (ast_test_flag(&p->flags[0], SIP_INC_COUNT)) {
@@ -7586,6 +7592,9 @@
p->invitestate = INV_CONFIRMED;
reqprep(&resp, p, sipmethod, seqno, newbranch);
+ if (sipmethod == SIP_CANCEL && ast_test_flag(&p->flags[0], SIP_DIALOG_ANSWEREDELSEWHERE))
+ add_header(&resp, "Reason:", "SIP;cause=200;text=\"Call completed elsewhere\"");
+
add_header_contentLength(&resp, 0);
return send_request(p, &resp, reliable, seqno ? seqno : p->ocseq);
}
Modified: team/oej/cancel_elsewhere_1.4/include/asterisk/channel.h
URL: http://svn.digium.com/view/asterisk/team/oej/cancel_elsewhere_1.4/include/asterisk/channel.h?view=diff&rev=74260&r1=74259&r2=74260
==============================================================================
--- team/oej/cancel_elsewhere_1.4/include/asterisk/channel.h (original)
+++ team/oej/cancel_elsewhere_1.4/include/asterisk/channel.h Tue Jul 10 02:08:29 2007
@@ -478,6 +478,9 @@
/*! This is set to tell the channel not to generate DTMF begin frames, and
* to instead only generate END frames. */
AST_FLAG_END_DTMF_ONLY = (1 << 14),
+ /*! Flag to show channels that this call is hangup due to the fact that the call
+ was indeed anwered, but in another channel */
+ AST_FLAG_ANSWERED_ELSEWHERE = (1 << 15),
};
/*! \brief ast_bridge_config flags */
More information about the asterisk-commits
mailing list