{
switch_channel_t *caller_channel = switch_core_session_get_channel(session);
switch_core_session_t *peer_session = NULL;
+
+ const char *transfer_on_fail = NULL;
+ char *tof_data = NULL;
+ char *tof_array[4] = { 0 };
+ int tof_arrayc = 0;
const char *continue_on_fail = NULL, *failure_causes = NULL,
*v_campon = NULL, *v_campon_retries, *v_campon_sleep, *v_campon_timeout, *v_campon_fallback_exten = NULL;
switch_call_cause_t cause = SWITCH_CAUSE_NORMAL_CLEARING;
}
continue_on_fail = switch_channel_get_variable(caller_channel, "continue_on_fail");
- failure_causes = switch_channel_get_variable(caller_channel, "failure_causes");
+ transfer_on_fail = switch_channel_get_variable(caller_channel, "transfer_on_fail");
+ tof_data = switch_core_session_strdup(session, transfer_on_fail);
+ tof_arrayc = switch_split(tof_data, ' ', tof_array);
+ transfer_on_fail = tof_array[0];
+
+ failure_causes = switch_channel_get_variable(caller_channel, "failure_causes");
+
if ((v_campon = switch_channel_get_variable(caller_channel, "campon")) && switch_true(v_campon)) {
const char *cid_name = NULL;
const char *cid_number = NULL;
return;
}
}
+
+ if (transfer_on_fail || failure_causes) {
+ const char *cause_str;
+ char cause_num[35] = "";
+
+ cause_str = switch_channel_cause2str(cause);
+ switch_snprintf(cause_num, sizeof(cause_num), "%u", cause);
+
+ if ((tof_array[1] == NULL ) || (!strcasecmp(tof_array[1], "auto_cause"))){
+ tof_array[1] = (char *) cause_str;
+ }
+
+ if (failure_causes) {
+ char *lbuf = switch_core_session_strdup(session, failure_causes);
+ char *argv[256] = { 0 };
+ int argc = switch_separate_string(lbuf, ',', argv, (sizeof(argv) / sizeof(argv[0])));
+ int i, x = 0;
+
+ for (i = 0; i < argc; i++) {
+ if (!strcasecmp(argv[i], cause_str) || !strcasecmp(argv[i], cause_num)) {
+ x++;
+ break;
+ }
+ }
+ if (!x) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
+ "Failure causes [%s]: Cause: %s\n", failure_causes, cause_str);
+
+ switch_ivr_session_transfer(session, tof_array[1], tof_array[2], tof_array[3]);
+ }
+ }
+
+ if (transfer_on_fail) {
+ if (switch_true(transfer_on_fail)) {
+ return;
+ } else {
+ char *lbuf = switch_core_session_strdup(session, transfer_on_fail);
+ char *argv[256] = { 0 };
+ int argc = switch_separate_string(lbuf, ',', argv, (sizeof(argv) / sizeof(argv[0])));
+ int i;
+
+ for (i = 0; i < argc; i++) {
+ if (!strcasecmp(argv[i], cause_str) || !strcasecmp(argv[i], cause_num)) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
+ "Transfer on fail [%s]: Cause: %s\n", transfer_on_fail, cause_str);
+ switch_ivr_session_transfer(session, tof_array[1], tof_array[2], tof_array[3]);
+ }
+ }
+ }
+ }
+ }
}
if (!switch_channel_test_flag(caller_channel, CF_TRANSFER) && switch_channel_get_state(caller_channel) != CS_ROUTING) {
switch_channel_hangup(caller_channel, cause);