From bfd02beef8f231e42117206437280ceb3478e4f8 Mon Sep 17 00:00:00 2001 From: Mike Jerris <mike@signalwire.com> Date: Thu, 7 May 2020 11:04:54 -0600 Subject: [PATCH] [core] refactor originate internals (oglobals) --- src/switch_ivr_originate.c | 481 +++++++++++++++++++------------------ 1 file changed, 242 insertions(+), 239 deletions(-) diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 4120513c58..48ec669a31 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -152,6 +152,7 @@ typedef struct { switch_caller_profile_t *caller_profile_override; switch_bool_t check_vars; switch_memory_pool_t *pool; + originate_status_t originate_status[MAX_PEERS];// = { {0} }; } originate_global_t; @@ -281,7 +282,7 @@ static void launch_collect_thread(struct key_collect *collect) } static int check_per_channel_timeouts(originate_global_t *oglobals, - originate_status_t *originate_status, int max, time_t start, switch_call_cause_t *force_reason) + int max, time_t start, switch_call_cause_t *force_reason) { int x = 0, i, delayed_channels = 0, active_channels = 0; uint32_t early_exit_time = 0, delayed_min = 0; @@ -289,9 +290,9 @@ static int check_per_channel_timeouts(originate_global_t *oglobals, time_t elapsed = switch_epoch_time_now(NULL) - start; for (i = 0; i < max; i++) { - if (originate_status[i].peer_channel && switch_channel_get_state(originate_status[i].peer_channel) != CS_DESTROY && - switch_channel_get_state(originate_status[i].peer_channel) != CS_REPORTING) { - if (originate_status[i].per_channel_delay_start) { + if (oglobals->originate_status[i].peer_channel && switch_channel_get_state(oglobals->originate_status[i].peer_channel) != CS_DESTROY && + switch_channel_get_state(oglobals->originate_status[i].peer_channel) != CS_REPORTING) { + if (oglobals->originate_status[i].per_channel_delay_start) { delayed_channels++; } else { active_channels++; @@ -301,56 +302,56 @@ static int check_per_channel_timeouts(originate_global_t *oglobals, if (active_channels == 0 && delayed_channels) { for (i = 0; i < max; i++) { - if (originate_status[i].peer_channel && originate_status[i].per_channel_delay_start && - (!delayed_min || delayed_min > originate_status[i].per_channel_delay_start)) { - delayed_min = originate_status[i].per_channel_delay_start; + if (oglobals->originate_status[i].peer_channel && oglobals->originate_status[i].per_channel_delay_start && + (!delayed_min || delayed_min > oglobals->originate_status[i].per_channel_delay_start)) { + delayed_min = oglobals->originate_status[i].per_channel_delay_start; } } early_exit_time = delayed_min - (uint32_t) elapsed; } for (i = 0; i < max; i++) { - if (originate_status[i].peer_channel && originate_status[i].per_channel_delay_start && - (elapsed > originate_status[i].per_channel_delay_start || active_channels == 0)) { + if (oglobals->originate_status[i].peer_channel && oglobals->originate_status[i].per_channel_delay_start && + (elapsed > oglobals->originate_status[i].per_channel_delay_start || active_channels == 0)) { if (active_channels == 0) { - if (originate_status[i].per_channel_timelimit_sec) { - if (originate_status[i].per_channel_timelimit_sec > early_exit_time) { + if (oglobals->originate_status[i].per_channel_timelimit_sec) { + if (oglobals->originate_status[i].per_channel_timelimit_sec > early_exit_time) { /* IN theory this check is not needed ( should just be if !0 then -= with no else), if its not 0 it should always be greater.... */ - originate_status[i].per_channel_timelimit_sec -= early_exit_time; + oglobals->originate_status[i].per_channel_timelimit_sec -= early_exit_time; } else { - originate_status[i].per_channel_timelimit_sec = 1; + oglobals->originate_status[i].per_channel_timelimit_sec = 1; } } - if (originate_status[i].per_channel_progress_timelimit_sec) { - if (originate_status[i].per_channel_progress_timelimit_sec > early_exit_time) { + if (oglobals->originate_status[i].per_channel_progress_timelimit_sec) { + if (oglobals->originate_status[i].per_channel_progress_timelimit_sec > early_exit_time) { /* IN theory this check is not needed ( should just be if !0 then -= with no else), if its not 0 it should always be greater.... */ - originate_status[i].per_channel_progress_timelimit_sec -= early_exit_time; + oglobals->originate_status[i].per_channel_progress_timelimit_sec -= early_exit_time; } else { - originate_status[i].per_channel_progress_timelimit_sec = 1; + oglobals->originate_status[i].per_channel_progress_timelimit_sec = 1; } } - originate_status[i].per_channel_delay_start -= delayed_min; + oglobals->originate_status[i].per_channel_delay_start -= delayed_min; } else { - originate_status[i].per_channel_delay_start = 0; + oglobals->originate_status[i].per_channel_delay_start = 0; } - if (!originate_status[i].per_channel_delay_start) { - switch_channel_clear_flag(originate_status[i].peer_channel, CF_BLOCK_STATE); + if (!oglobals->originate_status[i].per_channel_delay_start) { + switch_channel_clear_flag(oglobals->originate_status[i].peer_channel, CF_BLOCK_STATE); } } - if (originate_status[i].peer_channel && switch_channel_up_nosig(originate_status[i].peer_channel)) { - if (originate_status[i].per_channel_progress_timelimit_sec && elapsed > originate_status[i].per_channel_progress_timelimit_sec && - !(switch_channel_test_flag(originate_status[i].peer_channel, CF_RING_READY) || - switch_channel_test_flag(originate_status[i].peer_channel, CF_ANSWERED) || - (!oglobals->monitor_early_media_ring && switch_channel_test_flag(originate_status[i].peer_channel, CF_EARLY_MEDIA)) + if (oglobals->originate_status[i].peer_channel && switch_channel_up_nosig(oglobals->originate_status[i].peer_channel)) { + if (oglobals->originate_status[i].per_channel_progress_timelimit_sec && elapsed > oglobals->originate_status[i].per_channel_progress_timelimit_sec && + !(switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_RING_READY) || + switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_ANSWERED) || + (!oglobals->monitor_early_media_ring && switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_EARLY_MEDIA)) ) ) { - switch_channel_hangup(originate_status[i].peer_channel, SWITCH_CAUSE_PROGRESS_TIMEOUT); + switch_channel_hangup(oglobals->originate_status[i].peer_channel, SWITCH_CAUSE_PROGRESS_TIMEOUT); *force_reason = SWITCH_CAUSE_PROGRESS_TIMEOUT; x++; } - if (originate_status[i].per_channel_timelimit_sec && elapsed > originate_status[i].per_channel_timelimit_sec) { - switch_channel_hangup(originate_status[i].peer_channel, SWITCH_CAUSE_ALLOTTED_TIMEOUT); + if (oglobals->originate_status[i].per_channel_timelimit_sec && elapsed > oglobals->originate_status[i].per_channel_timelimit_sec) { + switch_channel_hangup(oglobals->originate_status[i].peer_channel, SWITCH_CAUSE_ALLOTTED_TIMEOUT); x++; } } @@ -359,6 +360,7 @@ static int check_per_channel_timeouts(originate_global_t *oglobals, return x; } + static switch_bool_t monitor_callback(switch_core_session_t *session, const char *app, const char *data) { if (app) { @@ -448,7 +450,7 @@ static void inherit_codec(switch_channel_t *caller_channel, switch_core_session_ } } -static uint8_t check_channel_status(originate_global_t *oglobals, originate_status_t *originate_status, uint32_t len, switch_call_cause_t *force_reason) +static uint8_t check_channel_status(originate_global_t *oglobals, uint32_t len, switch_call_cause_t *force_reason) { uint32_t i; @@ -473,29 +475,29 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat for (i = 0; i < len; i++) { - if (originate_status[i].peer_channel && switch_channel_test_flag(originate_status[i].peer_channel, CF_CHANNEL_SWAP)) { - const char *key = switch_channel_get_variable(originate_status[i].peer_channel, "channel_swap_uuid"); + if (oglobals->originate_status[i].peer_channel && switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_CHANNEL_SWAP)) { + const char *key = switch_channel_get_variable(oglobals->originate_status[i].peer_channel, "channel_swap_uuid"); switch_core_session_t *swap_session, *old_session; - + if ((swap_session = switch_core_session_locate(key))) { - switch_channel_clear_flag(originate_status[i].peer_channel, CF_CHANNEL_SWAP); - switch_channel_hangup(originate_status[i].peer_channel, SWITCH_CAUSE_PICKED_OFF); + switch_channel_clear_flag(oglobals->originate_status[i].peer_channel, CF_CHANNEL_SWAP); + switch_channel_hangup(oglobals->originate_status[i].peer_channel, SWITCH_CAUSE_PICKED_OFF); - switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(originate_status[i].peer_channel), SWITCH_LOG_DEBUG, "Swapping %s for %s\n", - switch_core_session_get_name(swap_session), switch_channel_get_name(originate_status[i].peer_channel)); + switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(oglobals->originate_status[i].peer_channel), SWITCH_LOG_DEBUG, "Swapping %s for %s\n", + switch_core_session_get_name(swap_session), switch_channel_get_name(oglobals->originate_status[i].peer_channel)); - old_session = originate_status[i].peer_session; - originate_status[i].peer_session = swap_session; - originate_status[i].peer_channel = switch_core_session_get_channel(originate_status[i].peer_session); - originate_status[i].caller_profile = switch_channel_get_caller_profile(originate_status[i].peer_channel); - switch_channel_set_flag(originate_status[i].peer_channel, CF_ORIGINATING); + old_session = oglobals->originate_status[i].peer_session; + oglobals->originate_status[i].peer_session = swap_session; + oglobals->originate_status[i].peer_channel = switch_core_session_get_channel(oglobals->originate_status[i].peer_session); + oglobals->originate_status[i].caller_profile = switch_channel_get_caller_profile(oglobals->originate_status[i].peer_channel); + switch_channel_set_flag(oglobals->originate_status[i].peer_channel, CF_ORIGINATING); - switch_channel_answer(originate_status[i].peer_channel); + switch_channel_answer(oglobals->originate_status[i].peer_channel); - switch_channel_set_variable(originate_status[i].peer_channel, "picked_up_uuid", switch_core_session_get_uuid(old_session)); - switch_channel_execute_on(originate_status[i].peer_channel, "execute_on_pickup"); - switch_channel_api_on(originate_status[i].peer_channel, "api_on_pickup"); + switch_channel_set_variable(oglobals->originate_status[i].peer_channel, "picked_up_uuid", switch_core_session_get_uuid(old_session)); + switch_channel_execute_on(oglobals->originate_status[i].peer_channel, "execute_on_pickup"); + switch_channel_api_on(oglobals->originate_status[i].peer_channel, "api_on_pickup"); switch_core_session_rwunlock(old_session); break; @@ -506,15 +508,15 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat for (i = 0; i < len; i++) { switch_channel_state_t state; - if (originate_status[i].tagged && originate_status[i].peer_session) { - switch_channel_t *channel = switch_core_session_get_channel(originate_status[i].peer_session); + if (oglobals->originate_status[i].tagged && oglobals->originate_status[i].peer_session) { + switch_channel_t *channel = switch_core_session_get_channel(oglobals->originate_status[i].peer_session); uint32_t j; if (switch_channel_down_nosig(channel)) { switch_call_cause_t cause = switch_channel_get_cause(channel); for (j = 0; j < len; j++) { - channel = switch_core_session_get_channel(originate_status[j].peer_session); + channel = switch_core_session_get_channel(oglobals->originate_status[j].peer_session); switch_channel_hangup(channel, cause); } oglobals->hups = len; @@ -524,20 +526,20 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat } - if (originate_status[i].peer_channel && switch_channel_test_flag(originate_status[i].peer_channel, CF_PICKUP)) { - if (originate_status[i].per_channel_timelimit_sec == 0) { + if (oglobals->originate_status[i].peer_channel && switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_PICKUP)) { + if (oglobals->originate_status[i].per_channel_timelimit_sec == 0) { pickups_without_timelimit++; } } - if (!(originate_status[i].peer_channel && originate_status[i].peer_session)) { + if (!(oglobals->originate_status[i].peer_channel && oglobals->originate_status[i].peer_session)) { oglobals->hups++; continue; } - if ((ring_ready_val = (uint8_t)switch_channel_test_flag(originate_status[i].peer_channel, CF_RING_READY))) { - if (!originate_status[i].ring_ready) { - originate_status[i].ring_ready = ring_ready_val; + if ((ring_ready_val = (uint8_t)switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_RING_READY))) { + if (!oglobals->originate_status[i].ring_ready) { + oglobals->originate_status[i].ring_ready = ring_ready_val; } if (oglobals->sending_ringback == 1) { @@ -548,7 +550,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat oglobals->ring_ready = ring_ready_val; if (caller_channel && !oglobals->ignore_ring_ready) { if (len == 1) { - switch_channel_pass_callee_id(originate_status[0].peer_channel, caller_channel); + switch_channel_pass_callee_id(oglobals->originate_status[0].peer_channel, caller_channel); } switch_channel_ring_ready_value(caller_channel, ring_ready_val); oglobals->sent_ring = ring_ready_val; @@ -557,7 +559,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat } } - if (switch_channel_test_flag(originate_status[i].peer_channel, CF_EARLY_MEDIA)) { + if (switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_EARLY_MEDIA)) { if (oglobals->ignore_early_media == 3 && oglobals->bridge_early_media == -1) { oglobals->bridge_early_media = i; @@ -568,19 +570,19 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat send_ringback++; pindex = (uint32_t) i; } else if (!oglobals->sent_ring && oglobals->ignore_early_media == 2 && len == 1 && caller_channel && !oglobals->ignore_ring_ready) { - switch_channel_pass_callee_id(originate_status[0].peer_channel, caller_channel); + switch_channel_pass_callee_id(oglobals->originate_status[0].peer_channel, caller_channel); switch_channel_ring_ready(caller_channel); oglobals->sent_ring = 1; } - if (!originate_status[i].early_media) { - originate_status[i].early_media = 1; + if (!oglobals->originate_status[i].early_media) { + oglobals->originate_status[i].early_media = 1; if (oglobals->early_ok) { pindex = i; } if (oglobals->monitor_early_media_fail) { - const char *var = switch_channel_get_variable(originate_status[i].peer_channel, "monitor_early_media_fail"); + const char *var = switch_channel_get_variable(oglobals->originate_status[i].peer_channel, "monitor_early_media_fail"); if (!zstr(var)) { char *fail_array[128] = { 0 }; int fail_count = 0; @@ -597,14 +599,14 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat char *p, *q; if (!(p = strchr(cause, ':'))) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); continue; } *p++ = '\0'; if (!p) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); continue; } @@ -615,13 +617,13 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat if (!(p = strchr(p, ':'))) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); continue; } *p++ = '\0'; if (!p) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); continue; } @@ -631,7 +633,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat } } switch_snprintf(bug_key, sizeof(bug_key), "monitor_early_media_fail_%d", ++y); - switch_ivr_tone_detect_session(originate_status[i].peer_session, bug_key, p, "r", 0, hits, "fail", cause, monitor_callback); + switch_ivr_tone_detect_session(oglobals->originate_status[i].peer_session, bug_key, p, "r", 0, hits, "fail", cause, monitor_callback); } @@ -641,8 +643,8 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat } if (oglobals->monitor_early_media_ring) { - const char *var = switch_channel_get_variable(originate_status[i].peer_channel, "monitor_early_media_ring"); - const char *var_total = switch_channel_get_variable(originate_status[i].peer_channel, "monitor_early_media_ring_total"); + const char *var = switch_channel_get_variable(oglobals->originate_status[i].peer_channel, "monitor_early_media_ring"); + const char *var_total = switch_channel_get_variable(oglobals->originate_status[i].peer_channel, "monitor_early_media_ring_total"); if (!zstr(var)) { char *ring_array[128] = { 0 }; int ring_count = 0; @@ -658,7 +660,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat char *p = ring_array[fx], *q; if (!p) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); continue; } @@ -667,13 +669,13 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat } if (!(p = strchr(p, ':'))) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); continue; } *p++ = '\0'; if (!p) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_ERROR, "Parse Error\n"); continue; } @@ -683,17 +685,17 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat } } - switch_channel_set_private(originate_status[i].peer_channel, "_oglobals_", oglobals); + switch_channel_set_private(oglobals->originate_status[i].peer_channel, "_oglobals_", oglobals); switch_snprintf(bug_key, sizeof(bug_key), "monitor_early_media_ring_%d", ++y); - switch_ivr_tone_detect_session(originate_status[i].peer_session, bug_key, p, "r", 0, hits, "ring", NULL, monitor_callback); + switch_ivr_tone_detect_session(oglobals->originate_status[i].peer_session, bug_key, p, "r", 0, hits, "ring", NULL, monitor_callback); } if (var_total) { int tmp = atoi(var_total); if (tmp > 0 && tmp < 100) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(originate_status[i].peer_session), SWITCH_LOG_DEBUG, - "%s setting ring total to %d\n", switch_channel_get_name(originate_status[i].peer_channel), tmp); + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(oglobals->originate_status[i].peer_session), SWITCH_LOG_DEBUG, + "%s setting ring total to %d\n", switch_channel_get_name(oglobals->originate_status[i].peer_channel), tmp); oglobals->monitor_early_media_ring_total = tmp; } } @@ -717,22 +719,22 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat } } - if (!switch_channel_test_flag(originate_status[i].peer_channel, CF_PARK) && - !switch_channel_test_flag(originate_status[i].peer_channel, CF_CONSUME_ON_ORIGINATE)) { - if (switch_core_session_messages_waiting(originate_status[i].peer_session)) { - if (switch_channel_test_flag(originate_status[i].peer_channel, CF_THREAD_SLEEPING)) { - switch_core_session_wake_session_thread(originate_status[i].peer_session); + if (!switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_PARK) && + !switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_CONSUME_ON_ORIGINATE)) { + if (switch_core_session_messages_waiting(oglobals->originate_status[i].peer_session)) { + if (switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_THREAD_SLEEPING)) { + switch_core_session_wake_session_thread(oglobals->originate_status[i].peer_session); } else { - switch_ivr_parse_all_events(originate_status[i].peer_session); + switch_ivr_parse_all_events(oglobals->originate_status[i].peer_session); } } } - if (switch_channel_test_flag(originate_status[i].peer_channel, CF_EARLY_OK)) { + if (switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_EARLY_OK)) { if (!oglobals->early_ok) { oglobals->early_ok = 1; } - switch_channel_clear_flag(originate_status[i].peer_channel, CF_EARLY_OK); + switch_channel_clear_flag(oglobals->originate_status[i].peer_channel, CF_EARLY_OK); } if (caller_channel && switch_channel_test_flag(caller_channel, CF_EARLY_OK)) { @@ -742,24 +744,24 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat switch_channel_clear_flag(caller_channel, CF_EARLY_OK); } - state = switch_channel_get_state(originate_status[i].peer_channel); - if (state >= CS_HANGUP || state == CS_RESET || switch_channel_test_flag(originate_status[i].peer_channel, CF_TRANSFER) || - switch_channel_test_flag(originate_status[i].peer_channel, CF_REDIRECT) || - switch_channel_test_flag(originate_status[i].peer_channel, CF_BRIDGED) || - !switch_channel_test_flag(originate_status[i].peer_channel, CF_ORIGINATING) + state = switch_channel_get_state(oglobals->originate_status[i].peer_channel); + if (state >= CS_HANGUP || state == CS_RESET || switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_TRANSFER) || + switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_REDIRECT) || + switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_BRIDGED) || + !switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_ORIGINATING) ) { (oglobals->hups)++; - if (switch_channel_test_flag(originate_status[i].peer_channel, CF_PICKUP)) { - if (originate_status[i].per_channel_timelimit_sec == 0) { + if (switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_PICKUP)) { + if (oglobals->originate_status[i].per_channel_timelimit_sec == 0) { pickups_without_timelimit--; } } - } else if ((switch_channel_test_flag(originate_status[i].peer_channel, CF_ANSWERED) || - (oglobals->early_ok && switch_channel_test_flag(originate_status[i].peer_channel, CF_EARLY_MEDIA)) || + } else if ((switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_ANSWERED) || + (oglobals->early_ok && switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_EARLY_MEDIA)) || (oglobals->ring_ready && oglobals->return_ring_ready && len == 1 && - switch_channel_test_flag(originate_status[i].peer_channel, CF_RING_READY)) + switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_RING_READY)) ) - && !switch_channel_test_flag(originate_status[i].peer_channel, CF_TAGGED) + && !switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_TAGGED) ) { if (!zstr(oglobals->key)) { @@ -767,20 +769,20 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat if (oglobals->cancel_timeout == SWITCH_TRUE) { /* cancel timeout for this leg only */ - originate_status[i].per_channel_progress_timelimit_sec = 0; - originate_status[i].per_channel_timelimit_sec = 0; + oglobals->originate_status[i].per_channel_progress_timelimit_sec = 0; + oglobals->originate_status[i].per_channel_timelimit_sec = 0; } - if ((collect = switch_core_session_alloc(originate_status[i].peer_session, sizeof(*collect)))) { - switch_channel_set_flag(originate_status[i].peer_channel, CF_TAGGED); + if ((collect = switch_core_session_alloc(oglobals->originate_status[i].peer_session, sizeof(*collect)))) { + switch_channel_set_flag(oglobals->originate_status[i].peer_channel, CF_TAGGED); if (!zstr(oglobals->key)) { - collect->key = switch_core_session_strdup(originate_status[i].peer_session, oglobals->key); + collect->key = switch_core_session_strdup(oglobals->originate_status[i].peer_session, oglobals->key); } if (!zstr(oglobals->file)) { - collect->file = switch_core_session_strdup(originate_status[i].peer_session, oglobals->file); + collect->file = switch_core_session_strdup(oglobals->originate_status[i].peer_session, oglobals->file); } if (!zstr(oglobals->error_file)) { - collect->error_file = switch_core_session_strdup(originate_status[i].peer_session, oglobals->error_file); + collect->error_file = switch_core_session_strdup(oglobals->originate_status[i].peer_session, oglobals->error_file); } if (oglobals->confirm_timeout) { @@ -789,8 +791,8 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat collect->confirm_timeout = 5000; } - switch_channel_audio_sync(originate_status[i].peer_channel); - collect->session = originate_status[i].peer_session; + switch_channel_audio_sync(oglobals->originate_status[i].peer_channel); + collect->session = oglobals->originate_status[i].peer_session; launch_collect_thread(collect); } } else { @@ -800,7 +802,7 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat goto end; } - } else if (switch_channel_test_flag(originate_status[i].peer_channel, CF_WINNER)) { + } else if (switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_WINNER)) { oglobals->idx = i; rval = 0; pindex = (uint32_t) i; @@ -819,17 +821,17 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat if (rval == 0 && pickups_without_timelimit) { for (i = 0; i < len; i++) { - if (originate_status[i].peer_channel && switch_channel_test_flag(originate_status[i].peer_channel, CF_PICKUP) && - switch_channel_up(originate_status[i].peer_channel)) { - switch_channel_hangup(originate_status[i].peer_channel, SWITCH_CAUSE_NO_PICKUP); + if (oglobals->originate_status[i].peer_channel && switch_channel_test_flag(oglobals->originate_status[i].peer_channel, CF_PICKUP) && + switch_channel_up(oglobals->originate_status[i].peer_channel)) { + switch_channel_hangup(oglobals->originate_status[i].peer_channel, SWITCH_CAUSE_NO_PICKUP); } } } if (pindex > -1 && caller_channel && switch_channel_ready(caller_channel) && !switch_channel_media_ready(caller_channel) && - switch_channel_media_ready(originate_status[pindex].peer_channel)) { - inherit_codec(caller_channel, originate_status[pindex].peer_session); + switch_channel_media_ready(oglobals->originate_status[pindex].peer_channel)) { + inherit_codec(caller_channel, oglobals->originate_status[pindex].peer_session); } if (send_ringback) { @@ -1791,7 +1793,6 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_enterprise_originate(switch_core_sess struct early_state { originate_global_t *oglobals; - originate_status_t *originate_status; switch_mutex_t *mutex; switch_buffer_t *buffer; int ready; @@ -1804,7 +1805,7 @@ typedef struct early_state early_state_t; static void *SWITCH_THREAD_FUNC early_thread_run(switch_thread_t *thread, void *obj) { early_state_t *state = (early_state_t *) obj; - originate_status_t originate_status[MAX_PEERS] = { {0} }; + //originate_status_t originate_status[MAX_PEERS] = { {0} }; int16_t mux_data[SWITCH_RECOMMENDED_BUFFER_SIZE / 2] = { 0 }; int32_t sample; switch_codec_t read_codecs[MAX_PEERS] = { {0} }; @@ -1815,6 +1816,7 @@ static void *SWITCH_THREAD_FUNC early_thread_run(switch_thread_t *thread, void * switch_frame_t *read_frame = NULL; switch_codec_implementation_t read_impl = { 0 }; +#if 0 for (i = 0; i < MAX_PEERS && i < state->ttl; i++) { switch_core_session_t *session = state->originate_status[i].peer_session; switch_channel_t *channel = NULL; @@ -1830,7 +1832,8 @@ static void *SWITCH_THREAD_FUNC early_thread_run(switch_thread_t *thread, void * originate_status[i].peer_channel = channel; } } - +#endif + if (state->oglobals->session) { switch_core_session_get_read_impl(state->oglobals->session, &read_impl); } @@ -1842,8 +1845,8 @@ static void *SWITCH_THREAD_FUNC early_thread_run(switch_thread_t *thread, void * answered = 0; for (i = 0; i < MAX_PEERS && i < state->ttl; i++) { - switch_core_session_t *session = originate_status[i].peer_session; - switch_channel_t *channel = originate_status[i].peer_channel; + switch_core_session_t *session = state->oglobals->originate_status[i].peer_session; + switch_channel_t *channel = state->oglobals->originate_status[i].peer_channel; if (!session || !channel || !switch_channel_up(channel)) { continue; @@ -1922,8 +1925,8 @@ static void *SWITCH_THREAD_FUNC early_thread_run(switch_thread_t *thread, void * for (i = 0; i < MAX_PEERS && i < state->ttl; i++) { - switch_core_session_t *session = originate_status[i].peer_session; - switch_channel_t *channel = originate_status[i].peer_channel; + switch_core_session_t *session = state->oglobals->originate_status[i].peer_session; + switch_channel_t *channel = state->oglobals->originate_status[i].peer_channel; if (!session) continue; @@ -1976,7 +1979,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_call_cause_t *cancel_cause, switch_dial_handle_t *dh) { - originate_status_t originate_status[MAX_PEERS] = { {0} }; + //originate_status_t originate_status[MAX_PEERS] = { {0} }; switch_originate_flag_t dftflags = SOF_NONE, myflags; char *pipe_names[MAX_PEERS] = { 0 }; char *data = NULL; @@ -2654,7 +2657,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess reason = SWITCH_CAUSE_NONE; memset(peer_names, 0, sizeof(peer_names)); peer_session = NULL; - memset(originate_status, 0, sizeof(originate_status)); + memset(oglobals.originate_status, 0, sizeof(oglobals.originate_status)); new_profile = NULL; new_session = NULL; chan_type = NULL; @@ -2867,9 +2870,9 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess new_profile->callee_id_name = switch_core_strdup(new_profile->pool, "Outbound Call"); new_profile->callee_id_number = switch_sanitize_number(switch_core_strdup(new_profile->pool, new_profile->destination_number)); - originate_status[i].caller_profile = NULL; - originate_status[i].peer_channel = NULL; - originate_status[i].peer_session = NULL; + oglobals.originate_status[i].caller_profile = NULL; + oglobals.originate_status[i].peer_channel = NULL; + oglobals.originate_status[i].peer_session = NULL; new_session = NULL; @@ -2982,27 +2985,27 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess goto done; } - originate_status[i].peer_channel = switch_core_session_get_channel(new_session); - originate_status[i].caller_profile = switch_channel_get_caller_profile(originate_status[i].peer_channel); - originate_status[i].peer_session = new_session; + oglobals.originate_status[i].peer_channel = switch_core_session_get_channel(new_session); + oglobals.originate_status[i].caller_profile = switch_channel_get_caller_profile(oglobals.originate_status[i].peer_channel); + oglobals.originate_status[i].peer_session = new_session; - switch_channel_set_flag(originate_status[i].peer_channel, CF_ORIGINATING); + switch_channel_set_flag(oglobals.originate_status[i].peer_channel, CF_ORIGINATING); if (caller_channel) { - switch_channel_set_variable(originate_status[i].peer_channel, "call_uuid", switch_channel_get_variable(caller_channel, "call_uuid")); + switch_channel_set_variable(oglobals.originate_status[i].peer_channel, "call_uuid", switch_channel_get_variable(caller_channel, "call_uuid")); } if (local_var_event) { const char *device_id = switch_event_get_header(local_var_event, "device_id"); - switch_channel_set_profile_var(originate_status[i].peer_channel, "device_id", device_id); + switch_channel_set_profile_var(oglobals.originate_status[i].peer_channel, "device_id", device_id); } if ((lc = switch_event_get_header(var_event, "local_var_clobber"))) { local_clobber = switch_true(lc); } - if (switch_channel_test_flag(originate_status[i].peer_channel, CF_NO_PRESENCE)) { + if (switch_channel_test_flag(oglobals.originate_status[i].peer_channel, CF_NO_PRESENCE)) { if (var_event) { switch_event_del_header(var_event, "presence_id"); } @@ -3017,7 +3020,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_event_header_t *header; /* install the vars from the {} params */ for (header = var_event->headers; header; header = header->next) { - switch_channel_set_variable_var_check(originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars); + switch_channel_set_variable_var_check(oglobals.originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars); } } } @@ -3026,7 +3029,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess if (local_var_event) { switch_event_header_t *header; for (header = local_var_event->headers; header; header = header->next) { - switch_channel_set_variable_var_check(originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars); + switch_channel_set_variable_var_check(oglobals.originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars); } switch_event_destroy(&local_var_event); } @@ -3036,62 +3039,62 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_event_header_t *header; /* install the vars from the {} params */ for (header = var_event->headers; header; header = header->next) { - switch_channel_set_variable_var_check(originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars); + switch_channel_set_variable_var_check(oglobals.originate_status[i].peer_channel, header->name, header->value, oglobals.check_vars); } } } - if (originate_status[i].peer_channel) { + if (oglobals.originate_status[i].peer_channel) { const char *vvar; - if (switch_true(switch_channel_get_variable(originate_status[i].peer_channel, "leg_required"))) { - originate_status[i].tagged = 1; + if (switch_true(switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "leg_required"))) { + oglobals.originate_status[i].tagged = 1; } - if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "origination_channel_name"))) { - switch_channel_set_name(originate_status[i].peer_channel, vvar); + if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "origination_channel_name"))) { + switch_channel_set_name(oglobals.originate_status[i].peer_channel, vvar); } - if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "origination_callee_id_name"))) { - switch_channel_set_profile_var(originate_status[i].peer_channel, "callee_id_name", vvar); + if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "origination_callee_id_name"))) { + switch_channel_set_profile_var(oglobals.originate_status[i].peer_channel, "callee_id_name", vvar); } - if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "origination_callee_id_number"))) { - switch_channel_set_profile_var(originate_status[i].peer_channel, "callee_id_number", vvar); + if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "origination_callee_id_number"))) { + switch_channel_set_profile_var(oglobals.originate_status[i].peer_channel, "callee_id_number", vvar); } - if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "leg_timeout"))) { + if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "leg_timeout"))) { int val = atoi(vvar); if (val > 0) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Setting leg timeout to %d\n", - switch_channel_get_name(originate_status[i].peer_channel), val); - originate_status[i].per_channel_timelimit_sec = (uint32_t) val; + switch_channel_get_name(oglobals.originate_status[i].peer_channel), val); + oglobals.originate_status[i].per_channel_timelimit_sec = (uint32_t) val; } } - if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "leg_progress_timeout"))) { + if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "leg_progress_timeout"))) { int val = atoi(vvar); if (val > 0) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Setting leg progress timeout to %d\n", - switch_channel_get_name(originate_status[i].peer_channel), val); - originate_status[i].per_channel_progress_timelimit_sec = (uint32_t) val; + switch_channel_get_name(oglobals.originate_status[i].peer_channel), val); + oglobals.originate_status[i].per_channel_progress_timelimit_sec = (uint32_t) val; } } - if ((vvar = switch_channel_get_variable(originate_status[i].peer_channel, "leg_delay_start"))) { + if ((vvar = switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "leg_delay_start"))) { int val = atoi(vvar); if (val > 0) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Setting leg delay start to %d\n", - switch_channel_get_name(originate_status[i].peer_channel), val); - originate_status[i].per_channel_delay_start = (uint32_t) val; + switch_channel_get_name(oglobals.originate_status[i].peer_channel), val); + oglobals.originate_status[i].per_channel_delay_start = (uint32_t) val; - if (originate_status[i].per_channel_progress_timelimit_sec != 0) { - originate_status[i].per_channel_progress_timelimit_sec += originate_status[i].per_channel_delay_start; + if (oglobals.originate_status[i].per_channel_progress_timelimit_sec != 0) { + oglobals.originate_status[i].per_channel_progress_timelimit_sec += oglobals.originate_status[i].per_channel_delay_start; } - if (originate_status[i].per_channel_timelimit_sec != 0) { - originate_status[i].per_channel_timelimit_sec += originate_status[i].per_channel_delay_start; + if (oglobals.originate_status[i].per_channel_timelimit_sec != 0) { + oglobals.originate_status[i].per_channel_timelimit_sec += oglobals.originate_status[i].per_channel_delay_start; } } } @@ -3105,12 +3108,12 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_channel_t *channel = switch_core_session_get_channel(a_session); char *val = switch_core_session_sprintf(a_session, "%s;%s;%s", - switch_core_session_get_uuid(originate_status[i].peer_session), - switch_str_nil(switch_channel_get_variable(originate_status[i].peer_channel, "callee_id_name")), - switch_str_nil(switch_channel_get_variable(originate_status[i].peer_channel, "callee_id_number"))); + switch_core_session_get_uuid(oglobals.originate_status[i].peer_session), + switch_str_nil(switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "callee_id_name")), + switch_str_nil(switch_channel_get_variable(oglobals.originate_status[i].peer_channel, "callee_id_number"))); - switch_channel_set_variable(originate_status[i].peer_channel, "originating_leg_uuid", switch_core_session_get_uuid(a_session)); + switch_channel_set_variable(oglobals.originate_status[i].peer_channel, "originating_leg_uuid", switch_core_session_get_uuid(a_session)); switch_channel_add_variable_var_check(channel, "originated_legs", val, SWITCH_FALSE, SWITCH_STACK_PUSH); @@ -3121,32 +3124,32 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess l_session = NULL; } - switch_channel_execute_on(originate_status[i].peer_channel, SWITCH_CHANNEL_EXECUTE_ON_ORIGINATE_VARIABLE); - switch_channel_api_on(originate_status[i].peer_channel, SWITCH_CHANNEL_API_ON_ORIGINATE_VARIABLE); + switch_channel_execute_on(oglobals.originate_status[i].peer_channel, SWITCH_CHANNEL_EXECUTE_ON_ORIGINATE_VARIABLE); + switch_channel_api_on(oglobals.originate_status[i].peer_channel, SWITCH_CHANNEL_API_ON_ORIGINATE_VARIABLE); } if (table) { - switch_channel_add_state_handler(originate_status[i].peer_channel, table); + switch_channel_add_state_handler(oglobals.originate_status[i].peer_channel, table); } if (oglobals.monitor_early_media_ring || oglobals.monitor_early_media_fail || oglobals.ignore_early_media == 4) { - switch_channel_set_flag(originate_status[i].peer_channel, CF_CONSUME_ON_ORIGINATE); + switch_channel_set_flag(oglobals.originate_status[i].peer_channel, CF_CONSUME_ON_ORIGINATE); } - switch_channel_add_state_handler(originate_status[i].peer_channel, &originate_state_handlers); + switch_channel_add_state_handler(oglobals.originate_status[i].peer_channel, &originate_state_handlers); - if ((flags & SOF_NOBLOCK) && originate_status[i].peer_session) { + if ((flags & SOF_NOBLOCK) && oglobals.originate_status[i].peer_session) { status = SWITCH_STATUS_SUCCESS; - *bleg = originate_status[i].peer_session; + *bleg = oglobals.originate_status[i].peer_session; *cause = SWITCH_CAUSE_SUCCESS; goto outer_for; } - if (!switch_core_session_running(originate_status[i].peer_session)) { - if (originate_status[i].per_channel_delay_start) { - switch_channel_set_flag(originate_status[i].peer_channel, CF_BLOCK_STATE); + if (!switch_core_session_running(oglobals.originate_status[i].peer_session)) { + if (oglobals.originate_status[i].per_channel_delay_start) { + switch_channel_set_flag(oglobals.originate_status[i].peer_channel, CF_BLOCK_STATE); } - switch_core_session_thread_launch(originate_status[i].peer_session); + switch_core_session_thread_launch(oglobals.originate_status[i].peer_session); } } @@ -3158,11 +3161,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess int state; time_t elapsed; - if (!originate_status[i].peer_channel) { + if (!oglobals.originate_status[i].peer_channel) { continue; } - state = switch_channel_get_state(originate_status[i].peer_channel); + state = switch_channel_get_state(oglobals.originate_status[i].peer_channel); if (state < CS_HANGUP) { valid_channels++; @@ -3199,7 +3202,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_cond_next(); } - check_per_channel_timeouts(&oglobals, originate_status, and_argc, start, &force_reason); + check_per_channel_timeouts(&oglobals, and_argc, start, &force_reason); if (valid_channels == 0) { @@ -3237,7 +3240,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess } while ((!caller_channel || switch_channel_ready(caller_channel) || switch_channel_test_flag(caller_channel, CF_XFER_ZOMBIE)) && - check_channel_status(&oglobals, originate_status, and_argc, &force_reason)) { + check_channel_status(&oglobals, and_argc, &force_reason)) { time_t elapsed = switch_epoch_time_now(NULL) - start; read_packet = 0; @@ -3250,7 +3253,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess goto notready; } - check_per_channel_timeouts(&oglobals, originate_status, and_argc, start, &force_reason); + check_per_channel_timeouts(&oglobals, and_argc, start, &force_reason); if (oglobals.session) { switch_ivr_parse_all_events(oglobals.session); @@ -3275,10 +3278,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_channel_t *pchannel; const char *cause_str; - if (!originate_status[i].peer_session) { + if (!oglobals.originate_status[i].peer_session) { continue; } - pchannel = switch_core_session_get_channel(originate_status[i].peer_session); + pchannel = switch_core_session_get_channel(oglobals.originate_status[i].peer_session); if (switch_channel_down_nosig(pchannel)) { int neg, pos; @@ -3352,14 +3355,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess if (oglobals.ringback_ok == 1) { switch_status_t rst; - rst = setup_ringback(&oglobals, originate_status, and_argc, ringback_data, &ringback, &write_frame, &write_codec); + rst = setup_ringback(&oglobals, oglobals.originate_status, and_argc, ringback_data, &ringback, &write_frame, &write_codec); if (oglobals.bridge_early_media > -1) { switch_threadattr_t *thd_attr = NULL; switch_threadattr_create(&thd_attr, switch_core_session_get_pool(session)); switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); early_state.oglobals = &oglobals; - early_state.originate_status = originate_status; + //early_state.originate_status = oglobals.originate_status; early_state.ready = 1; early_state.ringback = &ringback; early_state.ttl = and_argc; @@ -3510,33 +3513,33 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess if (holding) { if (oglobals.idx > IDX_NADA) { - peer_session = originate_status[oglobals.idx].peer_session; - peer_channel = originate_status[oglobals.idx].peer_channel; - originate_status[oglobals.idx].peer_channel = NULL; + peer_session = oglobals.originate_status[oglobals.idx].peer_session; + peer_channel = oglobals.originate_status[oglobals.idx].peer_channel; + oglobals.originate_status[oglobals.idx].peer_channel = NULL; } else if (and_argc == 1) { - peer_session = originate_status[0].peer_session; - peer_channel = originate_status[0].peer_channel; - originate_status[0].peer_channel = NULL; + peer_session = oglobals.originate_status[0].peer_session; + peer_channel = oglobals.originate_status[0].peer_channel; + oglobals.originate_status[0].peer_channel = NULL; } else { for (i = 0; i < and_argc; i++) { - if (!peer_eligible(originate_status[i].peer_channel)) { + if (!peer_eligible(oglobals.originate_status[i].peer_channel)) { continue; } - if (switch_channel_media_ready(originate_status[i].peer_channel)) { - peer_session = originate_status[i].peer_session; - peer_channel = originate_status[i].peer_channel; - originate_status[i].peer_channel = NULL; + if (switch_channel_media_ready(oglobals.originate_status[i].peer_channel)) { + peer_session = oglobals.originate_status[i].peer_session; + peer_channel = oglobals.originate_status[i].peer_channel; + oglobals.originate_status[i].peer_channel = NULL; goto end_search; } } for (i = 0; i < and_argc; i++) { - if (!peer_eligible(originate_status[i].peer_channel)) { + if (!peer_eligible(oglobals.originate_status[i].peer_channel)) { continue; } - if (switch_channel_up_nosig(originate_status[i].peer_channel)) { - peer_session = originate_status[i].peer_session; - peer_channel = originate_status[i].peer_channel; - originate_status[i].peer_channel = NULL; + if (switch_channel_up_nosig(oglobals.originate_status[i].peer_channel)) { + peer_session = oglobals.originate_status[i].peer_session; + peer_channel = oglobals.originate_status[i].peer_channel; + oglobals.originate_status[i].peer_channel = NULL; break; } } @@ -3657,7 +3660,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess } for (i = 0; i < and_argc; i++) { - if (!peer_eligible(originate_status[i].peer_channel)) { + if (!peer_eligible(oglobals.originate_status[i].peer_channel)) { continue; } @@ -3672,17 +3675,17 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess } else { if (and_argc > 1) { reason = SWITCH_CAUSE_LOSE_RACE; - } else if (!switch_channel_ready(originate_status[i].peer_channel)) { - wait_for_cause(originate_status[i].peer_channel); - if (switch_channel_down_nosig(originate_status[i].peer_channel)) { - reason = switch_channel_get_cause(originate_status[i].peer_channel); + } else if (!switch_channel_ready(oglobals.originate_status[i].peer_channel)) { + wait_for_cause(oglobals.originate_status[i].peer_channel); + if (switch_channel_down_nosig(oglobals.originate_status[i].peer_channel)) { + reason = switch_channel_get_cause(oglobals.originate_status[i].peer_channel); } } else { reason = SWITCH_CAUSE_NO_ANSWER; } } } - if (switch_channel_up_nosig(originate_status[i].peer_channel)) { + if (switch_channel_up_nosig(oglobals.originate_status[i].peer_channel)) { if (caller_channel && i == 0) { holding = switch_channel_get_variable(caller_channel, SWITCH_SOFT_HOLDING_UUID_VARIABLE); switch_channel_set_variable(caller_channel, SWITCH_SOFT_HOLDING_UUID_VARIABLE, NULL); @@ -3697,23 +3700,23 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_channel_set_variable(holding_channel, SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE, "true"); if (caller_channel && switch_true(switch_channel_get_variable(caller_channel, "recording_follow_transfer"))) { - switch_ivr_transfer_recordings(session, originate_status[i].peer_session); + switch_ivr_transfer_recordings(session, oglobals.originate_status[i].peer_session); } if (switch_true(switch_channel_get_variable(holding_channel, "recording_follow_transfer"))) { - switch_ivr_transfer_recordings(holding_session, originate_status[i].peer_session); + switch_ivr_transfer_recordings(holding_session, oglobals.originate_status[i].peer_session); } switch_core_session_rwunlock(holding_session); } - switch_channel_set_flag(originate_status[i].peer_channel, CF_LAZY_ATTENDED_TRANSFER); - switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(originate_status[i].peer_session)); + switch_channel_set_flag(oglobals.originate_status[i].peer_channel, CF_LAZY_ATTENDED_TRANSFER); + switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(oglobals.originate_status[i].peer_session)); holding = NULL; } else { if (force_reason == SWITCH_CAUSE_LOSE_RACE || reason == SWITCH_CAUSE_LOSE_RACE) { - switch_channel_set_variable(originate_status[i].peer_channel, "group_dial_status", "loser"); + switch_channel_set_variable(oglobals.originate_status[i].peer_channel, "group_dial_status", "loser"); } - switch_channel_hangup(originate_status[i].peer_channel, force_reason ? force_reason : reason); + switch_channel_hangup(oglobals.originate_status[i].peer_channel, force_reason ? force_reason : reason); } } } @@ -3722,8 +3725,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess if (oglobals.idx > IDX_NADA) { - if ((peer_session = originate_status[oglobals.idx].peer_session)) { - peer_channel = switch_core_session_get_channel(originate_status[oglobals.idx].peer_session); + if ((peer_session = oglobals.originate_status[oglobals.idx].peer_session)) { + peer_channel = switch_core_session_get_channel(oglobals.originate_status[oglobals.idx].peer_session); } } else { status = SWITCH_STATUS_FALSE; @@ -3834,10 +3837,10 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess *cause = switch_channel_get_cause(peer_channel); } else { for (i = 0; i < and_argc; i++) { - if (!originate_status[i].peer_channel) { + if (!oglobals.originate_status[i].peer_channel) { continue; } - *cause = switch_channel_get_cause(originate_status[i].peer_channel); + *cause = switch_channel_get_cause(oglobals.originate_status[i].peer_channel); break; } } @@ -3846,11 +3849,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess for (i = 0; i < and_argc; i++) { switch_channel_t *channel; - if (!originate_status[i].peer_session) { + if (!oglobals.originate_status[i].peer_session) { continue; } - channel = switch_core_session_get_channel(originate_status[i].peer_session); + channel = switch_core_session_get_channel(oglobals.originate_status[i].peer_session); switch_channel_wait_for_state_timeout(channel, CS_REPORTING, 5000); @@ -3858,7 +3861,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_channel_set_timestamps(channel); } - if (switch_ivr_generate_xml_cdr(originate_status[i].peer_session, &cdr) == SWITCH_STATUS_SUCCESS) { + if (switch_ivr_generate_xml_cdr(oglobals.originate_status[i].peer_session, &cdr) == SWITCH_STATUS_SUCCESS) { if ((xml_text = switch_xml_toxml(cdr, SWITCH_FALSE))) { switch_snprintf(buf, sizeof(buf), "%s_%d", cdr_var, ++cdr_total); switch_channel_set_variable(caller_channel, buf, xml_text); @@ -3878,11 +3881,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess for (i = 0; i < and_argc; i++) { switch_channel_t *channel; - if (!originate_status[i].peer_session) { + if (!oglobals.originate_status[i].peer_session) { continue; } - channel = switch_core_session_get_channel(originate_status[i].peer_session); + channel = switch_core_session_get_channel(oglobals.originate_status[i].peer_session); switch_channel_wait_for_state_timeout(channel, CS_REPORTING, 5000); @@ -3890,7 +3893,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_channel_set_timestamps(channel); } - if (switch_ivr_generate_json_cdr(originate_status[i].peer_session, &json_cdr, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) { + if (switch_ivr_generate_json_cdr(oglobals.originate_status[i].peer_session, &json_cdr, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS) { json_text = cJSON_PrintUnformatted(json_cdr); switch_snprintf(buf, sizeof(buf), "%s_%d", json_cdr_var, ++cdr_total); switch_channel_set_variable(caller_channel, buf, json_text); @@ -3917,14 +3920,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess } else { *cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; for (i = 0; i < and_argc; i++) { - if (!peer_eligible(originate_status[i].peer_channel)) { + if (!peer_eligible(oglobals.originate_status[i].peer_channel)) { continue; } - wait_for_cause(originate_status[i].peer_channel); + wait_for_cause(oglobals.originate_status[i].peer_channel); - if (switch_channel_down_nosig(originate_status[i].peer_channel)) { - *cause = switch_channel_get_cause(originate_status[i].peer_channel); + if (switch_channel_down_nosig(oglobals.originate_status[i].peer_channel)) { + *cause = switch_channel_get_cause(oglobals.originate_status[i].peer_channel); break; } @@ -4014,40 +4017,40 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_core_session_t *peer_session; char *val; - if (!originate_status[i].peer_channel) { + if (!oglobals.originate_status[i].peer_channel) { continue; } if (session) { - val = switch_core_session_sprintf(originate_status[i].peer_session, "%s;%s", - switch_core_session_get_uuid(originate_status[i].peer_session), - switch_channel_cause2str(switch_channel_get_cause(originate_status[i].peer_channel))); + val = switch_core_session_sprintf(oglobals.originate_status[i].peer_session, "%s;%s", + switch_core_session_get_uuid(oglobals.originate_status[i].peer_session), + switch_channel_cause2str(switch_channel_get_cause(oglobals.originate_status[i].peer_channel))); switch_channel_add_variable_var_check(switch_core_session_get_channel(session), "originate_causes", val, SWITCH_FALSE, SWITCH_STACK_PUSH); } if (status == SWITCH_STATUS_SUCCESS) { - switch_channel_clear_flag(originate_status[i].peer_channel, CF_ORIGINATING); - if (bleg && *bleg && *bleg == originate_status[i].peer_session) { + switch_channel_clear_flag(oglobals.originate_status[i].peer_channel, CF_ORIGINATING); + if (bleg && *bleg && *bleg == oglobals.originate_status[i].peer_session) { continue; } - } else if ((state = switch_channel_get_state(originate_status[i].peer_channel)) < CS_HANGUP && - switch_channel_test_flag(originate_status[i].peer_channel, CF_ORIGINATING)) { - if (!(state == CS_RESET || switch_channel_test_flag(originate_status[i].peer_channel, CF_TRANSFER) || - switch_channel_test_flag(originate_status[i].peer_channel, CF_REDIRECT) || - switch_channel_test_flag(originate_status[i].peer_channel, CF_BRIDGED))) { + } else if ((state = switch_channel_get_state(oglobals.originate_status[i].peer_channel)) < CS_HANGUP && + switch_channel_test_flag(oglobals.originate_status[i].peer_channel, CF_ORIGINATING)) { + if (!(state == CS_RESET || switch_channel_test_flag(oglobals.originate_status[i].peer_channel, CF_TRANSFER) || + switch_channel_test_flag(oglobals.originate_status[i].peer_channel, CF_REDIRECT) || + switch_channel_test_flag(oglobals.originate_status[i].peer_channel, CF_BRIDGED))) { if (caller_channel && switch_channel_test_flag(caller_channel, CF_INTERCEPTED)) { - switch_channel_set_flag(originate_status[i].peer_channel, CF_INTERCEPT); + switch_channel_set_flag(oglobals.originate_status[i].peer_channel, CF_INTERCEPT); } - switch_channel_hangup(originate_status[i].peer_channel, *cause); + switch_channel_hangup(oglobals.originate_status[i].peer_channel, *cause); } } - switch_channel_clear_flag(originate_status[i].peer_channel, CF_ORIGINATING); + switch_channel_clear_flag(oglobals.originate_status[i].peer_channel, CF_ORIGINATING); - peer_session = originate_status[i].peer_session; - originate_status[i].down_session = originate_status[i].peer_session; - originate_status[i].peer_session = NULL; - originate_status[i].peer_channel = NULL; + peer_session = oglobals.originate_status[i].peer_session; + oglobals.originate_status[i].down_session = oglobals.originate_status[i].peer_session; + oglobals.originate_status[i].peer_session = NULL; + oglobals.originate_status[i].peer_channel = NULL; switch_core_session_rwunlock(peer_session); } @@ -4062,11 +4065,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_channel_t *pchannel; const char *cause_str; - if (!originate_status[i].down_session) { + if (!oglobals.originate_status[i].down_session) { continue; } - pchannel = switch_core_session_get_channel(originate_status[i].down_session); + pchannel = switch_core_session_get_channel(oglobals.originate_status[i].down_session); wait_for_cause(pchannel); if (switch_channel_down_nosig(pchannel)) {