mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	app_confbridge: ConfbridgeList event has standard channel shapshot headers.
* 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
This commit is contained in:
		| @@ -67,6 +67,7 @@ | ||||
| #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" | ||||
| @@ -226,6 +227,62 @@ | ||||
| 			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. | ||||
| @@ -3471,15 +3528,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" | ||||
| @@ -3487,19 +3555,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) | ||||
| @@ -3533,12 +3605,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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user