diff options
Diffstat (limited to 'main/bridge.c')
-rw-r--r-- | main/bridge.c | 53 |
1 files changed, 38 insertions, 15 deletions
diff --git a/main/bridge.c b/main/bridge.c index 66c495a0c..a3ca8a976 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -3805,6 +3805,26 @@ struct ast_channel *ast_bridge_peer(struct ast_bridge *bridge, struct ast_channe return peer; } +static void publish_blind_transfer_full(int is_external, enum ast_transfer_result result, + struct ast_channel *transferer, struct ast_bridge *bridge, + const char *context, const char *exten, struct ast_channel *transferee_channel, + struct ast_channel *replace_channel) +{ + struct ast_bridge_channel_pair pair; + + pair.channel = transferer; + pair.bridge = bridge; + + if (bridge) { + ast_bridge_lock(bridge); + } + ast_bridge_publish_blind_transfer(is_external, result, &pair, context, exten, + transferee_channel, replace_channel); + if (bridge) { + ast_bridge_unlock(bridge); + } +} + /*! * \internal * \brief Transfer an entire bridge to a specific destination. @@ -3817,16 +3837,21 @@ struct ast_channel *ast_bridge_peer(struct ast_bridge *bridge, struct ast_channe * bridges, this method is only used for multi-party bridges since this method would * be less efficient for two-party bridges. * + * \param is_external Whether the transfer is externally initiated * \param transferer The channel performing a transfer * \param bridge The bridge where the transfer is being performed * \param exten The destination extension for the blind transfer + * \param transferee The party being transferred if there is only one * \param context The destination context for the blind transfer * \param hook Framehook to attach to local channel + * * \return The success or failure of the operation */ -static enum ast_transfer_result blind_transfer_bridge(struct ast_channel *transferer, - struct ast_bridge *bridge, const char *exten, const char *context, - transfer_channel_cb new_channel_cb, struct transfer_channel_data *user_data_wrapper) +static enum ast_transfer_result blind_transfer_bridge(int is_external, + struct ast_channel *transferer, struct ast_bridge *bridge, + const char *exten, const char *context, struct ast_channel *transferee, + transfer_channel_cb new_channel_cb, + struct transfer_channel_data *user_data_wrapper) { struct ast_channel *local; char chan_name[AST_MAX_EXTENSION + AST_MAX_CONTEXT + 2]; @@ -3858,6 +3883,8 @@ static enum ast_transfer_result blind_transfer_bridge(struct ast_channel *transf ast_hangup(local); return AST_BRIDGE_TRANSFER_FAIL; } + publish_blind_transfer_full(is_external, AST_BRIDGE_TRANSFER_SUCCESS, transferer, bridge, + context, exten, transferee, local); return AST_BRIDGE_TRANSFER_SUCCESS; } @@ -4214,16 +4241,8 @@ static void publish_blind_transfer(int is_external, enum ast_transfer_result res struct ast_channel *transferer, struct ast_bridge *bridge, const char *context, const char *exten, struct ast_channel *transferee_channel) { - struct ast_bridge_channel_pair pair; - pair.channel = transferer; - pair.bridge = bridge; - if (bridge) { - ast_bridge_lock(bridge); - } - ast_bridge_publish_blind_transfer(is_external, result, &pair, context, exten, transferee_channel); - if (bridge) { - ast_bridge_unlock(bridge); - } + publish_blind_transfer_full(is_external, result, transferer, bridge, context, + exten, transferee_channel, NULL); } enum ast_transfer_result ast_bridge_transfer_blind(int is_external, @@ -4301,8 +4320,12 @@ enum ast_transfer_result ast_bridge_transfer_blind(int is_external, set_transfer_variables_all(transferer, channels, 0); if (do_bridge_transfer) { - transfer_result = blind_transfer_bridge(transferer, bridge, exten, context, - new_channel_cb, user_data_wrapper); + /* if blind_transfer_bridge succeeds, it publishes its own message */ + transfer_result = blind_transfer_bridge(is_external, transferer, bridge, + exten, context, transferee, new_channel_cb, user_data_wrapper); + if (transfer_result == AST_BRIDGE_TRANSFER_SUCCESS) { + return transfer_result; + } goto publish; } |