[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