diff options
Diffstat (limited to 'main/bridge_basic.c')
-rw-r--r-- | main/bridge_basic.c | 118 |
1 files changed, 37 insertions, 81 deletions
diff --git a/main/bridge_basic.c b/main/bridge_basic.c index a69750d15..97892e395 100644 --- a/main/bridge_basic.c +++ b/main/bridge_basic.c @@ -1606,33 +1606,21 @@ static void get_transfer_parties(struct ast_channel *transferer, struct ast_brid static void publish_transfer_success(struct attended_transfer_properties *props, struct ast_channel *transferee_channel, struct ast_channel *target_channel) { - struct ast_bridge_channel_pair transferee = { - .channel = props->transferer, - .bridge = props->transferee_bridge, - }; - struct ast_bridge_channel_pair transfer_target = { - .channel = props->transferer, - .bridge = props->target_bridge, - }; - - if (transferee.bridge && transfer_target.bridge) { - ast_bridge_lock_both(transferee.bridge, transfer_target.bridge); - } else if (transferee.bridge) { - ast_bridge_lock(transferee.bridge); - } else if (transfer_target.bridge) { - ast_bridge_lock(transfer_target.bridge); - } + struct ast_attended_transfer_message *transfer_msg; - ast_bridge_publish_attended_transfer_bridge_merge(0, AST_BRIDGE_TRANSFER_SUCCESS, - &transferee, &transfer_target, props->transferee_bridge, transferee_channel, - target_channel); + transfer_msg = ast_attended_transfer_message_create(0, props->transferer, + props->transferee_bridge, props->transferer, props->target_bridge, + transferee_channel, target_channel); - if (transferee.bridge) { - ast_bridge_unlock(transferee.bridge); - } - if (transfer_target.bridge) { - ast_bridge_unlock(transfer_target.bridge); + if (!transfer_msg) { + ast_log(LOG_ERROR, "Unable to publish successful attended transfer from %s\n", + ast_channel_name(props->transferer)); + return; } + + ast_attended_transfer_message_add_merge(transfer_msg, props->transferee_bridge); + ast_bridge_publish_attended_transfer(transfer_msg); + ao2_cleanup(transfer_msg); } /*! @@ -1641,37 +1629,22 @@ static void publish_transfer_success(struct attended_transfer_properties *props, static void publish_transfer_threeway(struct attended_transfer_properties *props, struct ast_channel *transferee_channel, struct ast_channel *target_channel) { - struct ast_bridge_channel_pair transferee = { - .channel = props->transferer, - .bridge = props->transferee_bridge, - }; - struct ast_bridge_channel_pair transfer_target = { - .channel = props->transferer, - .bridge = props->target_bridge, - }; - struct ast_bridge_channel_pair threeway = { - .channel = props->transferer, - .bridge = props->transferee_bridge, - }; + struct ast_attended_transfer_message *transfer_msg; - if (transferee.bridge && transfer_target.bridge) { - ast_bridge_lock_both(transferee.bridge, transfer_target.bridge); - } else if (transferee.bridge) { - ast_bridge_lock(transferee.bridge); - } else if (transfer_target.bridge) { - ast_bridge_lock(transfer_target.bridge); - } + transfer_msg = ast_attended_transfer_message_create(0, props->transferer, + props->transferee_bridge, props->transferer, props->target_bridge, + transferee_channel, target_channel); - ast_bridge_publish_attended_transfer_threeway(0, AST_BRIDGE_TRANSFER_SUCCESS, - &transferee, &transfer_target, &threeway, transferee_channel, - target_channel); - - if (transferee.bridge) { - ast_bridge_unlock(transferee.bridge); - } - if (transfer_target.bridge) { - ast_bridge_unlock(transfer_target.bridge); + if (!transfer_msg) { + ast_log(LOG_ERROR, "Unable to publish successful three-way transfer from %s\n", + ast_channel_name(props->transferer)); + return; } + + ast_attended_transfer_message_add_threeway(transfer_msg, props->transferer, + props->transferee_bridge); + ast_bridge_publish_attended_transfer(transfer_msg); + ao2_cleanup(transfer_msg); } /*! @@ -1679,38 +1652,21 @@ static void publish_transfer_threeway(struct attended_transfer_properties *props */ static void publish_transfer_fail(struct attended_transfer_properties *props) { - struct ast_bridge_channel_pair transferee = { - .channel = props->transferer, - .bridge = props->transferee_bridge, - }; - struct ast_bridge_channel_pair transfer_target = { - .channel = props->transferer, - .bridge = props->target_bridge, - }; - struct ast_channel *transferee_channel; - struct ast_channel *target_channel; - - if (transferee.bridge && transfer_target.bridge) { - ast_bridge_lock_both(transferee.bridge, transfer_target.bridge); - } else if (transferee.bridge) { - ast_bridge_lock(transferee.bridge); - } else if (transfer_target.bridge) { - ast_bridge_lock(transfer_target.bridge); - } + struct ast_attended_transfer_message *transfer_msg; - get_transfer_parties(props->transferer, props->transferee_bridge, props->target_bridge, - &transferee_channel, &target_channel); - ast_bridge_publish_attended_transfer_fail(0, AST_BRIDGE_TRANSFER_FAIL, - &transferee, &transfer_target, transferee_channel, target_channel); - ast_channel_cleanup(transferee_channel); - ast_channel_cleanup(target_channel); + transfer_msg = ast_attended_transfer_message_create(0, props->transferer, + props->transferee_bridge, props->transferer, props->target_bridge, + NULL, NULL); - if (transferee.bridge) { - ast_bridge_unlock(transferee.bridge); - } - if (transfer_target.bridge) { - ast_bridge_unlock(transfer_target.bridge); + if (!transfer_msg) { + ast_log(LOG_ERROR, "Unable to publish failed transfer from %s\n", + ast_channel_name(props->transferer)); + return; } + + transfer_msg->result = AST_BRIDGE_TRANSFER_FAIL; + ast_bridge_publish_attended_transfer(transfer_msg); + ao2_cleanup(transfer_msg); } /*! |