switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s CHANNEL EXECUTE\n", switch_channel_get_name(channel));
-
- if (switch_test_flag(tech_pvt, TFLAG_BOWOUT) || switch_test_flag(tech_pvt, TFLAG_BLEG)) {
- bow = 0;
- } else if ((bowout = switch_channel_get_variable(tech_pvt->channel, "loopback_bowout_on_execute")) && switch_true(bowout)) {
+ if ((bowout = switch_channel_get_variable(tech_pvt->channel, "loopback_bowout_on_execute")) && switch_true(bowout)) {
/* loopback_bowout_on_execute variable is set */
bow = 1;
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "WILL BOW\n");
} else if ((exten = switch_channel_get_caller_extension(channel))) {
/* check for bowout flag */
switch_caller_application_t *app_p;
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "CHEKCING APPS\n");
for (app_p = exten->applications; app_p; app_p = app_p->next) {
int32_t flags;
switch_core_session_get_app_flags(app_p->application_name, &flags);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "CHECK %s %d\n", app_p->application_name, (flags & SAF_NO_LOOPBACK));
if ((flags & SAF_NO_LOOPBACK)) {
bow = 1;
switch_core_session_t *other_session = NULL;
switch_caller_profile_t *cp, *clone;
const char *other_uuid = NULL;
-
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "BOWING\n");
switch_set_flag(tech_pvt, TFLAG_BOWOUT);
if ((find_non_loopback_bridge(tech_pvt->other_session, &other_session, &other_uuid) == SWITCH_STATUS_SUCCESS)) {
switch_channel_t *other_channel = switch_core_session_get_channel(other_session);
- /* Wait for real channel to be exchanging media */
- switch_channel_wait_for_state(other_channel, channel, CS_EXCHANGE_MEDIA);
+ if (switch_channel_test_flag(other_channel, CF_BRIDGED)) {
+ /* Wait for real channel to be exchanging media */
+ switch_channel_wait_for_state(other_channel, channel, CS_EXCHANGE_MEDIA);
+ }
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_INFO, "BOWOUT Replacing loopback channel with real channel: %s\n",
switch_channel_get_name(other_channel));
switch_channel_t *channel;
loopback_private_t *tech_pvt;
int done = 1, pass = 0;
+ switch_core_session_t *other_session;
channel = switch_core_session_get_channel(session);
switch_assert(channel != NULL);
pass = 1;
}
break;
+ case SWITCH_MESSAGE_INDICATE_DEFLECT:
+ {
+ pass = 0;
+
+ if (!zstr(msg->string_arg) && switch_core_session_get_partner(tech_pvt->other_session, &other_session) == SWITCH_STATUS_SUCCESS) {
+ char *ext = switch_core_session_strdup(other_session, msg->string_arg);
+ char *context = NULL, *dp = NULL;
+
+ if ((context = strchr(ext, ' '))) {
+ *context++ = '\0';
+
+ if ((dp = strchr(context, ' '))) {
+ *dp++ = '\0';
+ }
+ }
+ switch_ivr_session_transfer(other_session, ext, context, dp);
+ switch_core_session_rwunlock(other_session);
+ }
+ }
+ break;
default:
break;
}
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "done:%d pass:%d running:%d\n", done, pass, switch_test_flag(tech_pvt, TFLAG_RUNNING_APP));
if (!done && tech_pvt->other_session && (pass || switch_test_flag(tech_pvt, TFLAG_RUNNING_APP))) {
switch_status_t r = SWITCH_STATUS_FALSE;
- switch_core_session_t *other_session;
if (switch_core_session_get_partner(tech_pvt->other_session, &other_session) == SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "PASS TO %s\n", switch_core_session_get_name(other_session));
r = switch_core_session_receive_message(other_session, msg);
switch_core_session_rwunlock(other_session);
}