[svn-commits] mmichelson: branch group/ari-greedy-atxfer r419683 - in /team/group/ari-greed...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Jul 28 13:14:23 CDT 2014


Author: mmichelson
Date: Mon Jul 28 13:14:21 2014
New Revision: 419683

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=419683
Log:
Commit the content of review 3857 to this branch.

The content of this changeset ensures that channels that
move from a Stasis bridge to a non-Stasis bridge are booted
from Stasis in the process. This means that after leaving
the Stasis bridge, a ChannelLeftBridge event is sent, followed
by a StasisEnd event. No futher events are issued for the
channel since the application is then unsubscribed from
that channel's events.


Modified:
    team/group/ari-greedy-atxfer/include/asterisk/bridge_channel.h
    team/group/ari-greedy-atxfer/res/stasis/stasis_bridge.c

Modified: team/group/ari-greedy-atxfer/include/asterisk/bridge_channel.h
URL: http://svnview.digium.com/svn/asterisk/team/group/ari-greedy-atxfer/include/asterisk/bridge_channel.h?view=diff&rev=419683&r1=419682&r2=419683
==============================================================================
--- team/group/ari-greedy-atxfer/include/asterisk/bridge_channel.h (original)
+++ team/group/ari-greedy-atxfer/include/asterisk/bridge_channel.h Mon Jul 28 13:14:21 2014
@@ -162,6 +162,8 @@
 		/*! Digit currently sending into the bridge. (zero if not sending) */
 		char dtmf_digit;
 	} owed;
+	/*! Callback to call if the bridge channel is being moved from one bridge to another. */
+	void (*bein_moved)(struct ast_bridge_channel *bridge_channel, struct ast_bridge *src, struct ast_bridge *dst);
 };
 
 /*!

Modified: team/group/ari-greedy-atxfer/res/stasis/stasis_bridge.c
URL: http://svnview.digium.com/svn/asterisk/team/group/ari-greedy-atxfer/res/stasis/stasis_bridge.c?view=diff&rev=419683&r1=419682&r2=419683
==============================================================================
--- team/group/ari-greedy-atxfer/res/stasis/stasis_bridge.c (original)
+++ team/group/ari-greedy-atxfer/res/stasis/stasis_bridge.c Mon Jul 28 13:14:21 2014
@@ -34,6 +34,8 @@
 #include "asterisk/bridge.h"
 #include "asterisk/bridge_after.h"
 #include "asterisk/bridge_internal.h"
+#include "asterisk/stasis_app.h"
+#include "asterisk/stasis_channels.h"
 #include "stasis_bridge.h"
 #include "control.h"
 #include "command.h"
@@ -42,6 +44,8 @@
 #include "asterisk/pbx.h"
 
 /* ------------------------------------------------------------------- */
+
+static struct ast_bridge_methods bridge_stasis_v_table;
 
 static void bridge_stasis_run_cb(struct ast_channel *chan, void *data)
 {
@@ -138,6 +142,57 @@
 	return ast_bridge_base_v_table.push(self, bridge_channel, swap);
 }
 
+static void bridge_stasis_bein_moved(struct ast_bridge_channel *bridge_channel,
+		struct ast_bridge *src, struct ast_bridge *dst)
+{
+	if (src->v_table == &bridge_stasis_v_table &&
+			dst->v_table != &bridge_stasis_v_table) {
+		/* Send the stasis end here. Need the app name for that... */
+		RAII_VAR(struct ast_json *, msg, NULL, ast_json_unref);
+		RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup);
+		RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
+		struct stasis_message_sanitizer *sanitize = stasis_app_get_sanitizer();
+		struct stasis_app *app;
+		struct ast_channel *chan;
+
+		chan = bridge_channel->chan;
+		ast_assert(chan != NULL);
+
+		control = stasis_app_control_find_by_channel(chan);
+		if (!control) {
+			return;
+		}
+		app = control_app(control);
+		if (!app) {
+			return;
+		}
+
+		/* Set channel info */
+		ast_channel_lock(chan);
+		snapshot = ast_channel_snapshot_create(chan);
+		ast_channel_unlock(chan);
+		if (snapshot == NULL) {
+			return;
+		}
+
+		if (sanitize && sanitize->channel_snapshot
+			&& sanitize->channel_snapshot(snapshot)) {
+			return;
+		}
+
+		msg = ast_json_pack("{s: s, s: o, s: o}",
+			"type", "StasisEnd",
+			"timestamp", ast_json_timeval(ast_tvnow(), NULL),
+			"channel", ast_channel_snapshot_to_json(snapshot, NULL));
+		if (!msg) {
+			return;
+		}
+
+		app_send(app, msg);
+		return;
+	}
+}
+
 /*!
  * \internal
  * \brief Pull this channel from the Stasis bridge.
@@ -157,10 +212,10 @@
 		ast_bridge_channel_update_accountcodes(NULL, bridge_channel);
 	}
 
+	bridge_channel->bein_moved = bridge_stasis_bein_moved;
+
 	ast_bridge_base_v_table.pull(self, bridge_channel);
 }
-
-static struct ast_bridge_methods bridge_stasis_v_table;
 
 struct ast_bridge *bridge_stasis_new(uint32_t capabilities, unsigned int flags, const char *name, const char *id)
 {




More information about the svn-commits mailing list