]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
app_confbridge: ConfbridgeList event has standard channel shapshot headers.
authorRichard Mudgett <rmudgett@digium.com>
Wed, 31 Jan 2018 23:48:46 +0000 (17:48 -0600)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 5 Feb 2018 19:48:00 +0000 (13:48 -0600)
* Made the AMI ConfbridgeList action's ConfbridgeList events output all
the standard channel snapshot headers instead of a few hand-coded channel
snapshot headers.  The benefit is that the CallerIDName gets disruptive
characters like CR, LF, Tab, and a few others escaped.  However, an empty
CallerIDName is now output as "<unknown>" instead of "<no name>".

ASTERISK-27651

Change-Id: Iaf7d54a9d40194c2db060bc9b4979fab6720d977

CHANGES
UPGRADE.txt
apps/app_confbridge.c

diff --git a/CHANGES b/CHANGES
index 1fc2a7f395afef8e975c016184a13d37de06f175..7df80dab81d6061fb68bb1c22e88b668ae19a362 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -17,6 +17,12 @@ app_confbridge
  * Added the Muted header to the ConfbridgeJoin AMI event to indicate the
    participant's starting mute status.
 
+ * Made the AMI ConfbridgeList action's ConfbridgeList events output all
+   the standard channel snapshot headers instead of a few hand-coded channel
+   snapshot headers.  The benefit is that the CallerIDName gets disruptive
+   characters like CR, LF, Tab, and a few others escaped.  However, an empty
+   CallerIDName is now output as "<unknown>" instead of "<no name>".
+
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 13.17.0 to Asterisk 13.18.0 ----------
 ------------------------------------------------------------------------------
index 334fad321cb40dd1c4ca7826ca15bbe2db5f1683..d677522e48eec50c3aafd4bf50b9efe32edfd36c 100644 (file)
 === UPGRADE-12.txt  -- Upgrade info for 11 to 12
 ===========================================================
 
+From 13.18-cert2 to 13.18-cert3:
+
+app_confbridge
+------------------
+ * Made the AMI ConfbridgeList action's ConfbridgeList events output all
+   the standard channel snapshot headers instead of a few hand-coded channel
+   snapshot headers.  The benefit is that the CallerIDName gets disruptive
+   characters like CR, LF, Tab, and a few others escaped.  However, an empty
+   CallerIDName is now output as "<unknown>" instead of "<no name>".
+
 From 13.17.0 to 13.18.0:
 
 Core:
index afeac48cb1f84830f6580953194020687bbf9046..aa92922d947d9ea1a99d840380736268652dc549 100644 (file)
@@ -69,6 +69,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/test.h"
 #include "asterisk/stasis.h"
 #include "asterisk/stasis_bridges.h"
+#include "asterisk/stasis_channels.h"
 #include "asterisk/json.h"
 #include "asterisk/format_cache.h"
 #include "asterisk/taskprocessor.h"
@@ -228,6 +229,62 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
                        ConfbridgeListComplete.</para>
                </description>
        </manager>
+       <managerEvent language="en_US" name="ConfbridgeList">
+               <managerEventInstance class="EVENT_FLAG_REPORTING">
+                       <synopsis>Raised as part of the ConfbridgeList action response list.</synopsis>
+                       <syntax>
+                               <parameter name="Conference">
+                                       <para>The name of the Confbridge conference.</para>
+                               </parameter>
+                               <parameter name="Admin">
+                                       <para>Identifies this user as an admin user.</para>
+                                       <enumlist>
+                                               <enum name="Yes"/>
+                                               <enum name="No"/>
+                                       </enumlist>
+                               </parameter>
+                               <parameter name="MarkedUser">
+                                       <para>Identifies this user as a marked user.</para>
+                                       <enumlist>
+                                               <enum name="Yes"/>
+                                               <enum name="No"/>
+                                       </enumlist>
+                               </parameter>
+                               <parameter name="WaitMarked">
+                                       <para>Must this user wait for a marked user to join?</para>
+                                       <enumlist>
+                                               <enum name="Yes"/>
+                                               <enum name="No"/>
+                                       </enumlist>
+                               </parameter>
+                               <parameter name="EndMarked">
+                                       <para>Does this user get kicked after the last marked user leaves?</para>
+                                       <enumlist>
+                                               <enum name="Yes"/>
+                                               <enum name="No"/>
+                                       </enumlist>
+                               </parameter>
+                               <parameter name="Waiting">
+                                       <para>Is this user waiting for a marked user to join?</para>
+                                       <enumlist>
+                                               <enum name="Yes"/>
+                                               <enum name="No"/>
+                                       </enumlist>
+                               </parameter>
+                               <parameter name="Muted">
+                                       <para>The current mute status.</para>
+                                       <enumlist>
+                                               <enum name="Yes"/>
+                                               <enum name="No"/>
+                                       </enumlist>
+                               </parameter>
+                               <parameter name="AnsweredTime">
+                                       <para>The number of seconds the channel has been up.</para>
+                               </parameter>
+                               <channel_snapshot/>
+                       </syntax>
+               </managerEventInstance>
+       </managerEvent>
        <manager name="ConfbridgeListRooms" language="en_US">
                <synopsis>
                        List active conferences.
@@ -3446,15 +3503,26 @@ static struct ast_custom_function confbridge_info_function = {
        .read = func_confbridge_info,
 };
 
-static void action_confbridgelist_item(struct mansession *s, const char *id_text, struct confbridge_conference *conference, struct confbridge_user *user, int waiting)
+static int action_confbridgelist_item(struct mansession *s, const char *id_text, struct confbridge_conference *conference, struct confbridge_user *user, int waiting)
 {
+       struct ast_channel_snapshot *snapshot;
+       struct ast_str *snap_str;
+
+       snapshot = ast_channel_snapshot_get_latest(ast_channel_uniqueid(user->chan));
+       if (!snapshot) {
+               return 0;
+       }
+
+       snap_str = ast_manager_build_channel_state_string(snapshot);
+       if (!snap_str) {
+               ao2_ref(snapshot, -1);
+               return 0;
+       }
+
        astman_append(s,
                "Event: ConfbridgeList\r\n"
                "%s"
                "Conference: %s\r\n"
-               "CallerIDNum: %s\r\n"
-               "CallerIDName: %s\r\n"
-               "Channel: %s\r\n"
                "Admin: %s\r\n"
                "MarkedUser: %s\r\n"
                "WaitMarked: %s\r\n"
@@ -3462,19 +3530,23 @@ static void action_confbridgelist_item(struct mansession *s, const char *id_text
                "Waiting: %s\r\n"
                "Muted: %s\r\n"
                "AnsweredTime: %d\r\n"
+               "%s"
                "\r\n",
                id_text,
                conference->name,
-               S_COR(ast_channel_caller(user->chan)->id.number.valid, ast_channel_caller(user->chan)->id.number.str, "<unknown>"),
-               S_COR(ast_channel_caller(user->chan)->id.name.valid, ast_channel_caller(user->chan)->id.name.str, "<no name>"),
-               ast_channel_name(user->chan),
-               ast_test_flag(&user->u_profile, USER_OPT_ADMIN) ? "Yes" : "No",
-               ast_test_flag(&user->u_profile, USER_OPT_MARKEDUSER) ? "Yes" : "No",
-               ast_test_flag(&user->u_profile, USER_OPT_WAITMARKED) ? "Yes" : "No",
-               ast_test_flag(&user->u_profile, USER_OPT_ENDMARKED) ? "Yes" : "No",
-               waiting ? "Yes" : "No",
-               user->muted ? "Yes" : "No",
-               ast_channel_get_up_time(user->chan));
+               AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_ADMIN)),
+               AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_MARKEDUSER)),
+               AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_WAITMARKED)),
+               AST_YESNO(ast_test_flag(&user->u_profile, USER_OPT_ENDMARKED)),
+               AST_YESNO(waiting),
+               AST_YESNO(user->muted),
+               ast_channel_get_up_time(user->chan),
+               ast_str_buffer(snap_str));
+
+       ast_free(snap_str);
+       ao2_ref(snapshot, -1);
+
+       return 1;
 }
 
 static int action_confbridgelist(struct mansession *s, const struct message *m)
@@ -3508,12 +3580,10 @@ static int action_confbridgelist(struct mansession *s, const struct message *m)
 
        ao2_lock(conference);
        AST_LIST_TRAVERSE(&conference->active_list, user, list) {
-               total++;
-               action_confbridgelist_item(s, id_text, conference, user, 0);
+               total += action_confbridgelist_item(s, id_text, conference, user, 0);
        }
        AST_LIST_TRAVERSE(&conference->waiting_list, user, list) {
-               total++;
-               action_confbridgelist_item(s, id_text, conference, user, 1);
+               total += action_confbridgelist_item(s, id_text, conference, user, 1);
        }
        ao2_unlock(conference);
        ao2_ref(conference, -1);