MODENDP-259
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15368 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
f10403636d
commit
befbd6dd0c
|
@ -929,6 +929,7 @@ typedef enum {
|
||||||
CF_NOT_READY,
|
CF_NOT_READY,
|
||||||
CF_SIGNAL_BRIDGE_TTL,
|
CF_SIGNAL_BRIDGE_TTL,
|
||||||
CF_MEDIA_BRIDGE_TTL,
|
CF_MEDIA_BRIDGE_TTL,
|
||||||
|
CF_HANGUP_AFTER_BRIDGE,
|
||||||
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
|
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
|
||||||
CF_FLAG_MAX
|
CF_FLAG_MAX
|
||||||
} switch_channel_flag_t;
|
} switch_channel_flag_t;
|
||||||
|
|
|
@ -793,6 +793,9 @@ static switch_status_t signal_bridge_on_hangup(switch_core_session_t *session)
|
||||||
switch_channel_set_variable(other_channel, SWITCH_BRIDGE_VARIABLE, NULL);
|
switch_channel_set_variable(other_channel, SWITCH_BRIDGE_VARIABLE, NULL);
|
||||||
|
|
||||||
if (switch_channel_up(other_channel)) {
|
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))) {
|
if (switch_true(switch_channel_get_variable(other_channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) {
|
||||||
switch_ivr_park_session(other_session);
|
switch_ivr_park_session(other_session);
|
||||||
|
@ -1123,6 +1126,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_multi_threaded_bridge(switch_core_ses
|
||||||
!switch_channel_test_flag(caller_channel, CF_XFER_ZOMBIE) && !a_leg->clean_exit && !inner_bridge) {
|
!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) ||
|
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)) {
|
(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))) {
|
if (switch_true(switch_channel_get_variable(caller_channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) {
|
||||||
switch_ivr_park_session(session);
|
switch_ivr_park_session(session);
|
||||||
} else if ((var = switch_channel_get_variable(caller_channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) {
|
} else if ((var = switch_channel_get_variable(caller_channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) {
|
||||||
|
|
|
@ -2333,9 +2333,19 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
|
||||||
}
|
}
|
||||||
force_reason = SWITCH_CAUSE_ATTENDED_TRANSFER;
|
force_reason = SWITCH_CAUSE_ATTENDED_TRANSFER;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (peer_channel && switch_channel_ready(peer_channel)) {
|
if (peer_channel && switch_channel_ready(peer_channel)) {
|
||||||
|
switch_core_session_t *holding_session;
|
||||||
|
|
||||||
force_reason = SWITCH_CAUSE_ATTENDED_TRANSFER;
|
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));
|
switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(peer_session));
|
||||||
|
holding = NULL;
|
||||||
oglobals.idx = IDX_NADA;
|
oglobals.idx = IDX_NADA;
|
||||||
if (caller_channel && switch_channel_up(caller_channel)) {
|
if (caller_channel && switch_channel_up(caller_channel)) {
|
||||||
switch_channel_hangup(caller_channel, SWITCH_CAUSE_ATTENDED_TRANSFER);
|
switch_channel_hangup(caller_channel, SWITCH_CAUSE_ATTENDED_TRANSFER);
|
||||||
|
@ -2349,8 +2359,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
|
||||||
|
|
||||||
if ((holding_session = switch_core_session_locate(holding))) {
|
if ((holding_session = switch_core_session_locate(holding))) {
|
||||||
switch_channel_t *holding_channel = switch_core_session_get_channel(holding_session);
|
switch_channel_t *holding_channel = switch_core_session_get_channel(holding_session);
|
||||||
|
|
||||||
if (caller_channel && switch_channel_ready(caller_channel)) {
|
if (caller_channel && switch_channel_ready(caller_channel)) {
|
||||||
switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(session));
|
switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(session));
|
||||||
|
holding = NULL;
|
||||||
} else {
|
} else {
|
||||||
switch_channel_hangup(holding_channel, SWITCH_CAUSE_NORMAL_UNSPECIFIED);
|
switch_channel_hangup(holding_channel, SWITCH_CAUSE_NORMAL_UNSPECIFIED);
|
||||||
}
|
}
|
||||||
|
@ -2361,7 +2373,6 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
|
||||||
|
|
||||||
peer_session = NULL;
|
peer_session = NULL;
|
||||||
peer_channel = NULL;
|
peer_channel = NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < and_argc; i++) {
|
for (i = 0; i < and_argc; i++) {
|
||||||
|
|
Loading…
Reference in New Issue