summaryrefslogtreecommitdiff
path: root/main/manager_bridging.c
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2013-06-28 18:42:24 +0000
committerMark Michelson <mmichelson@digium.com>2013-06-28 18:42:24 +0000
commit6d624eb008b82b1197cd6bb744073d5c6ef945d7 (patch)
treeb3910d3d98c61c20dd198d8bca7f066ac620ad20 /main/manager_bridging.c
parentca61a05506c778e155f557c2ffefbf5707874473 (diff)
Add stasis publications for blind and attended transfers.
This creates stasis messages that are sent during a blind or attended transfer. The stasis messages also are converted to AMI events. Review: https://reviewboard.asterisk.org/r/2619 (closes issue ASTERISK-21337) Reported by Matt Jordan git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@393182 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/manager_bridging.c')
-rw-r--r--main/manager_bridging.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/main/manager_bridging.c b/main/manager_bridging.c
index 01ce68aaf..5e5f409ee 100644
--- a/main/manager_bridging.c
+++ b/main/manager_bridging.c
@@ -108,6 +108,11 @@ static struct stasis_message_router *bridge_state_router;
</manager>
***/
+/*! \brief The \ref stasis subscription returned by the forwarding of the channel topic
+ * to the manager topic
+ */
+static struct stasis_subscription *topic_forwarder;
+
struct ast_str *ast_manager_build_bridge_state_string(
const struct ast_bridge_snapshot *snapshot,
const char *suffix)
@@ -409,10 +414,16 @@ static int manager_bridge_info(struct mansession *s, const struct message *m)
return 0;
}
-static void manager_bridging_shutdown(void)
+static void manager_bridging_cleanup(void)
{
stasis_message_router_unsubscribe(bridge_state_router);
bridge_state_router = NULL;
+ stasis_unsubscribe(topic_forwarder);
+ topic_forwarder = NULL;
+}
+
+static void manager_bridging_shutdown(void)
+{
ast_manager_unregister("BridgeList");
ast_manager_unregister("BridgeInfo");
}
@@ -420,6 +431,8 @@ static void manager_bridging_shutdown(void)
int manager_bridging_init(void)
{
int ret = 0;
+ struct stasis_topic *manager_topic;
+ struct stasis_topic *bridge_topic;
if (bridge_state_router) {
/* Already initialized */
@@ -427,10 +440,29 @@ int manager_bridging_init(void)
}
ast_register_atexit(manager_bridging_shutdown);
+ ast_register_cleanup(manager_bridging_cleanup);
+
+ manager_topic = ast_manager_get_topic();
+ if (!manager_topic) {
+ return -1;
+ }
+
+ bridge_topic = stasis_caching_get_topic(ast_bridge_topic_all_cached());
+ if (!bridge_topic) {
+ return -1;
+ }
- bridge_state_router = stasis_message_router_create(
- stasis_caching_get_topic(ast_bridge_topic_all_cached()));
+ topic_forwarder = stasis_forward_all(bridge_topic, manager_topic);
+ if (!topic_forwarder) {
+ return -1;
+ }
+ /* BUGBUG - This should really route off of the manager_router, but
+ * can't b/c manager_channels is already routing the
+ * stasis_cache_update_type() messages. Having a separate router can
+ * cause some message ordering issues with bridge and channel messages.
+ */
+ bridge_state_router = stasis_message_router_create(bridge_topic);
if (!bridge_state_router) {
return -1;
}