[Freeswitch-svn] [commit] r11204 - freeswitch/branches/ctrix/mod_airpe

FreeSWITCH SVN ctrix at freeswitch.org
Wed Jan 14 13:05:23 PST 2009


Author: ctrix
Date: Wed Jan 14 15:05:23 2009
New Revision: 11204

Log:
Reworked all the call logic.
Big cleanups of unused code.
Should be almost working 100%!



Modified:
   freeswitch/branches/ctrix/mod_airpe/airpe_api.c
   freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c
   freeswitch/branches/ctrix/mod_airpe/mod_airpe.c
   freeswitch/branches/ctrix/mod_airpe/mod_airpe.h

Modified: freeswitch/branches/ctrix/mod_airpe/airpe_api.c
==============================================================================
--- freeswitch/branches/ctrix/mod_airpe/airpe_api.c	(original)
+++ freeswitch/branches/ctrix/mod_airpe/airpe_api.c	Wed Jan 14 15:05:23 2009
@@ -30,6 +30,13 @@
 
 #include "mod_airpe.h"
 
+/* 
+    TODO
+	block / authorize users
+	add / remove users from contact list
+*/
+
+
 #define AIRPE_MOODTEXT_SYNTAX "airpe_moodtext <clientname> <text>"
 SWITCH_STANDARD_API(airpe_moodtext_command)
 {

Modified: freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c
==============================================================================
--- freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c	(original)
+++ freeswitch/branches/ctrix/mod_airpe/airpe_if_common.c	Wed Jan 14 15:05:23 2009
@@ -146,10 +146,36 @@
     return SWITCH_STATUS_SUCCESS;
 }
 
+void airpe_clear_call_id(airpe_interface_t *airpe) {
+
+    airpe->active_call_id = 0;
+    switch_safe_free(airpe->active_session_uuid);
+    airpe->active_session_uuid = NULL;
+}
+
+switch_status_t	airpe_set_call_id(airpe_interface_t *airpe, int sk_id, char *fs_uuid) {
+    assert(airpe);
+
+    airpe->active_call_id = sk_id;
+
+    if ( fs_uuid ) {
+	switch_safe_free(airpe->active_session_uuid);
+	airpe->active_session_uuid = strdup(fs_uuid);
+    }
+
+    return SWITCH_STATUS_SUCCESS;
+}
+
+/* ************************************************************************* */
+
 switch_status_t airpe_cmd_write(airpe_interface_t *airpe, char *msg) {
+    switch_status_t status;
+
     if ( airpe->debug )
-	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "msg to airpe client %s: %s\n", airpe->name, msg);
-    return airpe_skype_send_message(airpe->skype_window, msg);
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "msg to airpe client %s: > %s\n", airpe->name, msg);
+
+    status = airpe_skype_send_message(airpe->skype_window, msg);
+    return status;
 }
 
 switch_status_t airpe_originate(airpe_interface_t *airpe, char *dest) {
@@ -161,7 +187,7 @@
     airpe_cmd_write(p, "SET AGC OFF");
     airpe_cmd_write(p, "SET AEC OFF");
     */
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "airpe client %s: Originating to %s\n", airpe->name, dest);
+    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "airpe client %s: Originating to client %s\n", airpe->name, dest);
 
     snprintf(msg, sizeof(msg), "CALL %s", dest);
 
@@ -182,17 +208,14 @@
     return SWITCH_STATUS_FALSE;
 }
 
-
-
 /*****************************************************************************
     SKYPE AUDIO
  *****************************************************************************/
 
-switch_status_t airpe_hangup( private_object_t *pvt ) {
+switch_status_t airpe_call_shutdown( private_object_t *pvt ) {
     airpe_interface_t *airpe;
 
     assert(pvt);
-    assert(pvt->session);
     assert(pvt->airpe);
     
     airpe = pvt->airpe;
@@ -225,10 +248,14 @@
     assert(pvt);
     assert(pvt->session);
     assert(pvt->airpe);
-    
+
+    if ( !switch_test_flag(pvt, TFLAG_IO) )
+	return SWITCH_STATUS_SUCCESS;
+
     airpe = pvt->airpe;
     pool = switch_core_session_get_pool(pvt->session);
 
+
     if ( !airpe->audio_in_active_socket ) {
 	rv = switch_socket_accept(&inbound_socket, airpe->audio_in_socket, pool);
         if ( rv == SWITCH_STATUS_SUCCESS ) {
@@ -262,6 +289,9 @@
     airpe = pvt->airpe;
     pool = switch_core_session_get_pool(pvt->session);
 
+    if ( !switch_test_flag(pvt, TFLAG_IO) )
+	return SWITCH_STATUS_SUCCESS;
+
     if ( !airpe->audio_out_active_socket ) {
 	rv = switch_socket_accept(&inbound_socket, airpe->audio_out_socket, pool);
         if ( rv == SWITCH_STATUS_SUCCESS ) {
@@ -269,7 +299,7 @@
 	    switch_sleep(100000);
 	}
 	else {
-	    return SWITCH_STATUS_FALSE;
+	    return SWITCH_STATUS_SUCCESS;
 	}
     }
 
@@ -281,9 +311,6 @@
     if ( (rv==SWITCH_STATUS_SUCCESS) ) {
 	    pvt->read_frame.datalen = mlen;
     }
-//    if ( mlen == 0 )
-//	return SWITCH_STATUS_SUCCESS;
-
     return rv;
 }
 
@@ -320,7 +347,7 @@
     }
     tech_pvt->airpe = airpe;
 
-    switch_snprintf(chan_name, sizeof(chan_name), MODNAME"/%s", airpe->name);
+    switch_snprintf(chan_name, sizeof(chan_name), MODNAME"/%s/%s", airpe->name, airpe->destination);
     switch_channel_set_name(channel, chan_name);
 
     tech_pvt->caller_profile = switch_caller_profile_new( switch_core_session_get_pool(new_session),
@@ -346,11 +373,12 @@
 
 
     switch_set_flag(tech_pvt, TFLAG_INBOUND);
-    airpe->active_call_id = callid;
+    airpe_set_call_id(airpe, callid, switch_core_session_get_uuid(new_session) );
+
     switch_channel_set_state(channel, CS_INIT);
 
     if ( switch_core_session_thread_launch(new_session) != SWITCH_STATUS_SUCCESS ) {
-	airpe->active_call_id = 0;
+	airpe_clear_call_id(airpe);
     	switch_core_session_destroy(&new_session);
 	return SWITCH_STATUS_FALSE;
     }
@@ -363,8 +391,23 @@
     switch_core_session_t *session = NULL;
     switch_channel_t *channel = NULL;
 
+    if ( airpe->active_session_uuid ) {
+	session = switch_core_session_locate(airpe->active_session_uuid);
+	if ( session )
+	    channel = switch_core_session_get_channel(session);
+    }
+
+/*
+ADEBUG("MANAGING: %s - %d - %d - INB: %d - OUTB %d\n", 
+    (airpe->active_session_uuid) ? airpe->active_session_uuid : "NO SESSION UUID",
+    (session) ? 1 : 0,
+    (channel) ? 1 : 0,
+    (airpe->tech_pvt) ? switch_test_flag(airpe->tech_pvt, TFLAG_INBOUND) : -1,
+    (airpe->tech_pvt) ? switch_test_flag(airpe->tech_pvt, TFLAG_OUTBOUND): -1
+);
+*/
+
     if ( airpe->active_call_id && airpe->active_call_id != callid ) {
-ADEBUG("CASE 1 - different call\n");
 	if      ( !strncmp(status, "UNPLACED", strlen("UNPLACED")) ) {	    
 	    snprintf(buf, sizeof(buf), "SET CALL %d STATUS FINISHED", callid);
 	    airpe_cmd_write(airpe, buf);
@@ -375,102 +418,88 @@
 
     }
     else if ( airpe->active_call_id && airpe->active_call_id == callid ) {
-ADEBUG("CASE 2 - my call\n");
-	if ( airpe->tech_pvt ) {
-	    assert(airpe->tech_pvt);
-	    session = airpe->tech_pvt->session;
-	    assert(session);
-
-	    channel = switch_core_session_get_channel(session);
-    	    assert(channel);
-	}
-
 	if ( !strncmp(status, "ROUTING", strlen("ROUTING")) ) {
 	}
 	else if ( !strncmp(status, "RINGING", strlen("RINGING")) ) {
-	    //if ( switch_test_flag(tech_pvt, TFLAG_OUTBOUND) ) {
-		//switch_channel_set_state(channel, CS_RINGING);
-	    switch_core_session_queue_indication(session, SWITCH_MESSAGE_INDICATE_RINGING);
-	    switch_channel_mark_ring_ready(channel);
-	    //}
-
-	    snprintf(buf, sizeof(buf), "ALTER CALL %d SET_INPUT PORT=\"%d\"", callid, airpe->audio_in_port);
-	    airpe_cmd_write(airpe, buf);
-	    snprintf(buf, sizeof(buf), "ALTER CALL %d SET_OUTPUT PORT=\"%d\"", callid, airpe->audio_out_port);
-	    airpe_cmd_write(airpe, buf);
-
-
-
-	    switch_channel_set_state(channel, CS_ROUTING);
-
-	}
-	else if ( !strncmp(status, "INPROGRESS", strlen("INPROGRESS")) ) {
-	    snprintf(buf, sizeof(buf), "ALTER CALL %d STOP_VIDEO_SEND", callid );
-	    airpe_cmd_write(airpe, buf);
-	    snprintf(buf, sizeof(buf), "ALTER CALL %d STOP_VIDEO_RECEIVE", callid );
-	    airpe_cmd_write(airpe, buf);
-
-	    if ( channel ) {
-	        switch_channel_mark_answered(channel);
+	    if ( session && channel ) {
+		switch_channel_mark_ring_ready(channel);
 	    }
 	    else {
 		if ( airpe_manage_incoming_call(airpe, callid) != SWITCH_STATUS_SUCCESS ) {
 		    snprintf(buf, sizeof(buf), "ALTER CALL %d END HANGUP", callid );
 		    airpe_cmd_write(airpe, buf);
-		    airpe->active_call_id = 0;
+		    airpe_clear_call_id(airpe);
 		}
 	    }
 	}
+	else if ( !strncmp(status, "INPROGRESS", strlen("INPROGRESS")) ) {
+
+	    if ( channel && switch_test_flag(airpe->tech_pvt, TFLAG_OUTBOUND) ) {
+		snprintf(buf, sizeof(buf), "ALTER CALL %d SET_INPUT PORT=\"%d\"", callid, airpe->audio_in_port);
+		airpe_cmd_write(airpe, buf);
+		airpe_cmd_write(airpe, "PING");
+		snprintf(buf, sizeof(buf), "ALTER CALL %d SET_OUTPUT PORT=\"%d\"", callid, airpe->audio_out_port);
+		airpe_cmd_write(airpe, buf);
+		airpe_cmd_write(airpe, "PING");
+	        switch_set_flag(airpe->tech_pvt, TFLAG_IO);
+
+		snprintf(buf, sizeof(buf), "ALTER CALL %d STOP_VIDEO_SEND", callid );
+		airpe_cmd_write(airpe, buf);
+		snprintf(buf, sizeof(buf), "ALTER CALL %d STOP_VIDEO_RECEIVE", callid );
+		airpe_cmd_write(airpe, buf);
+
+	        switch_channel_answer(channel);
+	    }
+
+	}
 	else if ( !strncmp(status, "FINISHED", strlen("FINISHED")) ) {
 	    if ( channel )
 	        switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
-	    airpe->active_call_id = 0;
+	    airpe_clear_call_id(airpe);
 	}
 	else if ( !strncmp(status, "FAILED", strlen("FAILED")) ) {
 	    if ( channel )
 	        switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
-	    airpe->active_call_id = 0;
+	    airpe_clear_call_id(airpe);
 	}
 	else if ( !strncmp(status, "CANCELLED", strlen("CANCELLED")) ) {
 	    if ( channel )
 	        switch_channel_hangup(channel, SWITCH_CAUSE_ORIGINATOR_CANCEL);
-	    airpe->active_call_id = 0;
+	    airpe_clear_call_id(airpe);
 	}
 	else if ( !strncmp(status, "REFUSED", strlen("REFUSED")) ) {
 	    if ( channel )
 	        switch_channel_hangup(channel, SWITCH_CAUSE_CALL_REJECTED);
-	    airpe->active_call_id = 0;
+	    airpe_clear_call_id(airpe);
 	}
 	else if ( !strncmp(status, "MISSED", strlen("MISSED")) ) {
 	    if ( channel )
 	        switch_channel_hangup(channel, SWITCH_CAUSE_NO_ANSWER);
-	    airpe->active_call_id = 0;
+	    airpe_clear_call_id(airpe);
 	}
 	else if ( !strncmp(status, "UNPLACED", strlen("UNPLACED")) ) {
 	}
 	else {
-ADEBUG("Unmanaged status \n");
+	    ADEBUG("Unmanaged status \n");
 	}
     }
     else {
-ADEBUG("CASE 3 - no calls online\n");
-	if      ( !strncmp(status, "UNPLACED", strlen("UNPLACED")) ) {	    
-	    airpe->active_call_id = callid;
-	}
-	else if ( !strncmp(status, "RINGING", strlen("RINGING")) ) {
-	    airpe->active_call_id = callid;
-	    snprintf(buf, sizeof(buf), "ALTER CALL %d ANSWER", callid );
-	    airpe_cmd_write(airpe, buf);
+	if      ( !strncmp(status, "UNPLACED", strlen("UNPLACED")) ) {
+	    airpe_set_call_id(airpe, callid, NULL);
 	}
 	else {
 	    ADEBUG("--- (%d/%d) Unmanaged status %s\n", airpe->active_call_id, callid, status);
 	}
     }
 
+    if ( session ) 
+	switch_core_session_rwunlock(session);
+
     return SWITCH_STATUS_SUCCESS;
 }
 
 switch_status_t airpe_manage_skype_msg( airpe_interface_t *airpe, const char *msg ) {
+    switch_core_session_t *session = NULL;
     char *buf = NULL;
     int argc = 0;
     char *argv[9] = { 0 };
@@ -479,13 +508,16 @@
     assert(msg);
 
     if ( airpe->debug )
-	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "airpe client %s: %s\n", airpe->name, msg);
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "airpe client %s: < %s\n", airpe->name, msg);
+
+    if ( airpe->active_session_uuid )
+	session = switch_core_session_locate(airpe->active_session_uuid);
 
     buf = strdup(msg);
     argc = switch_separate_string(buf, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
 
-    if ( argc == 0 ) {
-	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "airpe client %s: %s - Message without arguments? uh?\n", airpe->name, msg);
+    if ( argc == 0  ) {
+	/* Empty message. Shit happens (TM) */
 	free(buf);
 	return  SWITCH_STATUS_FALSE;
     }
@@ -516,8 +548,14 @@
 	/* The connection status of the client (ex: ONLINE) */
 	airpe->conn_status = skype_conn_status( argv[1] );
     }
-    else if ( !strncmp( buf, "USER", strlen("USER")) ) {
-	/* Updates about the users of our list - ignored */
+    else if ( !strncmp( buf, "USER", strlen("USER")) && argc >= 2 ) {
+	/* Updates about the users of our list or new auth requests */
+	if ( !strncmp(argv[2], "RECEIVEDAUTHREQUEST", strlen("RECEIVEDAUTHREQUEST") ) ) {
+	    /* TODO add option to ignore such requests */
+	    char buf[SKYPE_MSG_LEN] = "";
+	    snprintf(buf, sizeof(buf), "SET USER %s ISAUTHORIZED TRUE", argv[1]);
+	    airpe_cmd_write(airpe, buf);
+	}
     }
     else if ( !strncmp( buf, "GROUP", strlen("GROUP")) ) {
 	/* Updates about the groups of our list - ignored */
@@ -531,7 +569,6 @@
     else if ( !strncmp( buf, "AUTOAWAY", strlen("AUTOAWAY")) ) {
 	/* Autoaway - ignored */
     }
-//TODO: RECEIVEDAUTHREQUEST - Add a config option to authorize or forget about it.
     else if ( !strncmp( buf, "MUTE", strlen("MUTE")) && argc >= 2 ) {
 	if ( !strncmp(argv[1], "ON", 2) ) { 
 	    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "airpe client %s: I don't like to be muted...\n", airpe->name);
@@ -598,11 +635,10 @@
 
 		snprintf(buf, sizeof(buf), "GET CALL %d PARTNER_DISPNAME", callid);
 		airpe_cmd_write(airpe, buf);
-
 		snprintf(buf, sizeof(buf), "GET CALL %d PARTNER_HANDLE", callid);
 		airpe_cmd_write(airpe, buf);
 
-		airpe_cmd_write(airpe, "PING");
+		airpe_set_call_id(airpe, callid, NULL);
 	    }
 	    else {
 		snprintf(buf, sizeof(buf), "ALTER CALL %d END HANGUP", callid );
@@ -614,30 +650,28 @@
 	}
 	else if ( !strncmp(cmd, "DTMF", strlen("DTMF")) ) {
 	    /* This is an incoming DTMF */
-	    switch_core_session_t *session;
-	    switch_channel_t *channel;
-	    switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0) };
-	    const char *signal_ptr;
-	    int tmp;
-
-	    assert(airpe->tech_pvt);
-    	    session = airpe->tech_pvt->session;
-	    assert(session);
-	    channel = switch_core_session_get_channel(session);
-	    assert(channel);
-
-	    signal_ptr = argv[3];
+	    if ( session ) {
+	        switch_channel_t *channel;
+		switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0) };
+	        const char *signal_ptr;
+		int tmp;
+
+    	        channel = switch_core_session_get_channel(session);
+		assert(channel);
+
+	        signal_ptr = argv[3];
+
+		if (*signal_ptr && (*signal_ptr == '*' || *signal_ptr == '#' || *signal_ptr == 'A' || *signal_ptr == 'B' || *signal_ptr == 'C' || *signal_ptr == 'D')) {
+		    dtmf.digit = *signal_ptr;
+	        } else {
+	    	    tmp = atoi(signal_ptr);
+	    	    dtmf.digit = switch_rfc2833_to_char(tmp);
+		}
 
-	    if (*signal_ptr && (*signal_ptr == '*' || *signal_ptr == '#' || *signal_ptr == 'A' || *signal_ptr == 'B' || *signal_ptr == 'C' || *signal_ptr == 'D')) {
-		dtmf.digit = *signal_ptr;
-	    } else {
-		tmp = atoi(signal_ptr);
-		dtmf.digit = switch_rfc2833_to_char(tmp);
+		switch_mutex_lock(airpe->tech_pvt->flag_mutex);
+	        switch_channel_queue_dtmf(channel, &dtmf);
+		switch_mutex_unlock(airpe->tech_pvt->flag_mutex);
 	    }
-
-	    switch_mutex_lock(airpe->tech_pvt->flag_mutex);
-	    switch_channel_queue_dtmf(channel, &dtmf);
-	    switch_mutex_unlock(airpe->tech_pvt->flag_mutex);
 	}
 	else if ( !strncmp(cmd, "FAILUREREASON", strlen("FAILUREREASON")) && argc >=2 ) {
 	    airpe->last_fail_reason = atoi(argv[1]);
@@ -706,6 +740,9 @@
 
     switch_safe_free(buf);
 
+    if ( session ) 
+	switch_core_session_rwunlock(session);
+
     return SWITCH_STATUS_SUCCESS;
 }
 

Modified: freeswitch/branches/ctrix/mod_airpe/mod_airpe.c
==============================================================================
--- freeswitch/branches/ctrix/mod_airpe/mod_airpe.c	(original)
+++ freeswitch/branches/ctrix/mod_airpe/mod_airpe.c	Wed Jan 14 15:05:23 2009
@@ -196,7 +196,6 @@
     airpe_audio_sockets_create(airpe);
 
     switch_threadattr_create(&attr_skype, airpe_module_pool);
-    //switch_threadattr_detach_set(attr_skype, 1);
     switch_threadattr_stacksize_set(attr_skype, SWITCH_THREAD_STACKSIZE);
 
     switch_thread_create(&airpe->airpe_thread_skype, 
@@ -230,6 +229,7 @@
     airpe_set_mood_text(airpe, NULL);
     airpe_set_partner_displayname(airpe, NULL);
     airpe_set_partner_handle(airpe, NULL);
+    airpe_set_call_id(airpe, 0, NULL);
 
     return SWITCH_STATUS_SUCCESS;
 }
@@ -263,21 +263,12 @@
 	// TODO if fail switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
     }
 
-    if ( switch_test_flag(tech_pvt, TFLAG_INBOUND) ) {
-	char buf[SKYPE_MSG_LEN];
-	snprintf(buf, sizeof(buf), "ALTER CALL %d SET_INPUT PORT=\"%d\"", tech_pvt->airpe->active_call_id, tech_pvt->airpe->audio_in_port);
-	airpe_cmd_write(tech_pvt->airpe, buf);
-	snprintf(buf, sizeof(buf), "ALTER CALL %d SET_OUTPUT PORT=\"%d\"", tech_pvt->airpe->active_call_id, tech_pvt->airpe->audio_out_port);
-	airpe_cmd_write(tech_pvt->airpe, buf);
-
-        switch_channel_set_state(channel, CS_ROUTING);
-    }
+    switch_channel_set_state(channel, CS_ROUTING);
 
     return SWITCH_STATUS_SUCCESS;
 }
 
 static switch_status_t channel_on_routing(switch_core_session_t * session) {
-    char buf[SKYPE_MSG_LEN];
     switch_channel_t *channel = NULL;
     private_object_t *tech_pvt = NULL;
 
@@ -287,11 +278,6 @@
     tech_pvt = switch_core_session_get_private(session);
     assert(tech_pvt);
 
-    if ( switch_test_flag(tech_pvt, TFLAG_INBOUND) ) {
-        snprintf(buf, sizeof(buf), "ALTER CALL %d ANSWER", tech_pvt->airpe->active_call_id);
-        airpe_cmd_write(tech_pvt->airpe, buf);
-    }
-
     return SWITCH_STATUS_SUCCESS;
 }
 
@@ -313,7 +299,6 @@
     switch_channel_t *channel = NULL;
     private_object_t *tech_pvt = NULL;
     airpe_interface_t *airpe = NULL;
-    char msg[SKYPE_MSG_LEN];
 
     channel = switch_core_session_get_channel(session);
     assert(channel);
@@ -325,13 +310,11 @@
     assert(airpe);
 
     if ( airpe->active_call_id ) {
-	snprintf(msg, sizeof(msg), "ALTER CALL %d HANGUP", airpe->active_call_id);
-	airpe_cmd_write(airpe, msg);
-//	airpe->active_call_id = 0;
-//	airpe->tech_pvt = NULL;
+	char buf[SKYPE_MSG_LEN];
+	snprintf(buf, sizeof(buf), "ALTER CALL %d HANGUP", airpe->active_call_id);
+	airpe_cmd_write(airpe, buf);
     }
-
-    airpe_hangup( tech_pvt );
+    airpe_call_shutdown( tech_pvt );
 
     if (tech_pvt->read_codec.implementation) {
 	switch_core_codec_destroy(&tech_pvt->read_codec);
@@ -351,6 +334,7 @@
 /*****************************************************************************
     CHANNEL IO INTERFACE / ROUTINES
  *****************************************************************************/
+
 static switch_call_cause_t channel_outgoing_channel(
 		    switch_core_session_t 	*session,
                     switch_event_t 		*var_event,
@@ -422,9 +406,9 @@
 	    switch_core_session_destroy(new_session);
     	    return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
 	}
-
-	switch_channel_set_flag(channel, CF_OUTBOUND);	
-	switch_set_flag_locked(tech_pvt, TFLAG_OUTBOUND);
+	airpe_set_call_id(tech_pvt->airpe, 0, switch_core_session_get_uuid(*new_session) );
+	switch_channel_set_flag(channel, CF_OUTBOUND);
+	switch_set_flag(tech_pvt, TFLAG_OUTBOUND);
 	switch_channel_set_state(channel, CS_INIT);
 	return SWITCH_CAUSE_SUCCESS;
     }
@@ -453,7 +437,10 @@
     *frame = NULL;
 
     if ( airpe_audio_read(tech_pvt) != SWITCH_STATUS_SUCCESS) {
-	ADEBUG("airpe_audio_read ERROR\n");
+/*
+	if ( tech_pvt->airpe->debug )
+	    ADEBUG("airpe_audio_read ERROR\n");
+*/
 	return SWITCH_STATUS_FALSE;
     }
 
@@ -492,12 +479,19 @@
     assert(tech_pvt);
 
     if ( !tech_pvt->airpe ) {
+	ADEBUG("airpe_audio_write ERROR: no client\n");
 	return SWITCH_STATUS_FALSE;
     }
 
     airpe = tech_pvt->airpe;
 
     rv = airpe_audio_write(tech_pvt, frame);
+
+    if ( rv != SWITCH_STATUS_SUCCESS ) {
+	ADEBUG("airpe_audio_write ERROR\n");
+	return SWITCH_STATUS_FALSE;
+    }
+
     return rv;
 }
 
@@ -546,6 +540,7 @@
 {
     switch_channel_t *channel;
     private_object_t *tech_pvt;
+    airpe_interface_t *airpe;
 
     channel = switch_core_session_get_channel(session);
     assert(channel);
@@ -553,30 +548,57 @@
     tech_pvt = (private_object_t *) switch_core_session_get_private(session);
     assert(tech_pvt);
 
+    airpe = tech_pvt->airpe;
+    assert(airpe);
+
     switch (msg->message_id) {
 	case SWITCH_MESSAGE_INDICATE_ANSWER:
-	    ADEBUG("received message indicate answer...\n");
 /*
-    	    //switch_answer_channel(session);
-	    char buf[SKYPE_MSG_LEN];
-	    snprintf(buf, sizeof(buf), "ALTER CALL %d ANSWER", tech_pvt->airpe->active_call_id );
-	    airpe_cmd_write(tech_pvt->airpe, buf);
+	    if ( airpe->debug ) 
+		ADEBUG("received message indicate answer...\n");
 */
+	    if ( switch_test_flag(tech_pvt, TFLAG_INBOUND) ) {
+	        char buf[SKYPE_MSG_LEN];
+	        snprintf(buf, sizeof(buf), "ALTER CALL %d ANSWER\n", tech_pvt->airpe->active_call_id );
+		airpe_cmd_write(tech_pvt->airpe, buf);
+		snprintf(buf, sizeof(buf), "ALTER CALL %d SET_INPUT PORT=\"%d\"", tech_pvt->airpe->active_call_id, tech_pvt->airpe->audio_in_port);
+		airpe_cmd_write(tech_pvt->airpe, buf);
+		snprintf(buf, sizeof(buf), "ALTER CALL %d SET_OUTPUT PORT=\"%d\"", tech_pvt->airpe->active_call_id, tech_pvt->airpe->audio_out_port);
+		airpe_cmd_write(tech_pvt->airpe, buf);
+	        switch_set_flag(tech_pvt, TFLAG_IO);
+	    }
+	    break;
+/*
+	case SWITCH_MESSAGE_INDICATE_PROGRESS:
+	    if ( airpe->debug ) 
+		ADEBUG("received message indicate progress...\n");
+	    break;
+	case SWITCH_MESSAGE_INDICATE_BRIDGE:
+	    if ( airpe->debug ) 
+		ADEBUG("received message indicate bridge...\n");
 	    break;
 	case SWITCH_MESSAGE_INDICATE_UNBRIDGE:
-	    ADEBUG("received message indicate unbridge...\n");
+	    if ( airpe->debug ) 
+		ADEBUG("received message indicate unbridge...\n");
 	    break;
 	case SWITCH_MESSAGE_INDICATE_TRANSCODING_NECESSARY:
-	    ADEBUG("received message indicate transcode necessary...\n");
+	    if ( airpe->debug ) 
+		ADEBUG("received message indicate transcode necessary...\n");
 	    break;
 	case SWITCH_MESSAGE_INDICATE_AUDIO_SYNC:
-	    ADEBUG("received message indicate audio sync...\n");
+	    if ( airpe->debug ) 
+		ADEBUG("received message indicate audio sync...\n");
 	    break;
 	case SWITCH_MESSAGE_INDICATE_TRANSFER:
-	    ADEBUG("received message indicate transfer...\n");
+	    if ( airpe->debug ) 
+		ADEBUG("received message indicate transfer...\n");
 	    break;
+*/
 	default:
-	    ADEBUG("Unmanaged received message... %d\n", msg->message_id);
+/*
+	    if ( airpe->debug ) 
+		ADEBUG("Unmanaged received message... %d\n", msg->message_id);
+*/
 	    break;
     }
 
@@ -596,7 +618,6 @@
     assert(tech_pvt);
 
     body = switch_event_get_body(event);
-
     if (!body) {
 	body = "";
     }

Modified: freeswitch/branches/ctrix/mod_airpe/mod_airpe.h
==============================================================================
--- freeswitch/branches/ctrix/mod_airpe/mod_airpe.h	(original)
+++ freeswitch/branches/ctrix/mod_airpe/mod_airpe.h	Wed Jan 14 15:05:23 2009
@@ -112,15 +112,15 @@
 typedef enum {
   TFLAG_INBOUND 	= (1 << 1),
   TFLAG_OUTBOUND	= (1 << 2),
+  TFLAG_IO 		= (1 << 3),
 /*
-  TFLAG_IO 		= (1 << 0),
-  TFLAG_DTMF 		= (1 << 3),
   TFLAG_VOICE 		= (1 << 4),
-  TFLAG_HANGUP 		= (1 << 5),
-  TFLAG_LINEAR 		= (1 << 6),
-  TFLAG_CODEC 		= (1 << 7),
-  TFLAG_BREAK 		= (1 << 8),
-  TFLAG_ANSWER 		= (1 << 9)
+  TFLAG_DTMF 		= (1 << 5),
+  TFLAG_HANGUP 		= (1 << 6),
+  TFLAG_LINEAR 		= (1 << 7),
+  TFLAG_CODEC 		= (1 << 8),
+  TFLAG_BREAK 		= (1 << 9),
+  TFLAG_ANSWER 		= (1 <<10)
 */
 } TFLAGS;
 
@@ -157,6 +157,7 @@
     char			*skype_version;
     char			*mood_text;
     int 			active_call_id;
+    char 			*active_session_uuid;
     int				last_fail_reason;
     int				running;
     private_object_t		*tech_pvt;
@@ -202,8 +203,9 @@
 switch_status_t	airpe_set_mood_text(airpe_interface_t *airpe, char *string);
 switch_status_t	airpe_set_partner_displayname(airpe_interface_t *airpe, char *string);
 switch_status_t	airpe_set_partner_handle(airpe_interface_t *airpe, char *string);
+switch_status_t	airpe_set_call_id(airpe_interface_t *airpe, int sk_id, char *fs_uuid);
 
-switch_status_t airpe_hangup( private_object_t *pvt );
+switch_status_t airpe_call_shutdown( private_object_t *pvt );
 switch_status_t airpe_audio_read( private_object_t *pvt );
 switch_status_t airpe_audio_write( private_object_t *pvt, switch_frame_t *frame );
 



More information about the Freeswitch-svn mailing list