Revision
15080
Author
gmaruzz
Date
2009-10-05 07:10:14 -0500 (Mon, 05 Oct 2009)

Log Message

gsmopen: find idle interface, react to remote party refusing our outbound call

Modified Paths

Diff

Modified: freeswitch/branches/gmaruzz/mod_gsmopen/gsmopen_protocol.c (15079 => 15080)


--- freeswitch/branches/gmaruzz/mod_gsmopen/gsmopen_protocol.c	2009-10-05 10:16:56 UTC (rev 15079)
+++ freeswitch/branches/gmaruzz/mod_gsmopen/gsmopen_protocol.c	2009-10-05 12:10:14 UTC (rev 15080)
@@ -677,9 +677,27 @@
 				tech_pvt->phone_callflow = CALLFLOW_CALL_LINEBUSY;
 				if (option_debug > 1)
 					DEBUGA_GSMOPEN("|%s| CALLFLOW_CALL_LINEBUSY\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
-				if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN && tech_pvt->owner) {
-					ast_setstate(tech_pvt->owner, GSMOPEN_STATE_BUSY);
-					gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_BUSY);
+				//if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN && tech_pvt->owner && tech_pvt->phone_callflow != CALLFLOW_CALL_DOWN) {
+				if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN && tech_pvt->phone_callflow != CALLFLOW_CALL_DOWN) {
+					//ast_setstate(tech_pvt->owner, GSMOPEN_STATE_BUSY);
+					//gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_BUSY);
+					//cicopet
+					switch_core_session_t *session = NULL;
+					switch_channel_t *channel = NULL;
+
+					tech_pvt->interface_state = GSMOPEN_STATE_DOWN;
+
+					session = switch_core_session_locate(tech_pvt->session_uuid_str);
+					if (session) {
+						channel = switch_core_session_get_channel(session);
+						//gsmopen_hangup(tech_pvt);
+						switch_core_session_rwunlock(session);
+						switch_channel_hangup(channel, 0);
+					}
+					//
+					//tech_pvt->owner->hangupcause = GSMOPEN_CAUSE_FAILURE;
+					//gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_HANGUP);
+
 				} else {
 					ERRORA("Why BUSY now?\n", GSMOPEN_P_LOG);
 				}

Modified: freeswitch/branches/gmaruzz/mod_gsmopen/mod_gsmopen.c (15079 => 15080)


--- freeswitch/branches/gmaruzz/mod_gsmopen/mod_gsmopen.c	2009-10-05 10:16:56 UTC (rev 15079)
+++ freeswitch/branches/gmaruzz/mod_gsmopen/mod_gsmopen.c	2009-10-05 12:10:14 UTC (rev 15080)
@@ -549,9 +549,9 @@
 	}
 
 	tech_pvt->interface_state = GSMOPEN_STATE_IDLE;
-	if (tech_pvt->phone_callflow == CALLFLOW_STATUS_FINISHED) {
+	//FIXME if (tech_pvt->phone_callflow == CALLFLOW_STATUS_FINISHED) {
 		tech_pvt->phone_callflow = CALLFLOW_CALL_IDLE;
-	}
+	//FIXME }
 	switch_mutex_unlock(globals.mutex);
 
 	return SWITCH_STATUS_SUCCESS;
@@ -1003,9 +1003,10 @@
 				/* Find the first idle interface using Round Robin */
 				DEBUGA_GSMOPEN("Finding one available gsmopen interface RR\n", GSMOPEN_P_LOG);
 				tech_pvt = find_available_gsmopen_interface_rr(NULL);
-				if (tech_pvt)
+				if (tech_pvt){
 					found = 1;
-				DEBUGA_GSMOPEN("FOUND one available gsmopen interface RR\n", GSMOPEN_P_LOG);
+					DEBUGA_GSMOPEN("FOUND one available gsmopen interface RR\n", GSMOPEN_P_LOG);
+				}
 			}
 
 			for (i = 0; !found && i < GSMOPEN_MAX_INTERFACES; i++) {
@@ -2040,10 +2041,8 @@
 
 			tech_pvt = &globals.GSMOPEN_INTERFACES[interface_id];
 			gsmopen_state = tech_pvt->interface_state;
-			//DEBUGA_GSMOPEN("gsmopen interface: %d, name: %s, state: %d\n", GSMOPEN_P_LOG, interface_id, globals.GSMOPEN_INTERFACES[interface_id].name, gsmopen_state);
-			if ((tech_pvt_calling ? strcmp(tech_pvt->gsmopen_user, tech_pvt_calling->gsmopen_user) : 1)
-				&& (GSMOPEN_STATE_DOWN == gsmopen_state || 0 == gsmopen_state) && (tech_pvt->phone_callflow == CALLFLOW_STATUS_FINISHED
-																				   || 0 == tech_pvt->phone_callflow)) {
+			DEBUGA_GSMOPEN("gsmopen interface: %d, name: %s, state: %d\n", GSMOPEN_P_LOG, interface_id, globals.GSMOPEN_INTERFACES[interface_id].name, gsmopen_state);
+			if ((tech_pvt_calling ? strcmp(tech_pvt->gsmopen_user, tech_pvt_calling->gsmopen_user) : 1) && (GSMOPEN_STATE_DOWN == gsmopen_state || 0 == gsmopen_state) && (tech_pvt->phone_callflow == CALLFLOW_STATUS_FINISHED || 0 == tech_pvt->phone_callflow)) {
 				DEBUGA_GSMOPEN("returning as available gsmopen interface name: %s, state: %d callflow: %d\n", GSMOPEN_P_LOG, tech_pvt->name, gsmopen_state,
 							   tech_pvt->phone_callflow);
 				/*set to Dialing state to avoid other thread fint it, don't know if it is safe */