[Freeswitch-svn] [commit] r5177 - in freeswitch/trunk/src: . include

Freeswitch SVN anthm at freeswitch.org
Mon May 14 14:18:38 EDT 2007


Author: anthm
Date: Mon May 14 14:18:38 2007
New Revision: 5177

Modified:
   freeswitch/trunk/src/include/switch_types.h
   freeswitch/trunk/src/switch_ivr.c
   freeswitch/trunk/src/switch_ivr_async.c

Log:
update

Modified: freeswitch/trunk/src/include/switch_types.h
==============================================================================
--- freeswitch/trunk/src/include/switch_types.h	(original)
+++ freeswitch/trunk/src/include/switch_types.h	Mon May 14 14:18:38 2007
@@ -538,7 +538,7 @@
 CF_ORIGINATOR	= (1 <<  3) - Channel is an originator
 CF_TRANSFER		= (1 <<  4) - Channel is being transfered
 CF_ACCEPT_CNG	= (1 <<  5) - Channel will accept CNG frames
-CF_LOCK_THREAD	= (1 <<  6) - Prevent the channel thread from exiting while this flag is set
+CF_WAIT_FOR_ME	= (1 <<  6) - Channel wants you to wait
 CF_BRIDGED		= (1 <<  7) - Channel in a bridge
 CF_HOLD			= (1 <<  8) - Channel is on hold
 CF_SERVICE		= (1 <<  9) - Channel has a service thread
@@ -565,7 +565,7 @@
 	CF_ORIGINATOR = (1 << 3),
 	CF_TRANSFER = (1 << 4),
 	CF_ACCEPT_CNG = (1 << 5),
-	CF_LOCK_THREAD = (1 << 6),
+	CF_WAIT_FOR_ME = (1 << 6),
 	CF_BRIDGED = (1 << 7),
 	CF_HOLD = (1 << 8),
 	CF_SERVICE = (1 << 9),

Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c	(original)
+++ freeswitch/trunk/src/switch_ivr.c	Mon May 14 14:18:38 2007
@@ -272,13 +272,15 @@
 	unsigned long CMD_NOMEDIA = switch_hashfunc_default("nomedia", &hlen);
 	unsigned long CMD_UNICAST = switch_hashfunc_default("unicast", &hlen);
 	char *lead_frames = switch_event_get_header(event, "lead-frames");
-	
+	switch_status_t status = SWITCH_STATUS_SUCCESS;
+
 	assert(channel != NULL);
 	assert(event != NULL);
 
 	if (switch_strlen_zero(cmd)) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Command!\n");
-		return SWITCH_STATUS_FALSE;
+		status = SWITCH_STATUS_FALSE;
+		goto done;
 	}
 
 	hlen = (switch_size_t) strlen(cmd);
@@ -289,12 +291,11 @@
 	if (lead_frames) {
 		switch_frame_t *read_frame;
 		int frame_count = atoi(lead_frames);
-		switch_status_t status;
-
+		
 		while(frame_count > 0) {
 			status = switch_core_session_read_frame(session, &read_frame, -1, 0);
 			if (!SWITCH_READ_ACCEPTABLE(status)) {
-				return status;
+				goto done;
 			}
 			if (!switch_test_flag(read_frame, SFF_CNG)) {
 				frame_count--;
@@ -365,12 +366,33 @@
 		switch_channel_hangup(channel, cause);
 	} else if (cmd_hash == CMD_NOMEDIA) {
 		char *uuid = switch_event_get_header(event, "nomedia-uuid");
+		char *waitfor = switch_event_get_header(event, "wait-for");
+		if (waitfor) {
+			switch_core_session_t *w_session;
+			
+			if ((w_session = switch_core_session_locate(waitfor))) {
+				switch_channel_t *w_channel = switch_core_session_get_channel(w_session);
+				int sanity = 0;
+
+				while(switch_channel_test_flag(w_channel, CF_WAIT_FOR_ME)) {
+					switch_yield(1000);
+					if (++sanity > 10000) {
+						switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Timeout waiting for channel %s\n", switch_channel_get_name(w_channel));
+						switch_channel_clear_flag(w_channel, CF_WAIT_FOR_ME);
+						break;
+					}
+				}
+				switch_core_session_rwunlock(w_session);
+			}
+			
+		}
 		switch_ivr_nomedia(uuid, SMF_REBRIDGE);
 	}
 
-
+ done:
 	switch_channel_clear_flag(channel, CF_EVENT_PARSE);
-	return SWITCH_STATUS_SUCCESS;
+	switch_channel_clear_flag(channel, CF_WAIT_FOR_ME);
+	return status;
 
 }
 

Modified: freeswitch/trunk/src/switch_ivr_async.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_async.c	(original)
+++ freeswitch/trunk/src/switch_ivr_async.c	Mon May 14 14:18:38 2007
@@ -775,10 +775,10 @@
 		char *p;
 
 		master = session;
-
+		
 		channel = switch_core_session_get_channel(session);
 		assert(channel != NULL);
-
+		
 		if ((nomedia = switch_channel_test_flag(channel, CF_BYPASS_MEDIA))) {
 			switch_ivr_media(uuid, SMF_REBRIDGE);
 		}
@@ -796,8 +796,9 @@
 			}
 		}
 
-		if ((flags & SMF_ECHO_BLEG) && (other_uuid = switch_channel_get_variable(channel, SWITCH_BRIDGE_VARIABLE))
+		if ((flags & SMF_ECHO_BLEG) && (other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))
 			&& (other_session = switch_core_session_locate(other_uuid))) {
+
 			if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
 				switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-command", "execute");
 				switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-name", "%s", app);
@@ -806,12 +807,13 @@
 				if ((flags & SMF_LOOP)) {
 					switch_event_add_header(event, SWITCH_STACK_BOTTOM, "loops", "%d", -1);
 				}
-				
 				switch_core_session_queue_private_event(other_session, &event);
 			}
 			
-			switch_core_session_rwunlock(other_session);
+			
 			master = other_session;
+			switch_core_session_rwunlock(other_session);
+			
 			other_session = NULL;
 		}
 
@@ -833,6 +835,17 @@
 			if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
 				switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-command", "nomedia");
 				switch_event_add_header(event, SWITCH_STACK_BOTTOM, "nomedia-uuid", "%s", uuid);
+				if ((flags & SMF_ECHO_BLEG) && (flags & SMF_ECHO_ALEG)) {
+					switch_channel_t *channel = switch_core_session_get_channel(master);
+					char *bto = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
+					if ((other_session = switch_core_session_locate(bto))) {
+						switch_channel_t *other_channel = switch_core_session_get_channel(other_session);
+						switch_channel_set_flag(other_channel, CF_WAIT_FOR_ME);
+						switch_event_add_header(event, SWITCH_STACK_BOTTOM, "wait-for", "%s", bto);
+						switch_core_session_rwunlock(other_session);
+					}
+				}
+
 				switch_core_session_queue_private_event(master, &event);
 			}
 		}



More information about the Freeswitch-svn mailing list