switch_channel_set_variable(other_channel, SWITCH_BRIDGE_VARIABLE, NULL);
if (switch_channel_up(other_channel)) {
-
+ if (switch_channel_test_flag(other_channel, CF_HANGUP_AFTER_BRIDGE)) {
+ switch_channel_hangup(other_channel, switch_channel_get_cause(channel));
+ }
+
if (switch_true(switch_channel_get_variable(other_channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) {
switch_ivr_park_session(other_session);
} else if ((var = switch_channel_get_variable(other_channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) {
!switch_channel_test_flag(caller_channel, CF_XFER_ZOMBIE) && !a_leg->clean_exit && !inner_bridge) {
if ((state != CS_EXECUTE && state != CS_SOFT_EXECUTE && state != CS_PARK && state != CS_ROUTING) ||
(switch_channel_test_flag(peer_channel, CF_ANSWERED) && state < CS_HANGUP)) {
+
+ if (switch_channel_test_flag(caller_channel, CF_HANGUP_AFTER_BRIDGE)) {
+ switch_channel_hangup(caller_channel, switch_channel_get_cause(peer_channel));
+ }
+
if (switch_true(switch_channel_get_variable(caller_channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) {
switch_ivr_park_session(session);
} else if ((var = switch_channel_get_variable(caller_channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) {
goto notready;
}
}
-
+
/* read from the channel while we wait if the audio is up on it */
if (oglobals.session &&
!switch_channel_test_flag(caller_channel, CF_PROXY_MODE) &&
const char *context = NULL;
const char *dialplan = NULL;
switch_core_session_t *holding_session;
-
+
if (caller_channel) {
if (zstr(context)) {
context = switch_channel_get_variable(caller_channel, "context");
if ((holding_session = switch_core_session_locate(holding))) {
switch_channel_t *holding_channel = switch_core_session_get_channel(holding_session);
switch_status_t mstatus = SWITCH_STATUS_FALSE;
-
+
if (caller_channel) {
if ((mstatus = switch_channel_caller_extension_masquerade(caller_channel, holding_channel, 1)) == SWITCH_STATUS_SUCCESS) {
switch_channel_restart(holding_channel);
}
force_reason = SWITCH_CAUSE_ATTENDED_TRANSFER;
} else {
+
if (peer_channel && switch_channel_ready(peer_channel)) {
+ switch_core_session_t *holding_session;
+
force_reason = SWITCH_CAUSE_ATTENDED_TRANSFER;
+
+ if ((holding_session = switch_core_session_locate(holding))) {
+ switch_channel_set_flag(switch_core_session_get_channel(holding_session), CF_HANGUP_AFTER_BRIDGE);
+ switch_core_session_rwunlock(holding_session);
+ }
+
switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(peer_session));
+ holding = NULL;
oglobals.idx = IDX_NADA;
if (caller_channel && switch_channel_up(caller_channel)) {
switch_channel_hangup(caller_channel, SWITCH_CAUSE_ATTENDED_TRANSFER);
if ((holding_session = switch_core_session_locate(holding))) {
switch_channel_t *holding_channel = switch_core_session_get_channel(holding_session);
+
if (caller_channel && switch_channel_ready(caller_channel)) {
switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(session));
+ holding = NULL;
} else {
switch_channel_hangup(holding_channel, SWITCH_CAUSE_NORMAL_UNSPECIFIED);
}
peer_session = NULL;
peer_channel = NULL;
-
}
for (i = 0; i < and_argc; i++) {