Revision
15919
Author
anthm
Date
2009-12-11 15:51:10 -0600 (Fri, 11 Dec 2009)

Log Message

MODAPP-376 3rd time's a charm

Modified Paths

Diff

Modified: freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c (15918 => 15919)


--- freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c	2009-12-11 21:50:29 UTC (rev 15918)
+++ freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c	2009-12-11 21:51:10 UTC (rev 15919)
@@ -1578,31 +1578,40 @@
 	switch_channel_clear_flag(peer_channel, CF_INNER_BRIDGE);
 	switch_channel_clear_flag(channel, CF_INNER_BRIDGE);
 
-	if (switch_channel_down(peer_channel)) {
+	if (zstr(bond) && switch_channel_down(peer_channel)) {
 		switch_core_session_rwunlock(peer_session);
 		goto end;
 	}
 
 	if (bond) {
 		char buf[128] = "";
+		int br = 0;
 
-		if (!switch_channel_ready(channel)) {
-			switch_ivr_uuid_bridge(switch_core_session_get_uuid(peer_session), bond);
-		} else if ((b_session = switch_core_session_locate(bond))) {
-			switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
-			switch_snprintf(buf, sizeof(buf), "%s %s", switch_core_session_get_uuid(peer_session), switch_core_session_get_uuid(session));
-			switch_channel_set_variable(b_channel, "xfer_uuids", buf);
+		switch_channel_set_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE, bond);
 
-			switch_snprintf(buf, sizeof(buf), "%s %s", switch_core_session_get_uuid(peer_session), bond);
-			switch_channel_set_variable(channel, "xfer_uuids", buf);
+		if (!switch_channel_down(peer_channel)) {
+			if (!switch_channel_ready(channel)) {
+				switch_ivr_uuid_bridge(switch_core_session_get_uuid(peer_session), bond);
+				br++;
+			} else if ((b_session = switch_core_session_locate(bond))) {
+				switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
+				switch_snprintf(buf, sizeof(buf), "%s %s", switch_core_session_get_uuid(peer_session), switch_core_session_get_uuid(session));
+				switch_channel_set_variable(b_channel, "xfer_uuids", buf);
+				
+				switch_snprintf(buf, sizeof(buf), "%s %s", switch_core_session_get_uuid(peer_session), bond);
+				switch_channel_set_variable(channel, "xfer_uuids", buf);
+				
+				switch_core_event_hook_add_state_change(session, hanguphook);
+				switch_core_event_hook_add_state_change(b_session, hanguphook);
+				
+				switch_core_session_rwunlock(b_session);
+			}
+		}
 
-			switch_core_event_hook_add_state_change(session, hanguphook);
-			switch_core_event_hook_add_state_change(b_session, hanguphook);
-
-			switch_core_session_rwunlock(b_session);
+		if (!br) {
+			switch_ivr_uuid_bridge(switch_core_session_get_uuid(session), bond);
 		}
-
-		switch_channel_set_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE, bond);
+		
 	}
 
 	switch_core_session_rwunlock(peer_session);

Modified: freeswitch/trunk/src/switch_core_session.c (15918 => 15919)


--- freeswitch/trunk/src/switch_core_session.c	2009-12-11 21:50:29 UTC (rev 15918)
+++ freeswitch/trunk/src/switch_core_session.c	2009-12-11 21:51:10 UTC (rev 15919)
@@ -1472,11 +1472,16 @@
 
 	if ((application_interface = switch_loadable_module_get_application_interface(app)) == 0) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Application %s\n", app);
+		goto end;
 	} else if (application_interface->flags) {
 		*flags = application_interface->flags;
 		status = SWITCH_STATUS_SUCCESS;
 	}
 
+	UNPROTECT_INTERFACE(application_interface);
+
+ end:
+
 	return status;
 
 }
@@ -1524,6 +1529,7 @@
 	switch_core_session_exec(session, application_interface, arg);
 
 done:
+
 	UNPROTECT_INTERFACE(application_interface);
 	
 	return status;

Modified: freeswitch/trunk/src/switch_ivr.c (15918 => 15919)


--- freeswitch/trunk/src/switch_ivr.c	2009-12-11 21:50:29 UTC (rev 15918)
+++ freeswitch/trunk/src/switch_ivr.c	2009-12-11 21:51:10 UTC (rev 15919)
@@ -501,7 +501,6 @@
 	}
 
 	if (cmd_hash == CMD_EXECUTE) {
-		switch_application_interface_t *application_interface;
 		char *app_name = switch_event_get_header(event, "execute-app-name");
 		char *app_arg = switch_event_get_header(event, "execute-app-arg");
 		char *loop_h = switch_event_get_header(event, "loops");
@@ -513,61 +512,60 @@
 		}
 
 		if (app_name) {
-			if ((application_interface = switch_loadable_module_get_application_interface(app_name))) {
-				if (application_interface->application_function) {
-					int x;
-					const char *b_uuid = NULL;
-					switch_core_session_t *b_session = NULL;
+			int x;
+			const char *b_uuid = NULL;
+			switch_core_session_t *b_session = NULL;
 
-					switch_channel_clear_flag(channel, CF_STOP_BROADCAST);
-					switch_channel_set_flag(channel, CF_BROADCAST);
-					if (hold_bleg && switch_true(hold_bleg)) {
-						if ((b_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
-							const char *stream;
-							b_uuid = switch_core_session_strdup(session, b_uuid);
+			switch_channel_clear_flag(channel, CF_STOP_BROADCAST);
+			switch_channel_set_flag(channel, CF_BROADCAST);
+			if (hold_bleg && switch_true(hold_bleg)) {
+				if ((b_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
+					const char *stream;
+					b_uuid = switch_core_session_strdup(session, b_uuid);
 
-							if (!(stream = switch_channel_get_variable_partner(channel, SWITCH_HOLD_MUSIC_VARIABLE))) {
-								stream = switch_channel_get_variable(channel, SWITCH_HOLD_MUSIC_VARIABLE);
-							}
-
-							if (stream && switch_is_moh(stream)) {
-								if ((b_session = switch_core_session_locate(b_uuid))) {
-									switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
-									switch_ivr_broadcast(b_uuid, stream, SMF_ECHO_ALEG | SMF_LOOP);
-									switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_TRUE, 5000, NULL);
-									switch_core_session_rwunlock(b_session);
-								}
-							} else {
-								b_uuid = NULL;
-							}
-						}
+					if (!(stream = switch_channel_get_variable_partner(channel, SWITCH_HOLD_MUSIC_VARIABLE))) {
+						stream = switch_channel_get_variable(channel, SWITCH_HOLD_MUSIC_VARIABLE);
 					}
-					for (x = 0; x < loops || loops < 0; x++) {
-						switch_time_t b4, aftr;
 
-						switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Command Execute %s(%s)\n",
-										  switch_channel_get_name(channel), app_name, switch_str_nil(app_arg));
-						b4 = switch_micro_time_now();
-						switch_core_session_exec(session, application_interface, app_arg);
-						aftr = switch_micro_time_now();
-						if (!switch_channel_ready(channel) || switch_channel_test_flag(channel, CF_STOP_BROADCAST) || aftr - b4 < 500000) {
-							break;
-						}
-					}
-
-					if (b_uuid) {
+					if (stream && switch_is_moh(stream)) {
 						if ((b_session = switch_core_session_locate(b_uuid))) {
 							switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
-							switch_channel_stop_broadcast(b_channel);
-							switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000, NULL);
+							switch_ivr_broadcast(b_uuid, stream, SMF_ECHO_ALEG | SMF_LOOP);
+							switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_TRUE, 5000, NULL);
 							switch_core_session_rwunlock(b_session);
 						}
+					} else {
+						b_uuid = NULL;
 					}
+				}
+			}
 
-					switch_channel_clear_flag(channel, CF_BROADCAST);
+			for (x = 0; x < loops || loops < 0; x++) {
+				switch_time_t b4, aftr;
+
+				switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Command Execute %s(%s)\n",
+								  switch_channel_get_name(channel), app_name, switch_str_nil(app_arg));
+				b4 = switch_micro_time_now();
+				if (switch_core_session_execute_application(session, app_name, app_arg) != SWITCH_STATUS_SUCCESS) {
+					goto done;
 				}
-				UNPROTECT_INTERFACE(application_interface);
+
+				aftr = switch_micro_time_now();
+				if (!switch_channel_ready(channel) || switch_channel_test_flag(channel, CF_STOP_BROADCAST) || aftr - b4 < 500000) {
+					break;
+				}
 			}
+
+			if (b_uuid) {
+				if ((b_session = switch_core_session_locate(b_uuid))) {
+					switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
+					switch_channel_stop_broadcast(b_channel);
+					switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000, NULL);
+					switch_core_session_rwunlock(b_session);
+				}
+			}
+			
+			switch_channel_clear_flag(channel, CF_BROADCAST);
 		}
 	} else if (cmd_hash == CMD_UNICAST) {
 		char *local_ip = switch_event_get_header(event, "local-ip");

Modified: freeswitch/trunk/src/switch_ivr_bridge.c (15918 => 15919)


--- freeswitch/trunk/src/switch_ivr_bridge.c	2009-12-11 21:50:29 UTC (rev 15918)
+++ freeswitch/trunk/src/switch_ivr_bridge.c	2009-12-11 21:51:10 UTC (rev 15919)
@@ -637,7 +637,8 @@
 	}
 	
 	if (switch_channel_get_state(channel) == CS_EXCHANGE_MEDIA) {
-		switch_channel_set_state(channel, CS_RESET);
+		switch_channel_set_variable(channel, "park_timeout", "3");
+		switch_channel_set_state(channel, CS_PARK);
 	}
 
 	return SWITCH_STATUS_FALSE;