mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +00:00 
			
		
		
		
	Merge "res_pjsip_refer/chan_sip: Fix INVITE with replaces transfer to ConfBridge"
This commit is contained in:
		| @@ -25887,10 +25887,7 @@ static int handle_invite_replaces(struct sip_pvt *p, struct sip_request *req, | ||||
| 
 | ||||
| 	ast_raw_answer(c); | ||||
| 
 | ||||
| 	ast_channel_lock(replaces_chan); | ||||
| 	bridge = ast_channel_get_bridge(replaces_chan); | ||||
| 	ast_channel_unlock(replaces_chan); | ||||
| 
 | ||||
| 	bridge = ast_bridge_transfer_acquire_bridge(replaces_chan); | ||||
| 	if (bridge) { | ||||
| 		/*
 | ||||
| 		 * We have two refs of the channel.  One is held in c and the other | ||||
|   | ||||
| @@ -954,6 +954,17 @@ void ast_bridge_remove_video_src(struct ast_bridge *bridge, struct ast_channel * | ||||
|  */ | ||||
| const char *ast_bridge_video_mode_to_string(enum ast_bridge_video_mode_type video_mode); | ||||
|  | ||||
| /*! | ||||
|  * \brief Acquire the channel's bridge for transfer purposes. | ||||
|  * \since 13.21.0 | ||||
|  * | ||||
|  * \param chan Channel involved in a transfer. | ||||
|  * | ||||
|  * \return The bridge the channel is in or NULL if it either isn't | ||||
|  * in a bridge or should not be considered to be in a bridge. | ||||
|  */ | ||||
| struct ast_bridge *ast_bridge_transfer_acquire_bridge(struct ast_channel *chan); | ||||
|  | ||||
| enum ast_transfer_result { | ||||
| 	/*! The transfer completed successfully */ | ||||
| 	AST_BRIDGE_TRANSFER_SUCCESS, | ||||
|   | ||||
| @@ -4427,7 +4427,7 @@ static void set_transfer_variables_all(struct ast_channel *transferer, struct ao | ||||
| 	ao2_iterator_destroy(&iter); | ||||
| } | ||||
|  | ||||
| static struct ast_bridge *acquire_bridge(struct ast_channel *chan) | ||||
| struct ast_bridge *ast_bridge_transfer_acquire_bridge(struct ast_channel *chan) | ||||
| { | ||||
| 	struct ast_bridge *bridge; | ||||
|  | ||||
| @@ -4468,7 +4468,7 @@ enum ast_transfer_result ast_bridge_transfer_blind(int is_external, | ||||
| 		return AST_BRIDGE_TRANSFER_FAIL; | ||||
| 	} | ||||
|  | ||||
| 	bridge = acquire_bridge(transferer); | ||||
| 	bridge = ast_bridge_transfer_acquire_bridge(transferer); | ||||
| 	if (!bridge) { | ||||
| 		transfer_result = AST_BRIDGE_TRANSFER_INVALID; | ||||
| 		goto publish; | ||||
| @@ -4715,8 +4715,8 @@ enum ast_transfer_result ast_bridge_transfer_attended(struct ast_channel *to_tra | ||||
| 	const char *app = NULL; | ||||
| 	int hangup_target = 0; | ||||
|  | ||||
| 	to_transferee_bridge = acquire_bridge(to_transferee); | ||||
| 	to_target_bridge = acquire_bridge(to_transfer_target); | ||||
| 	to_transferee_bridge = ast_bridge_transfer_acquire_bridge(to_transferee); | ||||
| 	to_target_bridge = ast_bridge_transfer_acquire_bridge(to_transfer_target); | ||||
|  | ||||
| 	transfer_msg = ast_attended_transfer_message_create(1, to_transferee, to_transferee_bridge, | ||||
| 			to_transfer_target, to_target_bridge, NULL, NULL); | ||||
|   | ||||
| @@ -917,10 +917,7 @@ static int invite_replaces(void *data) | ||||
| 	ast_channel_ref(invite->session->channel); | ||||
| 	invite->channel = invite->session->channel; | ||||
|  | ||||
| 	ast_channel_lock(invite->channel); | ||||
| 	invite->bridge = ast_channel_get_bridge(invite->channel); | ||||
| 	ast_channel_unlock(invite->channel); | ||||
|  | ||||
| 	invite->bridge = ast_bridge_transfer_acquire_bridge(invite->channel); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user