diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 1962fc0cff..33c5e2e6d0 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -443,6 +443,32 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat } + for (i = 0; i < len; i++) { + if (switch_channel_test_flag(originate_status[i].peer_channel, CF_CHANNEL_SWAP)) { + const char *key = switch_channel_get_variable(originate_status[i].peer_channel, "channel_swap_uuid"); + switch_core_session_t *swap_session, *old_session; + + if ((swap_session = switch_core_session_locate(key))) { + switch_channel_clear_flag(originate_status[i].peer_channel, CF_CHANNEL_SWAP); + switch_channel_hangup(originate_status[i].peer_channel, SWITCH_CAUSE_PICKED_OFF); + + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(originate_status[i].peer_channel), SWITCH_LOG_DEBUG, "Swapping %s for %s\n", + switch_core_session_get_name(swap_session), switch_channel_get_name(originate_status[i].peer_channel)); + + + old_session = originate_status[i].peer_session; + originate_status[i].peer_session = swap_session; + originate_status[i].peer_channel = switch_core_session_get_channel(originate_status[i].peer_session); + originate_status[i].caller_profile = switch_channel_get_caller_profile(originate_status[i].peer_channel); + switch_channel_set_flag(originate_status[i].peer_channel, CF_ORIGINATING); + + switch_channel_answer(originate_status[i].peer_channel); + switch_core_session_rwunlock(old_session); + break; + } + } + } + for (i = 0; i < len; i++) { switch_channel_state_t state; @@ -3195,7 +3221,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_channel_set_variable(caller_channel, SWITCH_SOFT_HOLDING_UUID_VARIABLE, NULL); } - if (holding && oglobals.idx != IDX_TIMEOUT && oglobals.idx != IDX_KEY_CANCEL) { + if (holding && oglobals.idx != IDX_TIMEOUT && oglobals.idx != IDX_KEY_CANCEL && oglobals.idx < 0) { switch_core_session_t *holding_session; if ((holding_session = switch_core_session_locate(holding))) { @@ -3214,7 +3240,6 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_core_session_rwunlock(holding_session); } switch_channel_set_flag(originate_status[i].peer_channel, CF_LAZY_ATTENDED_TRANSFER); - switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(originate_status[i].peer_session)); holding = NULL; } else { @@ -3547,27 +3572,6 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess if (*bleg) { switch_channel_t *bchan = switch_core_session_get_channel(*bleg); - - if (switch_channel_test_flag(bchan, CF_CHANNEL_SWAP)) { - const char *key = switch_channel_get_variable(bchan, "channel_swap_uuid"); - switch_core_session_t *swap_session, *old_session; - - if ((swap_session = switch_core_session_locate(key))) { - switch_channel_clear_flag(bchan, CF_CHANNEL_SWAP); - switch_channel_hangup(bchan, SWITCH_CAUSE_PICKED_OFF); - - switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(bchan), SWITCH_LOG_DEBUG, "Swapping %s for %s\n", - switch_core_session_get_name(swap_session), switch_channel_get_name(bchan)); - - old_session = *bleg; - *bleg = swap_session; - bchan = switch_core_session_get_channel(*bleg); - switch_channel_answer(bchan); - switch_core_session_rwunlock(old_session); - } - } - - if (session && caller_channel) { switch_caller_profile_t *cloned_profile, *peer_profile = switch_channel_get_caller_profile(switch_core_session_get_channel(*bleg));