Revision
14533
Author
gmaruzz
Date
2009-08-15 10:37:44 -0500 (Sat, 15 Aug 2009)

Log Message

skypiax: more stability, no dangling channels, MODSKYPIAX-42, added 'sk list' statistics (thanks Seven Du) MODENDP-236

Modified Paths

Diff

Modified: freeswitch/trunk/src/mod/endpoints/mod_skypiax/mod_skypiax.c (14532 => 14533)


--- freeswitch/trunk/src/mod/endpoints/mod_skypiax/mod_skypiax.c	2009-08-15 14:32:33 UTC (rev 14532)
+++ freeswitch/trunk/src/mod/endpoints/mod_skypiax/mod_skypiax.c	2009-08-15 15:37:44 UTC (rev 14533)
@@ -96,6 +96,51 @@
 #define SOFT_RELOAD 1
 /* END: Changes heres */
 
+char *interface_status[] = {  /* should match SKYPIAX_STATE_xxx in skypiax.h */
+	"IDLE",
+	"DOWN",
+	"RING",
+	"DIALING",
+	"BUSY",
+	"UP",
+	"RINGING",
+	"PRERING",
+	"DOUBLE",
+	"SELECTD",
+	"HANG_RQ",
+	"PREANSW"
+};
+char *skype_callflow[] = {  /* should match CALLFLOW_XXX in skypiax.h */
+"CALL_IDLE",
+"CALL_DOWN",
+"INCOMING_RNG",
+"CALL_DIALING",
+"CALL_LINEBUSY",
+"CALL_ACTIVE",
+"INCOMING_HNG",
+"CALL_RLEASD",
+"CALL_NOCARR",
+"CALL_INFLUX",
+"CALL_INCOMING",
+"CALL_FAILED",
+"CALL_NOSRVC",
+"CALL_OUTRESTR",
+"CALL_SECFAIL",
+"CALL_NOANSWER",
+"STATUS_FNSHED",
+"STATUS_CANCLED",
+"STATUS_FAILED",
+"STATUS_REFUSED",
+"STATUS_RINGING",
+"STATUS_INPROGRS",
+"STATUS_UNPLACD",
+"STATUS_ROUTING",
+"STATUS_EARLYMD",
+"INCOMING_CLID",
+"STATUS_RMTEHOLD"
+};
+
+
 static struct {
 	int debug;
 	char *ip;
@@ -140,6 +185,7 @@
 static switch_status_t channel_on_destroy(switch_core_session_t *session);
 static switch_status_t channel_on_routing(switch_core_session_t *session);
 static switch_status_t channel_on_exchange_media(switch_core_session_t *session);
+static switch_status_t channel_on_consume_media(switch_core_session_t *session);
 static switch_status_t channel_on_soft_execute(switch_core_session_t *session);
 static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *session,
 													switch_event_t *var_event,
@@ -375,7 +421,7 @@
 
 	channel = switch_core_session_get_channel(session);
 	switch_assert(channel != NULL);
-	DEBUGA_SKYPE("%s CHANNEL INIT\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
+	//ERRORA("%s CHANNEL INIT\n", SKYPIAX_P_LOG, tech_pvt->name);
 	switch_set_flag(tech_pvt, TFLAG_IO);
 
 	/* Move channel's state machine to ROUTING. This means the call is trying
@@ -387,6 +433,7 @@
 	globals.calls++;
 
 	switch_mutex_unlock(globals.mutex);
+		DEBUGA_SKYPE("%s CHANNEL INIT %s\n", SKYPIAX_P_LOG, tech_pvt->name, switch_core_session_get_uuid(session));
 
 	return SWITCH_STATUS_SUCCESS;
 }
@@ -397,7 +444,10 @@
 
 	tech_pvt = switch_core_session_get_private(session);
 
+
 	if (tech_pvt) {
+		DEBUGA_SKYPE("%s CHANNEL DESTROY %s\n", SKYPIAX_P_LOG, tech_pvt->name, switch_core_session_get_uuid(session));
+
 		if (switch_core_codec_ready(&tech_pvt->read_codec)) {
 			switch_core_codec_destroy(&tech_pvt->read_codec);
 		}
@@ -406,7 +456,13 @@
 			switch_core_codec_destroy(&tech_pvt->write_codec);
 		}
 		*tech_pvt->session_uuid_str = '\0';
+		tech_pvt->interface_state = SKYPIAX_STATE_IDLE;
+		if(tech_pvt->skype_callflow == CALLFLOW_STATUS_FINISHED){
+			tech_pvt->skype_callflow = CALLFLOW_CALL_IDLE;
+		}
 		switch_core_session_set_private(session, NULL);
+	} else {
+		DEBUGA_SKYPE("!!!!!!NO tech_pvt!!!! CHANNEL DESTROY %s\n", SKYPIAX_P_LOG, switch_core_session_get_uuid(session));
 	}
 
 	return SWITCH_STATUS_SUCCESS;
@@ -425,6 +481,14 @@
 	tech_pvt = switch_core_session_get_private(session);
 	switch_assert(tech_pvt != NULL);
 
+ 	if (!switch_channel_test_flag(channel, CF_ANSWERED)) {
+ 		if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND) {
+ 			tech_pvt->ob_failed_calls++;
+ 		} else {
+ 			tech_pvt->ib_failed_calls++;
+ 		}
+ 	}
+
 	switch_clear_flag(tech_pvt, TFLAG_IO);
 	switch_clear_flag(tech_pvt, TFLAG_VOICE);
 	//switch_set_flag(tech_pvt, TFLAG_HANGUP);
@@ -437,12 +501,17 @@
 	}
 	//memset(tech_pvt->session_uuid_str, '\0', sizeof(tech_pvt->session_uuid_str));
 	//*tech_pvt->session_uuid_str = '\0';
-	DEBUGA_SKYPE("%s CHANNEL HANGUP\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
+	DEBUGA_SKYPE("%s CHANNEL HANGUP\n", SKYPIAX_P_LOG, tech_pvt->name);
 	switch_mutex_lock(globals.mutex);
 	globals.calls--;
 	if (globals.calls < 0) {
 		globals.calls = 0;
 	}
+
+		tech_pvt->interface_state = SKYPIAX_STATE_IDLE;
+		if(tech_pvt->skype_callflow == CALLFLOW_STATUS_FINISHED){
+			tech_pvt->skype_callflow = CALLFLOW_CALL_IDLE;
+		}
 	switch_mutex_unlock(globals.mutex);
 
 	return SWITCH_STATUS_SUCCESS;
@@ -459,7 +528,7 @@
 	tech_pvt = switch_core_session_get_private(session);
 	switch_assert(tech_pvt != NULL);
 
-	DEBUGA_SKYPE("%s CHANNEL ROUTING\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
+	DEBUGA_SKYPE("%s CHANNEL ROUTING\n", SKYPIAX_P_LOG, tech_pvt->name);
 
 	return SWITCH_STATUS_SUCCESS;
 }
@@ -476,7 +545,7 @@
 	tech_pvt = switch_core_session_get_private(session);
 	switch_assert(tech_pvt != NULL);
 
-	DEBUGA_SKYPE("%s CHANNEL EXECUTE\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
+	DEBUGA_SKYPE("%s CHANNEL EXECUTE\n", SKYPIAX_P_LOG, tech_pvt->name);
 
 	return SWITCH_STATUS_SUCCESS;
 }
@@ -492,6 +561,7 @@
 	tech_pvt = switch_core_session_get_private(session);
 	switch_assert(tech_pvt != NULL);
 
+	DEBUGA_SKYPE("%s CHANNEL KILL_CHANNEL\n", SKYPIAX_P_LOG, tech_pvt->name);
 	switch (sig) {
 	case SWITCH_SIG_KILL:
 		DEBUGA_SKYPE("%s CHANNEL got SWITCH_SIG_KILL\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
@@ -514,18 +584,30 @@
 
 	return SWITCH_STATUS_SUCCESS;
 }
+static switch_status_t channel_on_consume_media(switch_core_session_t *session)
+{
+	private_t *tech_pvt = NULL;
 
+	tech_pvt = switch_core_session_get_private(session);
+
+	DEBUGA_SKYPE("%s CHANNEL CONSUME_MEDIA\n", SKYPIAX_P_LOG, tech_pvt->name);
+	return SWITCH_STATUS_SUCCESS;
+}
+
+
 static switch_status_t channel_on_exchange_media(switch_core_session_t *session)
 {
 	private_t *tech_pvt = NULL;
-	DEBUGA_SKYPE("CHANNEL LOOPBACK\n", SKYPIAX_P_LOG);
+	tech_pvt = switch_core_session_get_private(session);
+	DEBUGA_SKYPE("%s CHANNEL EXCHANGE_MEDIA\n", SKYPIAX_P_LOG, tech_pvt->name);
 	return SWITCH_STATUS_SUCCESS;
 }
 
 static switch_status_t channel_on_soft_execute(switch_core_session_t *session)
 {
 	private_t *tech_pvt = NULL;
-	DEBUGA_SKYPE("CHANNEL TRANSMIT\n", SKYPIAX_P_LOG);
+	tech_pvt = switch_core_session_get_private(session);
+	DEBUGA_SKYPE("%s CHANNEL SOFT_EXECUTE\n", SKYPIAX_P_LOG, tech_pvt->name);
 	return SWITCH_STATUS_SUCCESS;
 }
 
@@ -534,6 +616,7 @@
 	private_t *tech_pvt = switch_core_session_get_private(session);
 	switch_assert(tech_pvt != NULL);
 
+	DEBUGA_SKYPE("%s CHANNEL SEND_DTMF\n", SKYPIAX_P_LOG, tech_pvt->name);
 	DEBUGA_SKYPE("DTMF: %c\n", SKYPIAX_P_LOG, dtmf->digit);
 
 	skypiax_senddigit(tech_pvt, dtmf->digit);
@@ -718,7 +801,7 @@
 	/*.on_hangup */ channel_on_hangup,
 	/*.on_exchange_media */ channel_on_exchange_media,
 	/*.on_soft_execute */ channel_on_soft_execute,
-	/*.on_consume_media */ NULL,
+	/*.on_consume_media */ channel_on_consume_media,
 	/*.on_hibernate */ NULL,
 	/*.on_reset */ NULL,
 	/*.on_park */ NULL,
@@ -749,6 +832,7 @@
 		int found = 0;
 		char interface_name[256];
 
+		DEBUGA_SKYPE("1 SESSION_REQUEST %s\n", SKYPIAX_P_LOG, switch_core_session_get_uuid(*new_session));
 		switch_core_session_add_stream(*new_session, NULL);
 
 
@@ -783,6 +867,7 @@
 						DEBUGA_SKYPE
 							("globals.SKYPIAX_INTERFACES[%d].name=|||%s||| session_uuid_str=|||%s||| is BUSY\n",
 							 SKYPIAX_P_LOG, i, globals.SKYPIAX_INTERFACES[i].name, globals.SKYPIAX_INTERFACES[i].session_uuid_str);
+						DEBUGA_SKYPE("1 SESSION_DESTROY %s\n", SKYPIAX_P_LOG, switch_core_session_get_uuid(*new_session));
 						switch_core_session_destroy(new_session);
 						switch_mutex_unlock(globals.mutex);
 						return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
@@ -804,6 +889,7 @@
 
 		if (!found) {
 			DEBUGA_SKYPE("Doh! no available interface for |||%s|||?\n", SKYPIAX_P_LOG, interface_name);
+			DEBUGA_SKYPE("2 SESSION_DESTROY %s\n", SKYPIAX_P_LOG, switch_core_session_get_uuid(*new_session));
 			switch_core_session_destroy(new_session);
 			switch_mutex_unlock(globals.mutex);
 			//return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
@@ -840,6 +926,8 @@
 			switch_mutex_unlock(globals.mutex);
 			return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
 		}
+    
+	tech_pvt->ob_calls++;
 
 		rdest = strchr(caller_profile->destination_number, '/');
 		*rdest++ = '\0';
@@ -904,14 +992,21 @@
 				} else {
 					DEBUGA_SKYPE("no session\n", SKYPIAX_P_LOG);
 				}
+	switch_mutex_lock(globals.mutex);
 				tech_pvt->interface_state = SKYPIAX_STATE_DOWN;
 				*tech_pvt->session_uuid_str = '\0';
 				*tech_pvt->skype_call_id = '\0';
+	switch_mutex_unlock(globals.mutex);
 
 				//ERRORA("LET'S WAIT\n", SKYPIAX_P_LOG);
 				switch_sleep(300000);	//0.3 sec
 				//ERRORA("WAIT'S OVER\n", SKYPIAX_P_LOG);
-				tech_pvt->skype_callflow = CALLFLOW_STATUS_FINISHED;
+				//tech_pvt->skype_callflow = CALLFLOW_STATUS_FINISHED;
+				//usleep(30000);	//0.03 sec
+	switch_mutex_lock(globals.mutex);
+				tech_pvt->skype_callflow = CALLFLOW_CALL_IDLE;
+				tech_pvt->interface_state = SKYPIAX_STATE_IDLE;
+	switch_mutex_unlock(globals.mutex);
 			} else {
 				ERRORA("no tech_pvt?\n", SKYPIAX_P_LOG);
 			}
@@ -1461,6 +1556,7 @@
 	switch_channel_t *channel = NULL;
 
 	if ((session = switch_core_session_request(skypiax_endpoint_interface, SWITCH_CALL_DIRECTION_INBOUND, NULL)) != 0) {
+		DEBUGA_SKYPE("2 SESSION_REQUEST %s\n", SKYPIAX_P_LOG, switch_core_session_get_uuid(session));
 		switch_core_session_add_stream(session, NULL);
 		channel = switch_core_session_get_channel(session);
 		if (!channel) {
@@ -1668,20 +1764,27 @@
 		int i;
 		char next_flag_char = ' ';
 
+	stream->write_function(stream, "F ID\t    Name    \tIB (F/T)    OB (F/T)\tState\tCallFlw\t\tUUID\n");
+	stream->write_function(stream, "= ====\t  ========  \t=======     =======\t======\t============\t======\n");
+
 		for (i = 0; i < SKYPIAX_MAX_INTERFACES; i++) {
 			next_flag_char = i == globals.next_interface ? '*' : ' ';
 
 			if (strlen(globals.SKYPIAX_INTERFACES[i].name)) {
-				if (strlen(globals.SKYPIAX_INTERFACES[i].session_uuid_str)) {
-					stream->write_function(stream,
-										   "%c\t%d\t[%s]\tBUSY, session_uuid_str=|||%s|||\n",
-										   next_flag_char, i, globals.SKYPIAX_INTERFACES[i].name, globals.SKYPIAX_INTERFACES[i].session_uuid_str);
-				} else {
-					stream->write_function(stream, "%c\t%d\t[%s]\tIDLE\n", next_flag_char, i, globals.SKYPIAX_INTERFACES[i].name);
-				}
-			} else if (argc > 1 && !strcasecmp(argv[1], "full")) {
+				stream->write_function(stream,
+					       "%c %d\t[%s]\t%3ld/%ld\t%6ld/%ld\t%s\t%s\t%s\n",
+					       next_flag_char,
+					       i, globals.SKYPIAX_INTERFACES[i].name,
+					       globals.SKYPIAX_INTERFACES[i].ib_failed_calls,
+					       globals.SKYPIAX_INTERFACES[i].ib_calls,
+					       globals.SKYPIAX_INTERFACES[i].ob_failed_calls,
+					       globals.SKYPIAX_INTERFACES[i].ob_calls,
+					       interface_status[globals.SKYPIAX_INTERFACES[i].interface_state],
+					       skype_callflow[globals.SKYPIAX_INTERFACES[i].skype_callflow],
+					       globals.SKYPIAX_INTERFACES[i].session_uuid_str);
+			} else if(argc > 1 && !strcasecmp(argv[1], "full")) {
 				stream->write_function(stream, "%c\t%d\n", next_flag_char, i);
-			}
+			}                                                                      
 
 		}
 		stream->write_function(stream, "\nTotal: %d\n", globals.real_interfaces - 1);
@@ -1847,9 +1950,12 @@
 	if (tech_pvt && tech_pvt->skype_call_id && !strlen(tech_pvt->skype_call_id)) {
 		/* we are not inside an active call */
 
+		tech_pvt->ib_calls++;
+
 		sprintf(msg_to_skype, "GET CALL %s PARTNER_DISPNAME", id);
 		skypiax_signaling_write(tech_pvt, msg_to_skype);
 		switch_sleep(10000);
+		tech_pvt->interface_state = SKYPIAX_STATE_PREANSWER;
 		sprintf(msg_to_skype, "ALTER CALL %s ANSWER", id);
 		skypiax_signaling_write(tech_pvt, msg_to_skype);
 		DEBUGA_SKYPE("We answered a Skype RING on skype_call %s\n", SKYPIAX_P_LOG, id);
@@ -1912,7 +2018,7 @@
 
 	if (!tech_pvt || !tech_pvt->skype_call_id || !strlen(tech_pvt->skype_call_id)) {
 		/* we are not inside an active call */
-		ERRORA("We're NO MORE in a call now %s\n", SKYPIAX_P_LOG, (tech_pvt && tech_pvt->skype_call_id) ? tech_pvt->skype_call_id : "");
+		DEBUGA_SKYPE("We're NO MORE in a call now %s\n", SKYPIAX_P_LOG, (tech_pvt && tech_pvt->skype_call_id) ? tech_pvt->skype_call_id : "");
 		switch_mutex_unlock(globals.mutex);
 
 	} else {
@@ -1966,8 +2072,15 @@
 			DEBUGA_SKYPE
 				("Let's transfer the skype_call %s to %s interface (with skype_user: %s), because we are already in a skypiax call(%s)\n",
 				 SKYPIAX_P_LOG, tech_pvt->skype_call_id, available_skypiax_interface->name, available_skypiax_interface->skype_user, id);
+
+			//FIXME why this? the inbound call will come, eventually, on that other interface
+			//available_skypiax_interface->ib_calls++;
+
 			sprintf(msg_to_skype, "ALTER CALL %s TRANSFER %s", id, available_skypiax_interface->skype_user);
 			skypiax_signaling_write(tech_pvt, msg_to_skype);
+			if(tech_pvt->interface_state == SKYPIAX_STATE_SELECTED) {
+				tech_pvt->interface_state = SKYPIAX_STATE_IDLE; //we marked it SKYPIAX_STATE_SELECTED just in case it has to make an outbound call
+			}
 		} else {
 			/* no skypiax interfaces idle, do nothing */
 			DEBUGA_SKYPE

Modified: freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax.h (14532 => 14533)


--- freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax.h	2009-08-15 14:32:33 UTC (rev 14532)
+++ freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax.h	2009-08-15 15:37:44 UTC (rev 14533)
@@ -91,45 +91,47 @@
 #define SKYPIAX_CONTROL_ANSWER		2
 
 /*********************************/
-#define		SKYPIAX_STATE_DOWN		1
-#define		SKYPIAX_STATE_RING		2
-#define		SKYPIAX_STATE_DIALING	3
-#define		SKYPIAX_STATE_BUSY		4
-#define		SKYPIAX_STATE_UP		5
-#define		SKYPIAX_STATE_RINGING	6
-#define		SKYPIAX_STATE_PRERING	7
-#define		SKYPIAX_STATE_ERROR_DOUBLE_CALL	8
-#define		SKYPIAX_STATE_SELECTED	9
+#define		SKYPIAX_STATE_IDLE					0
+#define		SKYPIAX_STATE_DOWN					1
+#define		SKYPIAX_STATE_RING					2
+#define		SKYPIAX_STATE_DIALING				3
+#define		SKYPIAX_STATE_BUSY					4
+#define		SKYPIAX_STATE_UP					5
+#define		SKYPIAX_STATE_RINGING				6
+#define		SKYPIAX_STATE_PRERING				7
+#define		SKYPIAX_STATE_ERROR_DOUBLE_CALL		8
+#define		SKYPIAX_STATE_SELECTED				9
+#define 	SKYPIAX_STATE_HANGUP_REQUESTED		10
+#define		SKYPIAX_STATE_PREANSWER				11
 /*********************************/
 /* call flow from the device */
-#define 	CALLFLOW_CALL_IDLE  SKYPIAX_STATE_DOWN
-#define 	CALLFLOW_INCOMING_RING  SKYPIAX_STATE_RING
-#define 	CALLFLOW_CALL_DIALING   SKYPIAX_STATE_DIALING
-#define 	CALLFLOW_CALL_LINEBUSY   SKYPIAX_STATE_BUSY
-#define 	CALLFLOW_CALL_ACTIVE   300
-#define 	CALLFLOW_INCOMING_HANGUP   100
-#define 	CALLFLOW_CALL_RELEASED   101
-#define 	CALLFLOW_CALL_NOCARRIER   102
-#define 	CALLFLOW_CALL_INFLUX   103
-#define 	CALLFLOW_CALL_INCOMING   104
-#define 	CALLFLOW_CALL_FAILED   105
-#define 	CALLFLOW_CALL_NOSERVICE   106
-#define 	CALLFLOW_CALL_OUTGOINGRESTRICTED   107
-#define 	CALLFLOW_CALL_SECURITYFAIL   108
-#define 	CALLFLOW_CALL_NOANSWER   109
-#define 	CALLFLOW_STATUS_FINISHED   110
-#define 	CALLFLOW_STATUS_CANCELLED   111
-#define 	CALLFLOW_STATUS_FAILED   112
-#define 	CALLFLOW_STATUS_REFUSED   113
-#define 	CALLFLOW_STATUS_RINGING   114
-#define 	CALLFLOW_STATUS_INPROGRESS   115
-#define 	CALLFLOW_STATUS_UNPLACED   116
-#define 	CALLFLOW_STATUS_ROUTING   117
-#define 	CALLFLOW_STATUS_EARLYMEDIA   118
-#define 	SKYPIAX_STATE_HANGUP_REQUESTED   200
-  //FIXME CALLFLOW_INCOMING_CALLID to be removed
-#define 	CALLFLOW_INCOMING_CALLID   1019
-#define 	CALLFLOW_STATUS_REMOTEHOLD   201
+#define 	CALLFLOW_CALL_IDLE					0
+#define 	CALLFLOW_CALL_DOWN					1
+#define 	CALLFLOW_INCOMING_RING				2
+#define 	CALLFLOW_CALL_DIALING				3
+#define 	CALLFLOW_CALL_LINEBUSY				4
+#define 	CALLFLOW_CALL_ACTIVE				5
+#define 	CALLFLOW_INCOMING_HANGUP			6		
+#define 	CALLFLOW_CALL_RELEASED				7
+#define 	CALLFLOW_CALL_NOCARRIER				8
+#define 	CALLFLOW_CALL_INFLUX				9
+#define 	CALLFLOW_CALL_INCOMING				10
+#define 	CALLFLOW_CALL_FAILED				11
+#define 	CALLFLOW_CALL_NOSERVICE				12
+#define 	CALLFLOW_CALL_OUTGOINGRESTRICTED	13
+#define 	CALLFLOW_CALL_SECURITYFAIL			14
+#define 	CALLFLOW_CALL_NOANSWER				15
+#define 	CALLFLOW_STATUS_FINISHED			16
+#define 	CALLFLOW_STATUS_CANCELLED			17
+#define 	CALLFLOW_STATUS_FAILED				18
+#define 	CALLFLOW_STATUS_REFUSED				19
+#define 	CALLFLOW_STATUS_RINGING				20
+#define 	CALLFLOW_STATUS_INPROGRESS			21
+#define 	CALLFLOW_STATUS_UNPLACED			22
+#define 	CALLFLOW_STATUS_ROUTING				23
+#define 	CALLFLOW_STATUS_EARLYMEDIA			24
+#define 	CALLFLOW_INCOMING_CALLID			25
+#define 	CALLFLOW_STATUS_REMOTEHOLD			26
 
 /*********************************/
 
@@ -241,6 +243,10 @@
 	char transfer_callid_number[50];
 	char skype_transfer_call_id[512];
 	int running;
+  unsigned long ib_calls;
+  unsigned long ob_calls;     
+  unsigned long ib_failed_calls;
+  unsigned long ob_failed_calls;
 };
 
 typedef struct private_object private_t;

Modified: freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c (14532 => 14533)


--- freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c	2009-08-15 14:32:33 UTC (rev 14532)
+++ freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c	2009-08-15 15:37:44 UTC (rev 14533)
@@ -62,7 +62,6 @@
 				   tech_pvt->tcp_cli_port, tech_pvt->tcp_srv_port);
 			return -1;
 		}
-		//usleep(100);
 	}
 
 	DEBUGA_SKYPE("SUCCESS! *which_port=%d, tech_pvt->tcp_cli_port=%d, tech_pvt->tcp_srv_port=%d\n", SKYPIAX_P_LOG, *which_port, tech_pvt->tcp_cli_port,
@@ -231,7 +230,7 @@
 				//SKYPIAX_P_LOG, message, obj, id, prop, value, where ? where : "NULL");
 
 				if (!strcasecmp(prop, "PARTNER_HANDLE")) {
-					if (!strlen(tech_pvt->skype_call_id) || !strlen(tech_pvt->session_uuid_str)) {
+					if (tech_pvt->interface_state != SKYPIAX_STATE_SELECTED && (!strlen(tech_pvt->skype_call_id) || !strlen(tech_pvt->session_uuid_str)) ) {
 						//if (!strlen(tech_pvt->skype_call_id)) {
 						/* we are NOT inside an active call */
 						DEBUGA_SKYPE("Call %s TRY ANSWER\n", SKYPIAX_P_LOG, id);
@@ -256,13 +255,13 @@
 				}
 				if (!strcasecmp(prop, "CONF_ID") && !strcasecmp(value, "0")) {
 					//DEBUGA_SKYPE("the skype_call %s is NOT a conference call\n", SKYPIAX_P_LOG, id);
-					if (tech_pvt->interface_state == SKYPIAX_STATE_DOWN)
-						tech_pvt->interface_state = SKYPIAX_STATE_PRERING;
+					//if (tech_pvt->interface_state == SKYPIAX_STATE_DOWN)
+						//tech_pvt->interface_state = SKYPIAX_STATE_PRERING;
 				}
 				if (!strcasecmp(prop, "CONF_ID") && strcasecmp(value, "0")) {
 					DEBUGA_SKYPE("the skype_call %s is a conference call\n", SKYPIAX_P_LOG, id);
-					if (tech_pvt->interface_state == SKYPIAX_STATE_DOWN)
-						tech_pvt->interface_state = SKYPIAX_STATE_PRERING;
+					//if (tech_pvt->interface_state == SKYPIAX_STATE_DOWN)
+						//tech_pvt->interface_state = SKYPIAX_STATE_PRERING;
 				}
 				if (!strcasecmp(prop, "DTMF")) {
 					DEBUGA_SKYPE("Call %s received a DTMF: %s\n", SKYPIAX_P_LOG, id, value);
@@ -338,7 +337,6 @@
 						DEBUGA_SKYPE("We missed skype_call %s\n", SKYPIAX_P_LOG, id);
 					} else if (!strcasecmp(value, "FINISHED")) {
 						//DEBUGA_SKYPE("skype_call %s now is DOWN\n", SKYPIAX_P_LOG, id);
-						//usleep(150000);//150msec, let's give the TCP sockets time to timeout
 						if (!strcasecmp(tech_pvt->skype_call_id, id)) {
 							//tech_pvt->skype_callflow = CALLFLOW_STATUS_FINISHED;
 							DEBUGA_SKYPE("skype_call %s is MY call, now I'm going DOWN\n", SKYPIAX_P_LOG, id);
@@ -429,7 +427,7 @@
 									DEBUGA_SKYPE("New Inbound Channel!\n\n\n\n", SKYPIAX_P_LOG);
 									new_inbound_channel(tech_pvt);
 								} else {
-									DEBUGA_SKYPE("Outbound Channel Answered!\n", SKYPIAX_P_LOG);
+									DEBUGA_SKYPE("Outbound Channel Answered! session_uuid_str=%s\n", SKYPIAX_P_LOG, tech_pvt->session_uuid_str);
 									outbound_channel_answered(tech_pvt);
 								}
 							} else {