[Freeswitch-svn] [commit] r6975 - in freeswitch/trunk/src: . mod/endpoints/mod_sofia
Freeswitch SVN
mikej at freeswitch.org
Mon Dec 24 14:23:36 EST 2007
Author: mikej
Date: Mon Dec 24 14:23:36 2007
New Revision: 6975
Modified:
freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
freeswitch/trunk/src/switch_core_session.c
Log:
MODENDP-60 (reject calls for no remaining forwards in core)
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 Mon Dec 24 14:23:36 2007
@@ -224,6 +224,8 @@
return 504;
case SWITCH_CAUSE_ORIGINATOR_CANCEL:
return 487;
+ case SWITCH_CAUSE_EXCHANGE_ROUTING_ERROR:
+ return 483;
default:
return 480;
}
Modified: freeswitch/trunk/src/switch_core_session.c
==============================================================================
--- freeswitch/trunk/src/switch_core_session.c (original)
+++ freeswitch/trunk/src/switch_core_session.c Mon Dec 24 14:23:36 2007
@@ -186,51 +186,61 @@
switch_channel_t *channel = NULL;
switch_caller_profile_t *outgoing_profile = caller_profile;
switch_call_cause_t cause = SWITCH_CAUSE_REQUESTED_CHAN_UNAVAIL;
+ const char *forwardvar;
+ int forwardval = 70;
if ((endpoint_interface = switch_loadable_module_get_endpoint_interface(endpoint_name)) == 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not locate channel type %s\n", endpoint_name);
return SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED;
}
- if (endpoint_interface->io_routines->outgoing_channel) {
- if (session) {
- channel = switch_core_session_get_channel(session);
- if (caller_profile) {
- const char *ecaller_id_name = NULL, *ecaller_id_number = NULL;
+ if (!endpoint_interface->io_routines->outgoing_channel) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not locate outgoing channel interface for %s\n", endpoint_name);
+ return SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED;
+ }
- ecaller_id_name = switch_channel_get_variable(channel, "effective_caller_id_name");
- ecaller_id_number = switch_channel_get_variable(channel, "effective_caller_id_number");
+ forwardvar = switch_channel_get_variable(channel, SWITCH_MAX_FORWARDS_VARIABLE);
+ if (!switch_strlen_zero(forwardvar)) {
+ forwardval = atoi(forwardvar) - 1;
+ }
+ if (forwardval <= 0) {
+ return SWITCH_CAUSE_EXCHANGE_ROUTING_ERROR;
+ }
- if (ecaller_id_name || ecaller_id_number) {
- outgoing_profile = switch_caller_profile_clone(session, caller_profile);
+ if (session) {
+ channel = switch_core_session_get_channel(session);
+ if (caller_profile) {
+ const char *ecaller_id_name = NULL, *ecaller_id_number = NULL;
- if (ecaller_id_name) {
- outgoing_profile->caller_id_name = ecaller_id_name;
- }
- if (ecaller_id_number) {
- outgoing_profile->caller_id_number = ecaller_id_number;
- }
+ ecaller_id_name = switch_channel_get_variable(channel, "effective_caller_id_name");
+ ecaller_id_number = switch_channel_get_variable(channel, "effective_caller_id_number");
+
+ if (ecaller_id_name || ecaller_id_number) {
+ outgoing_profile = switch_caller_profile_clone(session, caller_profile);
+
+ if (ecaller_id_name) {
+ outgoing_profile->caller_id_name = ecaller_id_name;
+ }
+ if (ecaller_id_number) {
+ outgoing_profile->caller_id_number = ecaller_id_number;
}
- }
- if (!outgoing_profile) {
- outgoing_profile = switch_channel_get_caller_profile(channel);
}
}
-
- if ((cause = endpoint_interface->io_routines->outgoing_channel(session, outgoing_profile, new_session, pool, flags)) != SWITCH_CAUSE_SUCCESS) {
- return cause;
+ if (!outgoing_profile) {
+ outgoing_profile = switch_channel_get_caller_profile(channel);
}
+ }
- if (session) {
- for (ptr = session->event_hooks.outgoing_channel; ptr; ptr = ptr->next) {
- if ((status = ptr->outgoing_channel(session, caller_profile, *new_session, flags)) != SWITCH_STATUS_SUCCESS) {
- break;
- }
+ if ((cause = endpoint_interface->io_routines->outgoing_channel(session, outgoing_profile, new_session, pool, flags)) != SWITCH_CAUSE_SUCCESS) {
+ return cause;
+ }
+
+ if (session) {
+ for (ptr = session->event_hooks.outgoing_channel; ptr; ptr = ptr->next) {
+ if ((status = ptr->outgoing_channel(session, caller_profile, *new_session, flags)) != SWITCH_STATUS_SUCCESS) {
+ break;
}
}
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not locate outgoing channel interface for %s\n", endpoint_name);
- return SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED;
}
switch_assert(*new_session != NULL);
@@ -251,6 +261,8 @@
if (channel && peer_channel) {
const char *export_vars, *val;
switch_codec_t *read_codec = switch_core_session_get_read_codec(session);
+ const char *max_forwards = switch_core_session_sprintf(session, "%d", forwardval);
+ switch_channel_set_variable(peer_channel, SWITCH_MAX_FORWARDS_VARIABLE, max_forwards);
if (read_codec) {
char tmp[80];
@@ -288,16 +300,6 @@
switch_channel_set_variable(peer_channel, SWITCH_B_SDP_VARIABLE, val);
}
- val = switch_channel_get_variable(channel, SWITCH_MAX_FORWARDS_VARIABLE);
-
- if (!switch_strlen_zero(val)) {
- int forwardval = atoi(val) - 1;
- const char *max_forwards = switch_core_session_sprintf(session, "%d", forwardval);
- switch_channel_set_variable(peer_channel, SWITCH_MAX_FORWARDS_VARIABLE, max_forwards);
- } else {
- switch_channel_set_variable(peer_channel, SWITCH_MAX_FORWARDS_VARIABLE, "70");
- }
-
if (switch_channel_test_flag(channel, CF_BYPASS_MEDIA)) {
switch_channel_set_flag(peer_channel, CF_BYPASS_MEDIA);
}
More information about the Freeswitch-svn
mailing list