ast_json_pack(): Use safer json ref mechanism.
[asterisk/asterisk.git] / main / manager_bridges.c
index 10a5046..b7059f4 100644 (file)
@@ -25,8 +25,6 @@
 
 #include "asterisk.h"
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
 #include "asterisk/stasis_bridges.h"
 #include "asterisk/stasis_channels.h"
 #include "asterisk/manager.h"
@@ -42,6 +40,11 @@ static struct stasis_message_router *bridge_state_router;
                        <syntax>
                                <bridge_snapshot/>
                        </syntax>
+                       <see-also>
+                               <ref type="managerEvent">BridgeDestroy</ref>
+                               <ref type="managerEvent">BridgeEnter</ref>
+                               <ref type="managerEvent">BridgeLeave</ref>
+                       </see-also>
                </managerEventInstance>
        </managerEvent>
        <managerEvent language="en_US" name="BridgeDestroy">
@@ -50,6 +53,11 @@ static struct stasis_message_router *bridge_state_router;
                        <syntax>
                                <bridge_snapshot/>
                        </syntax>
+                       <see-also>
+                               <ref type="managerEvent">BridgeCreate</ref>
+                               <ref type="managerEvent">BridgeEnter</ref>
+                               <ref type="managerEvent">BridgeLeave</ref>
+                       </see-also>
                </managerEventInstance>
        </managerEvent>
        <managerEvent language="en_US" name="BridgeEnter">
@@ -62,6 +70,11 @@ static struct stasis_message_router *bridge_state_router;
                                        <para>The uniqueid of the channel being swapped out of the bridge</para>
                                </parameter>
                        </syntax>
+                       <see-also>
+                               <ref type="managerEvent">BridgeCreate</ref>
+                               <ref type="managerEvent">BridgeDestroy</ref>
+                               <ref type="managerEvent">BridgeLeave</ref>
+                       </see-also>
                </managerEventInstance>
        </managerEvent>
        <managerEvent language="en_US" name="BridgeLeave">
@@ -71,6 +84,26 @@ static struct stasis_message_router *bridge_state_router;
                                <bridge_snapshot/>
                                <channel_snapshot/>
                        </syntax>
+                       <see-also>
+                               <ref type="managerEvent">BridgeCreate</ref>
+                               <ref type="managerEvent">BridgeDestroy</ref>
+                               <ref type="managerEvent">BridgeEnter</ref>
+                       </see-also>
+               </managerEventInstance>
+       </managerEvent>
+       <managerEvent language="en_US" name="BridgeVideoSourceUpdate">
+               <managerEventInstance class="EVENT_FLAG_CALL">
+                       <synopsis>Raised when the channel that is the source of video in a bridge changes.</synopsis>
+                       <syntax>
+                               <bridge_snapshot/>
+                               <parameter name="BridgePreviousVideoSource">
+                                       <para>The unique ID of the channel that was the video source.</para>
+                               </parameter>
+                       </syntax>
+                       <see-also>
+                               <ref type="managerEvent">BridgeCreate</ref>
+                               <ref type="managerEvent">BridgeDestroy</ref>
+                       </see-also>
                </managerEventInstance>
        </managerEvent>
        <manager name="BridgeList" language="en_US">
@@ -86,6 +119,12 @@ static struct stasis_message_router *bridge_state_router;
                <description>
                        <para>Returns a list of bridges, optionally filtering on a bridge type.</para>
                </description>
+               <see-also>
+                       <ref type="manager">Bridge</ref>
+                       <ref type="manager">BridgeDestroy</ref>
+                       <ref type="manager">BridgeInfo</ref>
+                       <ref type="manager">BridgeKick</ref>
+               </see-also>
        </manager>
        <manager name="BridgeInfo" language="en_US">
                <synopsis>
@@ -94,12 +133,18 @@ static struct stasis_message_router *bridge_state_router;
                <syntax>
                        <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" />
                        <parameter name="BridgeUniqueid" required="true">
-                               <para>The unique ID of the bridge about which to retreive information.</para>
+                               <para>The unique ID of the bridge about which to retrieve information.</para>
                        </parameter>
                </syntax>
                <description>
                        <para>Returns detailed information about a bridge and the channels in it.</para>
                </description>
+               <see-also>
+                       <ref type="manager">Bridge</ref>
+                       <ref type="manager">BridgeDestroy</ref>
+                       <ref type="manager">BridgeKick</ref>
+                       <ref type="manager">BridgeList</ref>
+               </see-also>
                <responses>
                        <list-elements>
                                <managerEvent language="en_US" name="BridgeInfoChannel">
@@ -134,6 +179,13 @@ static struct stasis_message_router *bridge_state_router;
                <description>
                        <para>Deletes the bridge, causing channels to continue or hang up.</para>
                </description>
+               <see-also>
+                       <ref type="manager">Bridge</ref>
+                       <ref type="manager">BridgeInfo</ref>
+                       <ref type="manager">BridgeKick</ref>
+                       <ref type="manager">BridgeList</ref>
+                       <ref type="managerEvent">BridgeDestroy</ref>
+               </see-also>
        </manager>
        <manager name="BridgeKick" language="en_US">
                <synopsis>
@@ -153,6 +205,13 @@ static struct stasis_message_router *bridge_state_router;
                <description>
                        <para>The channel is removed from the bridge.</para>
                </description>
+               <see-also>
+                       <ref type="manager">Bridge</ref>
+                       <ref type="manager">BridgeDestroy</ref>
+                       <ref type="manager">BridgeInfo</ref>
+                       <ref type="manager">BridgeList</ref>
+                       <ref type="managerEvent">BridgeLeave</ref>
+               </see-also>
        </manager>
  ***/
 
@@ -178,18 +237,30 @@ struct ast_str *ast_manager_build_bridge_state_string_prefix(
                "%sBridgeTechnology: %s\r\n"
                "%sBridgeCreator: %s\r\n"
                "%sBridgeName: %s\r\n"
-               "%sBridgeNumChannels: %u\r\n",
+               "%sBridgeNumChannels: %u\r\n"
+               "%sBridgeVideoSourceMode: %s\r\n",
                prefix, snapshot->uniqueid,
                prefix, snapshot->subclass,
                prefix, snapshot->technology,
                prefix, ast_strlen_zero(snapshot->creator) ? "<unknown>": snapshot->creator,
                prefix, ast_strlen_zero(snapshot->name) ? "<unknown>": snapshot->name,
-               prefix, snapshot->num_channels);
+               prefix, snapshot->num_channels,
+               prefix, ast_bridge_video_mode_to_string(snapshot->video_mode));
        if (!res) {
                ast_free(out);
                return NULL;
        }
 
+       if (snapshot->video_mode != AST_BRIDGE_VIDEO_MODE_NONE
+               && !ast_strlen_zero(snapshot->video_source_id)) {
+               res = ast_str_append(&out, 0, "%sBridgeVideoSource: %s\r\n",
+                       prefix, snapshot->video_source_id);
+               if (!res) {
+                       ast_free(out);
+                       return NULL;
+               }
+       }
+
        return out;
 }
 
@@ -217,6 +288,25 @@ static struct ast_manager_event_blob *bridge_create(
                EVENT_FLAG_CALL, "BridgeCreate", NO_EXTRA_FIELDS);
 }
 
+/* \brief Handle video source updates */
+static struct ast_manager_event_blob *bridge_video_update(
+       struct ast_bridge_snapshot *old_snapshot,
+       struct ast_bridge_snapshot *new_snapshot)
+{
+       if (!new_snapshot || !old_snapshot) {
+               return NULL;
+       }
+
+       if (!strcmp(old_snapshot->video_source_id, new_snapshot->video_source_id)) {
+               return NULL;
+       }
+
+       return ast_manager_event_blob_create(
+               EVENT_FLAG_CALL, "BridgeVideoSourceUpdate",
+               "BridgePreviousVideoSource: %s\r\n",
+               old_snapshot->video_source_id);
+}
+
 /*! \brief Handle bridge destruction */
 static struct ast_manager_event_blob *bridge_destroy(
        struct ast_bridge_snapshot *old_snapshot,
@@ -230,9 +320,9 @@ static struct ast_manager_event_blob *bridge_destroy(
                EVENT_FLAG_CALL, "BridgeDestroy", NO_EXTRA_FIELDS);
 }
 
-
 bridge_snapshot_monitor bridge_monitors[] = {
        bridge_create,
+       bridge_video_update,
        bridge_destroy,
 };
 
@@ -572,7 +662,7 @@ static int manager_bridge_kick(struct mansession *s, const struct message *m)
                }
        } else {
                bridge = ast_bridge_find_by_id(bridge_uniqueid);
-               if (!bridge) {
+               if (!bridge || ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
                        astman_send_error(s, m, "Bridge not found");
                        return 0;
                }
@@ -591,10 +681,7 @@ static void manager_bridging_cleanup(void)
 {
        stasis_forward_cancel(topic_forwarder);
        topic_forwarder = NULL;
-}
 
-static void manager_bridging_shutdown(void)
-{
        ast_manager_unregister("BridgeList");
        ast_manager_unregister("BridgeInfo");
        ast_manager_unregister("BridgeDestroy");
@@ -612,7 +699,6 @@ int manager_bridging_init(void)
                return 0;
        }
 
-       ast_register_atexit(manager_bridging_shutdown);
        ast_register_cleanup(manager_bridging_cleanup);
 
        manager_topic = ast_manager_get_topic();
@@ -656,7 +742,7 @@ int manager_bridging_init(void)
         * thing and fail it.
         */
        if (ret) {
-               manager_bridging_shutdown();
+               manager_bridging_cleanup();
                return -1;
        }