[svn-commits] rmudgett: branch rmudgett/bridge_phase r381517 - /team/rmudgett/bridge_phase/...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Feb 14 17:11:14 CST 2013


Author: rmudgett
Date: Thu Feb 14 17:11:11 2013
New Revision: 381517

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=381517
Log:
Make a failed bridge send the peer to the setup after bridge goto location.

Modified:
    team/rmudgett/bridge_phase/main/features.c

Modified: team/rmudgett/bridge_phase/main/features.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_phase/main/features.c?view=diff&rev=381517&r1=381516&r2=381517
==============================================================================
--- team/rmudgett/bridge_phase/main/features.c (original)
+++ team/rmudgett/bridge_phase/main/features.c Thu Feb 14 17:11:11 2013
@@ -4385,7 +4385,24 @@
 	}
 }
 
-/* BUGBUG Change callers of ast_bridge_call() to not expect the peer back. */
+/*!
+ * \internal
+ * \brief Send the peer channel on its way on bridge start failure.
+ * \since 12.0.0
+ *
+ * \param chan Chan to put into autoservice.
+ * \param peer Chan to send to after bridge goto or run hangup handlers and hangup.
+ *
+ * \return Nothing
+ */
+static void bridge_failed_peer_goto(struct ast_channel *chan, struct ast_channel *peer)
+{
+	if (ast_after_bridge_goto_setup(peer)
+		|| ast_pbx_start(peer)) {
+		ast_autoservice_chan_hangup_peer(chan, peer);
+	}
+}
+
 /*!
  * \brief bridge the call and set CDR
  *
@@ -4435,7 +4452,7 @@
 	/* Answer if need be */
 	if (ast_channel_state(chan) != AST_STATE_UP) {
 		if (ast_raw_answer(chan, 1)) {
-			ast_autoservice_chan_hangup_peer(chan, peer);
+			bridge_failed_peer_goto(chan, peer);
 			return -1;
 		}
 	}
@@ -4465,7 +4482,7 @@
 		|| setup_bridge_channel_features(&chan_features, &config->features_caller)) {
 		ast_bridge_features_destroy(peer_features);
 		ast_bridge_features_cleanup(&chan_features);
-		ast_autoservice_chan_hangup_peer(chan, peer);
+		bridge_failed_peer_goto(chan, peer);
 		return -1;
 	}
 
@@ -4479,7 +4496,7 @@
 
 			ast_bridge_features_destroy(peer_features);
 			ast_bridge_features_cleanup(&chan_features);
-			ast_autoservice_chan_hangup_peer(chan, peer);
+			bridge_failed_peer_goto(chan, peer);
 			return -1;
 		}
 
@@ -4489,7 +4506,7 @@
 
 			ast_bridge_features_destroy(peer_features);
 			ast_bridge_features_cleanup(&chan_features);
-			ast_autoservice_chan_hangup_peer(chan, peer);
+			bridge_failed_peer_goto(chan, peer);
 			return -1;
 		}
 
@@ -4510,7 +4527,7 @@
 			ast_log(LOG_ERROR, "Could not set duration limits on one or more sides of the call. Bridge canceled.\n");
 			ast_bridge_features_destroy(peer_features);
 			ast_bridge_features_cleanup(&chan_features);
-			ast_autoservice_chan_hangup_peer(chan, peer);
+			bridge_failed_peer_goto(chan, peer);
 			return -1;
 		}
 	}
@@ -4521,7 +4538,7 @@
 	if (!bridge) {
 		ast_bridge_features_destroy(peer_features);
 		ast_bridge_features_cleanup(&chan_features);
-		ast_autoservice_chan_hangup_peer(chan, peer);
+		bridge_failed_peer_goto(chan, peer);
 		return -1;
 	}
 
@@ -4530,7 +4547,7 @@
 		ast_bridge_destroy(bridge);
 		ast_bridge_features_destroy(peer_features);
 		ast_bridge_features_cleanup(&chan_features);
-		ast_autoservice_chan_hangup_peer(chan, peer);
+		bridge_failed_peer_goto(chan, peer);
 		return -1;
 	}
 
@@ -5329,7 +5346,7 @@
 				break;
 			}
 			if (res) {
-				ast_autoservice_chan_hangup_peer(chan, peer);
+				bridge_failed_peer_goto(chan, peer);
 				parkinglot_unref(parkinglot);
 				return -1;
 			}
@@ -5338,7 +5355,7 @@
 		res = ast_channel_make_compatible(chan, peer);
 		if (res < 0) {
 			ast_log(LOG_WARNING, "Could not make channels %s and %s compatible for bridge\n", ast_channel_name(chan), ast_channel_name(peer));
-			ast_autoservice_chan_hangup_peer(chan, peer);
+			bridge_failed_peer_goto(chan, peer);
 			parkinglot_unref(parkinglot);
 			return -1;
 		}
@@ -7921,8 +7938,7 @@
 			"Channel1: %s\r\n"
 			"Channel2: %s\r\n", ast_channel_name(chan), ast_channel_name(final_dest_chan));
 
-		/* Maybe we should return this channel to the PBX? */
-		ast_autoservice_chan_hangup_peer(chan, final_dest_chan);
+		bridge_failed_peer_goto(chan, final_dest_chan);
 
 		pbx_builtin_setvar_helper(chan, "BRIDGERESULT", "INCOMPATIBLE");
 		current_dest_chan = ast_channel_unref(current_dest_chan);




More information about the svn-commits mailing list