Revision
16780
Author
sathieu
Date
2010-02-24 06:04:16 -0600 (Wed, 24 Feb 2010)

Log Message

Skinny: Milestone 3: Calls management: handle DTMF

Modified Paths

Diff

Modified: freeswitch/trunk/src/mod/endpoints/mod_skinny/mod_skinny.c (16779 => 16780)


--- freeswitch/trunk/src/mod/endpoints/mod_skinny/mod_skinny.c	2010-02-24 12:04:08 UTC (rev 16779)
+++ freeswitch/trunk/src/mod/endpoints/mod_skinny/mod_skinny.c	2010-02-24 12:04:16 UTC (rev 16780)
@@ -1404,6 +1404,8 @@
 	private_t *tech_pvt = switch_core_session_get_private(session);
 	switch_assert(tech_pvt != NULL);
 
+	switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "DTMF ON CALL %d [%c]\n", tech_pvt->call_id, dtmf->digit);
+
 	return SWITCH_STATUS_SUCCESS;
 }
 
@@ -2925,6 +2927,42 @@
 	return status;
 }
 
+static switch_status_t skinny_handle_keypad_button_message(listener_t *listener, skinny_message_t *request)
+{
+	skinny_check_data_length(request, sizeof(request->data.keypad_button));
+
+	if(listener->outgoing_session) {
+		switch_channel_t *channel = NULL;
+		private_t *tech_pvt = NULL;
+		switch_dtmf_t dtmf = { 0, switch_core_default_dtmf_duration(0)};
+
+		channel = switch_core_session_get_channel(listener->outgoing_session);
+		assert(channel != NULL);
+
+		tech_pvt = switch_core_session_get_private(listener->outgoing_session);
+		assert(tech_pvt != NULL);
+		
+		/* TODO check call_id and line */
+
+		switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(listener->outgoing_session), SWITCH_LOG_DEBUG, "SEND DTMF ON CALL %d [%d]\n", tech_pvt->call_id, request->data.keypad_button.button);
+
+		if (request->data.keypad_button.button == 14) {
+			dtmf.digit = '*';
+			switch_channel_queue_dtmf(channel, &dtmf);
+		} else if (request->data.keypad_button.button == 15) {
+			dtmf.digit = '#';
+			switch_channel_queue_dtmf(channel, &dtmf);
+		} else if (request->data.keypad_button.button >= 0 && request->data.keypad_button.button <= 9) {
+			dtmf.digit = '0' + request->data.keypad_button.button;
+			switch_channel_queue_dtmf(channel, &dtmf);
+		} else {
+			switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(listener->outgoing_session), SWITCH_LOG_WARN, "UNKNOW DTMF RECEIVED ON CALL %d [%d]\n", tech_pvt->call_id, request->data.keypad_button.button);
+		}
+	}
+
+	return SWITCH_STATUS_SUCCESS;
+}
+
 static switch_status_t skinny_handle_on_hook_message(listener_t *listener, skinny_message_t *request)
 {
 	switch_status_t status = SWITCH_STATUS_SUCCESS;
@@ -3007,6 +3045,8 @@
 			return skinny_handle_off_hook_message(listener, request);
 		case OPEN_RECEIVE_CHANNEL_ACK_MESSAGE:
 			return skinny_handle_open_receive_channel_ack_message(listener, request);
+		case KEYPAD_BUTTON_MESSAGE:
+			return skinny_handle_keypad_button_message(listener, request);
 		case ON_HOOK_MESSAGE:
 			return skinny_handle_on_hook_message(listener, request);
 		/* end phase */