[svn-commits] oej: branch oej/cancel_answer_elsewhere r66436 - in /team/oej/cancel_answer_e...

svn-commits at lists.digium.com svn-commits at lists.digium.com
Tue May 29 09:39:41 MST 2007


Author: oej
Date: Tue May 29 11:39:41 2007
New Revision: 66436

URL: http://svn.digium.com/view/asterisk?view=rev&rev=66436
Log:
First try... May, but only may, work with SNOM phones...

Modified:
    team/oej/cancel_answer_elsewhere/apps/app_dial.c
    team/oej/cancel_answer_elsewhere/channels/chan_sip.c
    team/oej/cancel_answer_elsewhere/include/asterisk/channel.h

Modified: team/oej/cancel_answer_elsewhere/apps/app_dial.c
URL: http://svn.digium.com/view/asterisk/team/oej/cancel_answer_elsewhere/apps/app_dial.c?view=diff&rev=66436&r1=66435&r2=66436
==============================================================================
--- team/oej/cancel_answer_elsewhere/apps/app_dial.c (original)
+++ team/oej/cancel_answer_elsewhere/apps/app_dial.c Tue May 29 11:39:41 2007
@@ -302,14 +302,17 @@
 };
 
 
-static void hanguptree(struct chanlist *outgoing, struct ast_channel *exception)
+static void hanguptree(struct chanlist *outgoing, struct ast_channel *exception, int answered_elsewhere)
 {
 	/* Hang up a tree of stuff */
 	struct chanlist *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);
@@ -1510,7 +1513,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)
@@ -1560,7 +1563,7 @@
 			ast_parseable_goto(peer, opt_args[OPT_ARG_GOTO]);
 			peer->priority++;
 			ast_pbx_start(peer);
-			hanguptree(outgoing, NULL);
+			hanguptree(outgoing, NULL, 0);
 			if (continue_exec)
 				*continue_exec = 1;
 			res = 0;
@@ -1721,7 +1724,7 @@
 		ast_indicate(chan, -1);
 	}
 	ast_channel_early_bridge(chan, NULL);
-	hanguptree(outgoing, NULL);
+	hanguptree(outgoing, NULL, 0);
 	pbx_builtin_setvar_helper(chan, "DIALSTATUS", pa.status);
 	senddialendevent(chan, pa.status);
 	if (option_debug)

Modified: team/oej/cancel_answer_elsewhere/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/oej/cancel_answer_elsewhere/channels/chan_sip.c?view=diff&rev=66436&r1=66435&r2=66436
==============================================================================
--- team/oej/cancel_answer_elsewhere/channels/chan_sip.c (original)
+++ team/oej/cancel_answer_elsewhere/channels/chan_sip.c Tue May 29 11:39:41 2007
@@ -3691,6 +3691,11 @@
 			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");
+	}
 
 	if (ast_test_flag(&p->flags[0], SIP_DEFER_BYE_ON_TRANSFER)) {
 		if (ast_test_flag(&p->flags[0], SIP_INC_COUNT)) {
@@ -8206,6 +8211,9 @@
 		p->invitestate = INV_CONFIRMED;
 
 	reqprep(&resp, p, sipmethod, seqno, newbranch);
+	if (sipmethod == SIP_CANCEL && p->owner && ast_test_flag(p->owner, AST_FLAG_ANSWERED_ELSEWHERE)) 
+		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_answer_elsewhere/include/asterisk/channel.h
URL: http://svn.digium.com/view/asterisk/team/oej/cancel_answer_elsewhere/include/asterisk/channel.h?view=diff&rev=66436&r1=66435&r2=66436
==============================================================================
--- team/oej/cancel_answer_elsewhere/include/asterisk/channel.h (original)
+++ team/oej/cancel_answer_elsewhere/include/asterisk/channel.h Tue May 29 11:39:41 2007
@@ -539,6 +539,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 svn-commits mailing list