Merge "res_pjsip_refer/chan_sip: Fix INVITE with replaces transfer to ConfBridge" into 13

certified/13.21
Jenkins2 7 years ago committed by Gerrit Code Review
commit 0edc4ade93

@ -25671,10 +25671,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

@ -912,6 +912,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,

@ -4355,7 +4355,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;
@ -4396,7 +4396,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;
@ -4643,8 +4643,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;
}

Loading…
Cancel
Save