Revision
15368
Author
anthm
Date
2009-11-05 00:56:38 -0600 (Thu, 05 Nov 2009)

Log Message

MODENDP-259

Modified Paths

Diff

Modified: freeswitch/trunk/src/include/switch_types.h (15367 => 15368)


--- freeswitch/trunk/src/include/switch_types.h	2009-11-05 06:56:16 UTC (rev 15367)
+++ freeswitch/trunk/src/include/switch_types.h	2009-11-05 06:56:38 UTC (rev 15368)
@@ -929,6 +929,7 @@
 	CF_NOT_READY,
 	CF_SIGNAL_BRIDGE_TTL,
 	CF_MEDIA_BRIDGE_TTL,
+	CF_HANGUP_AFTER_BRIDGE,
 	/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
 	CF_FLAG_MAX
 } switch_channel_flag_t;

Modified: freeswitch/trunk/src/switch_ivr_bridge.c (15367 => 15368)


--- freeswitch/trunk/src/switch_ivr_bridge.c	2009-11-05 06:56:16 UTC (rev 15367)
+++ freeswitch/trunk/src/switch_ivr_bridge.c	2009-11-05 06:56:38 UTC (rev 15368)
@@ -793,7 +793,10 @@
             switch_channel_set_variable(other_channel, SWITCH_BRIDGE_VARIABLE, NULL);
 			
             if (switch_channel_up(other_channel)) {
-				
+				if (switch_channel_test_flag(other_channel, CF_HANGUP_AFTER_BRIDGE)) {
+					switch_channel_hangup(other_channel, switch_channel_get_cause(channel));	
+				}
+
 				if (switch_true(switch_channel_get_variable(other_channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) {
 					switch_ivr_park_session(other_session);
 				} else if ((var = switch_channel_get_variable(other_channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) {
@@ -1123,6 +1126,11 @@
 		!switch_channel_test_flag(caller_channel, CF_XFER_ZOMBIE) && !a_leg->clean_exit && !inner_bridge) {
 		if ((state != CS_EXECUTE && state != CS_SOFT_EXECUTE && state != CS_PARK && state != CS_ROUTING) ||
 			(switch_channel_test_flag(peer_channel, CF_ANSWERED) && state < CS_HANGUP)) {
+
+			if (switch_channel_test_flag(caller_channel, CF_HANGUP_AFTER_BRIDGE)) {
+				switch_channel_hangup(caller_channel, switch_channel_get_cause(peer_channel));	
+			}
+
 			if (switch_true(switch_channel_get_variable(caller_channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) {
 				switch_ivr_park_session(session);
 			} else if ((var = switch_channel_get_variable(caller_channel, SWITCH_TRANSFER_AFTER_BRIDGE_VARIABLE))) {

Modified: freeswitch/trunk/src/switch_ivr_originate.c (15367 => 15368)


--- freeswitch/trunk/src/switch_ivr_originate.c	2009-11-05 06:56:16 UTC (rev 15367)
+++ freeswitch/trunk/src/switch_ivr_originate.c	2009-11-05 06:56:38 UTC (rev 15368)
@@ -2089,7 +2089,7 @@
 						goto notready;
 					}
 				}
-				
+
 				/* read from the channel while we wait if the audio is up on it */
 				if (oglobals.session &&
 					!switch_channel_test_flag(caller_channel, CF_PROXY_MODE) &&
@@ -2281,7 +2281,7 @@
 					const char *context = NULL;
 					const char *dialplan = NULL;
 					switch_core_session_t *holding_session;
-					
+
 					if (caller_channel) {
 						if (zstr(context)) {
 							context = switch_channel_get_variable(caller_channel, "context"); 
@@ -2302,7 +2302,7 @@
 					if ((holding_session = switch_core_session_locate(holding))) {
 						switch_channel_t *holding_channel = switch_core_session_get_channel(holding_session);
 						switch_status_t mstatus = SWITCH_STATUS_FALSE;
-						
+
 						if (caller_channel) {
 							if ((mstatus = switch_channel_caller_extension_masquerade(caller_channel, holding_channel, 1)) == SWITCH_STATUS_SUCCESS) {
 								switch_channel_restart(holding_channel);
@@ -2333,9 +2333,19 @@
 					}
 					force_reason = SWITCH_CAUSE_ATTENDED_TRANSFER;
 				} else {
+
 					if (peer_channel && switch_channel_ready(peer_channel)) {
+						switch_core_session_t *holding_session;
+
 						force_reason = SWITCH_CAUSE_ATTENDED_TRANSFER;
+
+						if ((holding_session = switch_core_session_locate(holding))) {
+							switch_channel_set_flag(switch_core_session_get_channel(holding_session), CF_HANGUP_AFTER_BRIDGE);
+							switch_core_session_rwunlock(holding_session);
+						}
+						
 						switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(peer_session));
+						holding = NULL;
 						oglobals.idx = IDX_NADA;
 						if (caller_channel && switch_channel_up(caller_channel)) {
 							switch_channel_hangup(caller_channel, SWITCH_CAUSE_ATTENDED_TRANSFER);
@@ -2349,8 +2359,10 @@
 
 						if ((holding_session = switch_core_session_locate(holding))) {
 							switch_channel_t *holding_channel = switch_core_session_get_channel(holding_session);
+
 							if (caller_channel && switch_channel_ready(caller_channel)) {
 								switch_ivr_uuid_bridge(holding, switch_core_session_get_uuid(session));
+								holding = NULL;
 							} else {
 								switch_channel_hangup(holding_channel, SWITCH_CAUSE_NORMAL_UNSPECIFIED);
 							}
@@ -2361,7 +2373,6 @@
 
 				peer_session = NULL;
 				peer_channel = NULL;
-				
 			}
 			
 			for (i = 0; i < and_argc; i++) {