diff --git a/src/include/switch_types.h b/src/include/switch_types.h index e86ca9ece4..f879783f38 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1190,6 +1190,7 @@ typedef enum { CF_SIMPLIFY, CF_ZOMBIE_EXEC, CF_INTERCEPT, + CF_INTERCEPTED, /* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */ /* IF YOU ADD NEW ONES CHECK IF THEY SHOULD PERSIST OR ZERO THEM IN switch_core_session.c switch_core_session_request_xml() */ CF_FLAG_MAX diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c index 2342c38c81..755bf326a1 100644 --- a/src/switch_ivr_bridge.c +++ b/src/switch_ivr_bridge.c @@ -1640,6 +1640,7 @@ SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session switch_channel_set_state(bchannel, CS_PARK); } + switch_channel_set_flag(channel, CF_INTERCEPTED); switch_ivr_uuid_bridge(switch_core_session_get_uuid(session), uuid); switch_core_session_rwunlock(rsession); diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 4e6258ce8f..c6ba313c84 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -3310,6 +3310,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_channel_set_variable(caller_channel, buf, buf2); } + if (caller_channel && switch_channel_test_flag(caller_channel, CF_INTERCEPTED)) { + *cause = SWITCH_CAUSE_PICKED_OFF; + } + if (!*cause) { if (reason) { *cause = reason; @@ -3419,6 +3423,9 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess if (!(state == CS_RESET || switch_channel_test_flag(originate_status[i].peer_channel, CF_TRANSFER) || switch_channel_test_flag(originate_status[i].peer_channel, CF_REDIRECT) || switch_channel_test_flag(originate_status[i].peer_channel, CF_BRIDGED))) { + if (caller_channel && switch_channel_test_flag(caller_channel, CF_INTERCEPTED)) { + switch_channel_set_flag(originate_status[i].peer_channel, CF_INTERCEPT); + } switch_channel_hangup(originate_status[i].peer_channel, *cause); } }