int fs_switch_ivr_originate(switch_core_session_t *session, switch_core_session_t **bleg, char *bridgeto, uint32_t timelimit_sec) /*const switch_state_handler_table_t *table, char * cid_name_override, char * cid_num_override, switch_caller_profile_t *caller_profile_override) */ { switch_channel_t *caller_channel; switch_core_session_t *peer_session; unsigned int timelimit = 60; char *var; switch_call_cause_t cause = SWITCH_CAUSE_NORMAL_CLEARING; caller_channel = switch_core_session_get_channel(session); assert(caller_channel != NULL); if ((var = switch_channel_get_variable(caller_channel, "call_timeout"))) { timelimit = atoi(var); } if (switch_ivr_originate(session, &peer_session, &cause, bridgeto, timelimit, NULL, NULL, NULL, NULL, SOF_NONE) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_NOTICE, "Cannot Create Outgoing Channel!\n"); switch_channel_hangup(caller_channel, SWITCH_CAUSE_REQUESTED_CHAN_UNAVAIL); return; } else { switch_ivr_multi_threaded_bridge(session, peer_session, NULL, NULL, NULL); switch_core_session_rwunlock(peer_session); } }
SWITCH_DECLARE_CONSTRUCTOR CoreSession::CoreSession(char *nuuid, CoreSession *a_leg) { switch_channel_t *other_channel = NULL; init_vars(); if (a_leg && a_leg->session) { other_channel = switch_core_session_get_channel(a_leg->session); } if (!strchr(nuuid, '/') && (session = switch_core_session_force_locate(nuuid))) { uuid = strdup(nuuid); channel = switch_core_session_get_channel(session); allocated = 1; } else { cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; if (switch_ivr_originate(a_leg ? a_leg->session : NULL, &session, &cause, nuuid, 60, NULL, NULL, NULL, NULL, NULL, SOF_NONE, NULL) == SWITCH_STATUS_SUCCESS) { channel = switch_core_session_get_channel(session); allocated = 1; switch_set_flag(this, S_HUP); uuid = strdup(switch_core_session_get_uuid(session)); switch_channel_set_state(switch_core_session_get_channel(session), CS_SOFT_EXECUTE); switch_channel_wait_for_state(channel, other_channel, CS_SOFT_EXECUTE); } } }
SWITCH_DECLARE(int) CoreSession::originate(CoreSession *a_leg_session, char *dest, int timeout, switch_state_handler_table_t *handlers) { switch_core_session_t *aleg_core_session = NULL; this_check(0); cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; if (a_leg_session != NULL) { aleg_core_session = a_leg_session->session; } // this session has no valid switch_core_session_t at this point, and therefore // no valid channel. since the threadstate is stored in the channel, and there // is none, if we try to call begin_alllow_threads it will fail miserably. // use the 'a leg session' to do the thread swapping stuff. if (a_leg_session) a_leg_session->begin_allow_threads(); if (switch_ivr_originate(aleg_core_session, &session, &cause, dest, timeout, handlers, NULL, NULL, NULL, NULL, SOF_NONE, NULL) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Error Creating Outgoing Channel! [%s]\n", dest); goto failed; } if (a_leg_session) a_leg_session->end_allow_threads(); channel = switch_core_session_get_channel(session); allocated = 1; switch_safe_free(uuid); uuid = strdup(switch_core_session_get_uuid(session)); switch_channel_set_state(switch_core_session_get_channel(session), CS_SOFT_EXECUTE); return SWITCH_STATUS_SUCCESS; failed: if (a_leg_session) a_leg_session->end_allow_threads(); return SWITCH_STATUS_FALSE; }