Revision
17391
Author
mike
Date
2010-04-26 01:58:40 -0500 (Mon, 26 Apr 2010)

Log Message

mod_fifo: allow multiple dtmf to exit fifo, set fifo_caller_exit_key to specify which (MODAPP-420)

Modified Paths

Diff

Modified: freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c (17390 => 17391)


--- freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c	2010-04-26 06:18:15 UTC (rev 17390)
+++ freeswitch/trunk/src/mod/applications/mod_fifo/mod_fifo.c	2010-04-26 06:58:40 UTC (rev 17391)
@@ -75,6 +75,15 @@
 	return 0;
 }
 
+static switch_bool_t match_key(const char *caller_exit_key, char key)
+{
+	while (caller_exit_key && *caller_exit_key) {
+		if (*caller_exit_key++ == key) {
+			return SWITCH_TRUE;
+		}
+	}
+	return SWITCH_FALSE;
+}
 
 static switch_status_t on_dtmf(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen)
 {
@@ -131,7 +140,7 @@
 			switch_channel_t *channel = switch_core_session_get_channel(session);
 			const char *caller_exit_key = switch_channel_get_variable(channel, "fifo_caller_exit_key");
 
-			if (caller_exit_key && dtmf->digit == *caller_exit_key) {
+			if (match_key(caller_exit_key, dtmf->digit)) {
 				char *bp = buf;
 				*bp = dtmf->digit;
 				return SWITCH_STATUS_BREAK;
@@ -230,9 +239,10 @@
 				return SWITCH_STATUS_FALSE;
 			}
 
-			if (caller_exit_key && *buf == *caller_exit_key) {
+			if (match_key(caller_exit_key, *buf)) {
 				cd->abort = 1;
 				return SWITCH_STATUS_FALSE;
+				switch_channel_set_variable(channel, "fifo_caller_exit_key", (char *)buf);
 			}
 			cd->next = switch_epoch_time_now(NULL) + cd->freq;
 			cd->index++;
@@ -1051,7 +1061,8 @@
 				switch_ivr_collect_digits_callback(session, &args, 0, 0);
 			}
 
-			if (caller_exit_key && *buf == *caller_exit_key) {
+			if (match_key(caller_exit_key, *buf)) {
+				switch_channel_set_variable(channel, "fifo_caller_exit_key", (char *)buf);
 				aborted = 1;
 				goto abort;
 			}