[Freeswitch-svn] [commit] r2996 - in freeswitch/trunk/src: . include mod/endpoints/mod_sofia
Freeswitch SVN
anthm at freeswitch.org
Sat Oct 7 18:19:24 EDT 2006
Author: anthm
Date: Sat Oct 7 18:19:24 2006
New Revision: 2996
Modified:
freeswitch/trunk/src/include/switch_utils.h
freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
freeswitch/trunk/src/switch_ivr.c
Log:
Modify Originate input syntax
This adds the | to the originate syntax
making it possible to put a list of urls to call and attempt
to call them one at a time until one of them is successful or there
are none of them left
The original & delimited list is valid for each step in the | separated
list
Example
sofia/test-int/3920 at 10.3.3.104|sofia/test-int/3910 at 10.3.3.104&sofia/test-int/3920 at 10.3.3.104
first call 1 location and if that results in a failure, try 2 at once on the next go
Modified: freeswitch/trunk/src/include/switch_utils.h
==============================================================================
--- freeswitch/trunk/src/include/switch_utils.h (original)
+++ freeswitch/trunk/src/include/switch_utils.h Sat Oct 7 18:19:24 2006
@@ -151,7 +151,7 @@
/*!
- \brief Free a pointer and set it to NULL unles it already is NULL
+ \brief Free a pointer and set it to NULL unless it already is NULL
\param it the pointer
*/
#define switch_safe_free(it) if (it) {free(it);it=NULL;}
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c Sat Oct 7 18:19:24 2006
@@ -1676,7 +1676,6 @@
sofia_profile_t *profile;
switch_caller_profile_t *caller_profile = NULL;
private_object_t *tech_pvt = NULL;
- switch_channel_t *channel;
switch_channel_t *nchannel;
char *host;
@@ -1725,7 +1724,7 @@
snprintf(tech_pvt->dest, strlen(dest) + 5, "sip:%s", dest);
}
attach_private(nsession, profile, tech_pvt, dest);
- channel = switch_core_session_get_channel(session);
+
nchannel = switch_core_session_get_channel(nsession);
caller_profile = switch_caller_profile_clone(nsession, outbound_profile);
switch_channel_set_caller_profile(nchannel, caller_profile);
@@ -1737,6 +1736,7 @@
status = SWITCH_STATUS_SUCCESS;
if (session) {
char *val;
+ switch_channel_t *channel = switch_core_session_get_channel(session);
switch_ivr_transfer_variable(session, nsession, SOFIA_REPLACES_HEADER);
if (switch_channel_test_flag(channel, CF_NOMEDIA) && (val = switch_channel_get_variable(channel, SWITCH_R_SDP_VARIABLE))) {
Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c (original)
+++ freeswitch/trunk/src/switch_ivr.c Sat Oct 7 18:19:24 2006
@@ -1698,6 +1698,10 @@
)
{
+ char *pipe_names[MAX_PEERS] = {0};
+ char *data = NULL;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ switch_channel_t *caller_channel = NULL;
char *peer_names[MAX_PEERS] = {0};
switch_core_session_t *peer_session, *peer_sessions[MAX_PEERS] = {0};
switch_caller_profile_t *caller_profiles[MAX_PEERS] = {0}, *caller_caller_profile;
@@ -1705,11 +1709,8 @@
switch_channel_t *peer_channel = NULL, *peer_channels[MAX_PEERS] = {0};
time_t start;
switch_frame_t *read_frame = NULL;
- switch_status_t status = SWITCH_STATUS_SUCCESS;
- switch_channel_t *caller_channel = NULL;
switch_memory_pool_t *pool = NULL;
- char *data = NULL;
- int i, argc = 0;
+ int r = 0, i, and_argc = 0, or_argc = 0;
int32_t idx = -1;
switch_codec_t write_codec = {0};
switch_frame_t write_frame = {0};
@@ -1762,288 +1763,310 @@
file = NULL;
}
- argc = switch_separate_string(data, '&', peer_names, (sizeof(peer_names) / sizeof(peer_names[0])));
-
- for (i = 0; i < argc; i++) {
+ or_argc = switch_separate_string(data, '|', pipe_names, (sizeof(pipe_names) / sizeof(pipe_names[0])));
+
+ for (r = 0; r < or_argc; r++) {
+ memset(peer_names, 0, sizeof(peer_names));
+ peer_session = NULL;
+ memset(peer_sessions, 0, sizeof(peer_sessions));
+ memset(peer_channels, 0, sizeof(peer_channels));
+ memset(caller_profiles, 0, sizeof(caller_profiles));
+ chan_type = NULL;
+ chan_data = NULL;
+ peer_channel = NULL;
+ start = 0;
+ read_frame = NULL;
+ pool = NULL;
+ pass = 0;
+ file = NULL;
+ key = NULL;
+ var = NULL;
- chan_type = peer_names[i];
- if ((chan_data = strchr(chan_type, '/')) != 0) {
- *chan_data = '\0';
- chan_data++;
- }
+ and_argc = switch_separate_string(pipe_names[r], '&', peer_names, (sizeof(peer_names) / sizeof(peer_names[0])));
- if (session) {
- if (!switch_channel_ready(caller_channel)) {
- status = SWITCH_STATUS_FALSE;
- goto done;
+ for (i = 0; i < and_argc; i++) {
+
+ chan_type = peer_names[i];
+ if ((chan_data = strchr(chan_type, '/')) != 0) {
+ *chan_data = '\0';
+ chan_data++;
}
+
+ if (session) {
+ if (!switch_channel_ready(caller_channel)) {
+ status = SWITCH_STATUS_FALSE;
+ goto done;
+ }
- caller_caller_profile = caller_profile_override ? caller_profile_override : switch_channel_get_caller_profile(caller_channel);
+ caller_caller_profile = caller_profile_override ? caller_profile_override : switch_channel_get_caller_profile(caller_channel);
- if (!cid_name_override) {
- cid_name_override = caller_caller_profile->caller_id_name;
- }
- if (!cid_num_override) {
- cid_num_override = caller_caller_profile->caller_id_number;
- }
+ if (!cid_name_override) {
+ cid_name_override = caller_caller_profile->caller_id_name;
+ }
+ if (!cid_num_override) {
+ cid_num_override = caller_caller_profile->caller_id_number;
+ }
- caller_profiles[i] = switch_caller_profile_new(switch_core_session_get_pool(session),
- caller_caller_profile->username,
- caller_caller_profile->dialplan,
- cid_name_override,
- cid_num_override,
- caller_caller_profile->network_addr,
- NULL,
- NULL,
- caller_caller_profile->rdnis,
- caller_caller_profile->source,
- caller_caller_profile->context,
- chan_data);
- pool = NULL;
- } else {
- if (!cid_name_override) {
- cid_name_override = "FreeSWITCH";
- }
- if (!cid_num_override) {
- cid_num_override = "0000000000";
- }
-
- if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "OH OH no pool\n");
- status = SWITCH_STATUS_TERM;
- goto done;
- }
-
- if (caller_profile_override) {
- caller_profiles[i] = switch_caller_profile_new(pool,
- caller_profile_override->username,
- caller_profile_override->dialplan,
- caller_profile_override->caller_id_name,
- caller_profile_override->caller_id_number,
- caller_profile_override->network_addr,
- caller_profile_override->ani,
- caller_profile_override->ani2,
- caller_profile_override->rdnis,
- caller_profile_override->source,
- caller_profile_override->context,
- chan_data);
- } else {
- caller_profiles[i] = switch_caller_profile_new(pool,
- NULL,
- NULL,
+ caller_profiles[i] = switch_caller_profile_new(switch_core_session_get_pool(session),
+ caller_caller_profile->username,
+ caller_caller_profile->dialplan,
cid_name_override,
cid_num_override,
+ caller_caller_profile->network_addr,
NULL,
NULL,
- NULL,
- NULL,
- __FILE__,
- NULL,
+ caller_caller_profile->rdnis,
+ caller_caller_profile->source,
+ caller_caller_profile->context,
chan_data);
+ pool = NULL;
+ } else {
+ if (!cid_name_override) {
+ cid_name_override = "FreeSWITCH";
+ }
+ if (!cid_num_override) {
+ cid_num_override = "0000000000";
+ }
+
+ if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "OH OH no pool\n");
+ status = SWITCH_STATUS_TERM;
+ goto done;
+ }
+
+ if (caller_profile_override) {
+ caller_profiles[i] = switch_caller_profile_new(pool,
+ caller_profile_override->username,
+ caller_profile_override->dialplan,
+ caller_profile_override->caller_id_name,
+ caller_profile_override->caller_id_number,
+ caller_profile_override->network_addr,
+ caller_profile_override->ani,
+ caller_profile_override->ani2,
+ caller_profile_override->rdnis,
+ caller_profile_override->source,
+ caller_profile_override->context,
+ chan_data);
+ } else {
+ caller_profiles[i] = switch_caller_profile_new(pool,
+ NULL,
+ NULL,
+ cid_name_override,
+ cid_num_override,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ __FILE__,
+ NULL,
+ chan_data);
+ }
}
- }
- if (switch_core_session_outgoing_channel(session, chan_type, caller_profiles[i], &peer_sessions[i], pool) != SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot Create Outgoing Channel!\n");
- if (pool) {
- switch_core_destroy_memory_pool(&pool);
+ if (switch_core_session_outgoing_channel(session, chan_type, caller_profiles[i], &peer_sessions[i], pool) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot Create Outgoing Channel!\n");
+ if (pool) {
+ switch_core_destroy_memory_pool(&pool);
+ }
+ caller_profiles[i] = NULL;
+ peer_channels[i] = NULL;
+ peer_sessions[i] = NULL;
+ continue;
}
- caller_profiles[i] = NULL;
- peer_channels[i] = NULL;
- peer_sessions[i] = NULL;
- continue;
- }
- switch_core_session_read_lock(peer_sessions[i]);
- pool = NULL;
+ switch_core_session_read_lock(peer_sessions[i]);
+ pool = NULL;
- peer_channels[i] = switch_core_session_get_channel(peer_sessions[i]);
- assert(peer_channels[i] != NULL);
+ peer_channels[i] = switch_core_session_get_channel(peer_sessions[i]);
+ assert(peer_channels[i] != NULL);
- if (table == &noop_state_handler) {
- table = NULL;
- } else if (!table) {
- table = &audio_bridge_peer_state_handlers;
- }
+ if (table == &noop_state_handler) {
+ table = NULL;
+ } else if (!table) {
+ table = &audio_bridge_peer_state_handlers;
+ }
- if (table) {
- switch_channel_add_state_handler(peer_channels[i], table);
- }
+ if (table) {
+ switch_channel_add_state_handler(peer_channels[i], table);
+ }
- if (switch_core_session_running(peer_sessions[i])) {
- switch_channel_set_state(peer_channels[i], CS_RING);
- } else {
- switch_core_session_thread_launch(peer_sessions[i]);
+ if (switch_core_session_running(peer_sessions[i])) {
+ switch_channel_set_state(peer_channels[i], CS_RING);
+ } else {
+ switch_core_session_thread_launch(peer_sessions[i]);
+ }
}
- }
- time(&start);
+ time(&start);
- for (;;) {
- uint32_t valid_channels = 0;
- for (i = 0; i < argc; i++) {
- int state;
+ for (;;) {
+ uint32_t valid_channels = 0;
+ for (i = 0; i < and_argc; i++) {
+ int state;
- if (!peer_channels[i]) {
- continue;
- }
- valid_channels++;
- state = switch_channel_get_state(peer_channels[i]);
+ if (!peer_channels[i]) {
+ continue;
+ }
+ valid_channels++;
+ state = switch_channel_get_state(peer_channels[i]);
- if (state >= CS_RING) {
- goto endfor1;
- }
+ if (state >= CS_RING) {
+ goto endfor1;
+ }
- if (caller_channel && !switch_channel_ready(caller_channel)) {
- break;
- }
+ if (caller_channel && !switch_channel_ready(caller_channel)) {
+ break;
+ }
- if ((time(NULL) - start) > (time_t)timelimit_sec) {
- break;
+ if ((time(NULL) - start) > (time_t)timelimit_sec) {
+ break;
+ }
+ switch_yield(1000);
}
- switch_yield(1000);
- }
- if (valid_channels == 0) {
- status = SWITCH_STATUS_GENERR;
- goto done;
+ if (valid_channels == 0) {
+ status = SWITCH_STATUS_GENERR;
+ goto done;
+ }
+
}
+ endfor1:
- }
- endfor1:
+ if (session && !switch_channel_test_flag(caller_channel, CF_NOMEDIA)) {
+ switch_codec_t *read_codec = NULL;
- if (session && !switch_channel_test_flag(caller_channel, CF_NOMEDIA)) {
- switch_codec_t *read_codec = NULL;
+ switch_channel_pre_answer(caller_channel);
+ read_codec = switch_core_session_get_read_codec(session);
- switch_channel_pre_answer(caller_channel);
- read_codec = switch_core_session_get_read_codec(session);
-
- assert(read_codec != NULL);
- if (!(pass = (uint8_t)switch_test_flag(read_codec, SWITCH_CODEC_FLAG_PASSTHROUGH))) {
- if (switch_core_codec_init(&write_codec,
- "L16",
- read_codec->implementation->samples_per_second,
- read_codec->implementation->microseconds_per_frame / 1000,
- 1,
- SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
- NULL,
- pool) == SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activation Success L16@%uhz 1 channel %dms\n",
- read_codec->implementation->samples_per_second,
- read_codec->implementation->microseconds_per_frame / 1000);
- write_frame.codec = &write_codec;
- write_frame.datalen = read_codec->implementation->bytes_per_frame;
- write_frame.samples = write_frame.datalen / 2;
- memset(write_frame.data, 255, write_frame.datalen);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec Error!");
- switch_channel_hangup(caller_channel, SWITCH_CAUSE_NORMAL_TEMPORARY_FAILURE);
+ assert(read_codec != NULL);
+ if (!(pass = (uint8_t)switch_test_flag(read_codec, SWITCH_CODEC_FLAG_PASSTHROUGH))) {
+ if (switch_core_codec_init(&write_codec,
+ "L16",
+ read_codec->implementation->samples_per_second,
+ read_codec->implementation->microseconds_per_frame / 1000,
+ 1,
+ SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
+ NULL,
+ pool) == SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activation Success L16@%uhz 1 channel %dms\n",
+ read_codec->implementation->samples_per_second,
+ read_codec->implementation->microseconds_per_frame / 1000);
+ write_frame.codec = &write_codec;
+ write_frame.datalen = read_codec->implementation->bytes_per_frame;
+ write_frame.samples = write_frame.datalen / 2;
+ memset(write_frame.data, 255, write_frame.datalen);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec Error!");
+ switch_channel_hangup(caller_channel, SWITCH_CAUSE_NORMAL_TEMPORARY_FAILURE);
+ }
}
}
- }
- while ((!caller_channel || switch_channel_ready(caller_channel)) &&
- check_channel_status(peer_channels, peer_sessions, argc, &idx, file, key) && ((time(NULL) - start) < (time_t)timelimit_sec)) {
+ while ((!caller_channel || switch_channel_ready(caller_channel)) &&
+ check_channel_status(peer_channels, peer_sessions, and_argc, &idx, file, key) && ((time(NULL) - start) < (time_t)timelimit_sec)) {
- /* read from the channel while we wait if the audio is up on it */
- if (session && !switch_channel_test_flag(caller_channel, CF_NOMEDIA) &&
- (switch_channel_test_flag(caller_channel, CF_ANSWERED) || switch_channel_test_flag(caller_channel, CF_EARLY_MEDIA))) {
- switch_status_t status = switch_core_session_read_frame(session, &read_frame, 1000, 0);
+ /* read from the channel while we wait if the audio is up on it */
+ if (session && !switch_channel_test_flag(caller_channel, CF_NOMEDIA) &&
+ (switch_channel_test_flag(caller_channel, CF_ANSWERED) || switch_channel_test_flag(caller_channel, CF_EARLY_MEDIA))) {
+ switch_status_t status = switch_core_session_read_frame(session, &read_frame, 1000, 0);
- if (!SWITCH_READ_ACCEPTABLE(status)) {
- break;
- }
- if (read_frame && !pass) {
- if (switch_core_session_write_frame(session, &write_frame, 1000, 0) != SWITCH_STATUS_SUCCESS) {
+ if (!SWITCH_READ_ACCEPTABLE(status)) {
break;
}
+ if (read_frame && !pass) {
+ if (switch_core_session_write_frame(session, &write_frame, 1000, 0) != SWITCH_STATUS_SUCCESS) {
+ break;
+ }
+ }
+
+ } else {
+ switch_yield(1000);
}
+
+ }
- } else {
- switch_yield(1000);
+ if (session && !switch_channel_test_flag(caller_channel, CF_NOMEDIA)) {
+ switch_core_session_reset(session);
}
-
- }
- if (session && !switch_channel_test_flag(caller_channel, CF_NOMEDIA)) {
- switch_core_session_reset(session);
- }
-
- for (i = 0; i < argc; i++) {
- if (!peer_channels[i]) {
- continue;
+ for (i = 0; i < and_argc; i++) {
+ if (!peer_channels[i]) {
+ continue;
+ }
+ if (i != idx) {
+ switch_channel_hangup(peer_channels[i], SWITCH_CAUSE_LOSE_RACE);
+ }
}
- if (i != idx) {
- switch_channel_hangup(peer_channels[i], SWITCH_CAUSE_LOSE_RACE);
- }
- }
- if (idx > -1) {
- peer_session = peer_sessions[idx];
- peer_channel = peer_channels[idx];
- } else {
- status = SWITCH_STATUS_FALSE;
- goto done;
- }
+ if (idx > -1) {
+ peer_session = peer_sessions[idx];
+ peer_channel = peer_channels[idx];
+ } else {
+ status = SWITCH_STATUS_FALSE;
+ goto done;
+ }
- if (caller_channel && switch_channel_test_flag(peer_channel, CF_ANSWERED)) {
- char *val;
+ if (caller_channel && switch_channel_test_flag(peer_channel, CF_ANSWERED)) {
+ char *val;
- if (switch_channel_test_flag(peer_channel, CF_NOMEDIA) && (val = switch_channel_get_variable(peer_channel, SWITCH_R_SDP_VARIABLE))) {
- switch_channel_set_variable(caller_channel, SWITCH_L_SDP_VARIABLE, val);
+ if (switch_channel_test_flag(peer_channel, CF_NOMEDIA) && (val = switch_channel_get_variable(peer_channel, SWITCH_R_SDP_VARIABLE))) {
+ switch_channel_set_variable(caller_channel, SWITCH_L_SDP_VARIABLE, val);
+ }
+ switch_channel_answer(caller_channel);
}
- switch_channel_answer(caller_channel);
- }
- if (switch_channel_test_flag(peer_channel, CF_ANSWERED) || switch_channel_test_flag(peer_channel, CF_EARLY_MEDIA)) {
- *bleg = peer_session;
- status = SWITCH_STATUS_SUCCESS;
- } else {
- status = SWITCH_STATUS_FALSE;
- }
+ if (switch_channel_test_flag(peer_channel, CF_ANSWERED) || switch_channel_test_flag(peer_channel, CF_EARLY_MEDIA)) {
+ *bleg = peer_session;
+ status = SWITCH_STATUS_SUCCESS;
+ } else {
+ status = SWITCH_STATUS_FALSE;
+ }
- done:
- *cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
+ done:
+ *cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
- if (status == SWITCH_STATUS_SUCCESS) {
- if (caller_channel) {
- switch_channel_set_variable(caller_channel, "originate_disposition", "call accepted");
- }
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Originate Resulted in Success: [%s]\n", switch_channel_get_name(peer_channel));
- } else {
- if (peer_channel) {
- *cause = switch_channel_get_cause(peer_channel);
+ if (status == SWITCH_STATUS_SUCCESS) {
+ if (caller_channel) {
+ switch_channel_set_variable(caller_channel, "originate_disposition", "call accepted");
+ }
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Originate Resulted in Success: [%s]\n", switch_channel_get_name(peer_channel));
} else {
- for (i = 0; i < argc; i++) {
- if (!peer_channels[i]) {
- continue;
- }
+ if (peer_channel) {
+ *cause = switch_channel_get_cause(peer_channel);
+ } else {
+ for (i = 0; i < and_argc; i++) {
+ if (!peer_channels[i]) {
+ continue;
+ }
- *cause = switch_channel_get_cause(peer_channels[i]);
- break;
+ *cause = switch_channel_get_cause(peer_channels[i]);
+ break;
+ }
}
+ if (caller_channel) {
+ switch_channel_set_variable(caller_channel, "originate_disposition", switch_channel_cause2str(*cause));
+ }
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Originate Resulted in Error Cause: %d [%s]\n", *cause, switch_channel_cause2str(*cause));
}
- if (caller_channel) {
- switch_channel_set_variable(caller_channel, "originate_disposition", switch_channel_cause2str(*cause));
+
+ if (!pass && write_codec.implementation) {
+ switch_core_codec_destroy(&write_codec);
}
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Originate Resulted in Error Cause: %d [%s]\n", *cause, switch_channel_cause2str(*cause));
- }
- if (odata) {
- free(odata);
- }
- if (!pass && write_codec.implementation) {
- switch_core_codec_destroy(&write_codec);
- }
+ for (i = 0; i < and_argc; i++) {
+ if (!peer_channels[i]) {
+ continue;
+ }
+ switch_core_session_rwunlock(peer_sessions[i]);
+ }
- for (i = 0; i < argc; i++) {
- if (!peer_channels[i]) {
- continue;
+ if (status == SWITCH_STATUS_SUCCESS) {
+ break;
}
- switch_core_session_rwunlock(peer_sessions[i]);
}
+ switch_safe_free(odata);
return status;
}
More information about the Freeswitch-svn
mailing list