From 46d4b7d93f33caca49a36d7fca7eff0cc34ed1f0 Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Wed, 7 Jul 2010 02:09:13 +0200 Subject: [PATCH] DSM: sendDTMFSequence action --- apps/dsm/DSMCoreModule.cpp | 35 +++++++++++++++++++++++++++++++++++ apps/dsm/DSMCoreModule.h | 1 + doc/dsm/dsm_syntax.txt | 4 ++++ 3 files changed, 40 insertions(+) diff --git a/apps/dsm/DSMCoreModule.cpp b/apps/dsm/DSMCoreModule.cpp index be35bfd6..a5db2a4e 100644 --- a/apps/dsm/DSMCoreModule.cpp +++ b/apps/dsm/DSMCoreModule.cpp @@ -72,6 +72,7 @@ DSMAction* DSMCoreModule::getAction(const string& from_str) { DEF_CMD("enableDTMFDetection", SCEnableDTMFDetection); DEF_CMD("disableDTMFDetection", SCDisableDTMFDetection); DEF_CMD("sendDTMF", SCSendDTMFAction); + DEF_CMD("sendDTMFSequence", SCSendDTMFSequenceAction); DEF_CMD("set", SCSetAction); DEF_CMD("sets", SCSetSAction); @@ -1204,6 +1205,40 @@ EXEC_ACTION_START(SCSendDTMFAction) { sess->sendDtmf(event_i, duration_i); } EXEC_ACTION_END; +CONST_ACTION_2P(SCSendDTMFSequenceAction,',', true); +EXEC_ACTION_START(SCSendDTMFSequenceAction) { + string events = resolveVars(par1, sess, sc_sess, event_params); + string duration = resolveVars(par2, sess, sc_sess, event_params); + + unsigned int duration_i; + if (duration.empty()) { + duration_i = 500; // default + } else { + if (str2i(duration, duration_i)) { + ERROR("event duration '%s' not a valid DTMF duration\n", duration.c_str()); + throw DSMException("core", "cause", "invalid DTMF duration:"+ duration); + } + } + + for (size_t i=0;i'9') + && (events[i] != '#') && (events[i] != '*') + && (events[i] <'A' || events[i] >'F')) { + DBG("skipping non-DTMF event char '%c'\n", events[i]); + continue; + } + int event = events[i] - '0'; + if (events[i] == '*') + event = 10; + else if (events[i] == '#') + event = 11; + else if (events[i] >= 'A' && events[i] <= 'F' ) + event = 12 + (events[i] - 'A'); + DBG("sending event %d duration %u\n", event, duration_i); + sess->sendDtmf(event, duration_i); + } +} EXEC_ACTION_END; + EXEC_ACTION_START(SCRegisterEventQueueAction) { string q_name = resolveVars(arg, sess, sc_sess, event_params); DBG("Registering event queue '%s'\n", q_name.c_str()); diff --git a/apps/dsm/DSMCoreModule.h b/apps/dsm/DSMCoreModule.h index c0e0cf64..bd55f085 100644 --- a/apps/dsm/DSMCoreModule.h +++ b/apps/dsm/DSMCoreModule.h @@ -63,6 +63,7 @@ DEF_ACTION_1P(SCUnmuteAction); DEF_ACTION_1P(SCEnableDTMFDetection); DEF_ACTION_1P(SCDisableDTMFDetection); DEF_ACTION_2P(SCSendDTMFAction); +DEF_ACTION_2P(SCSendDTMFSequenceAction); DEF_ACTION_1P(SCSetPromptsAction); DEF_ACTION_2P(SCAddSeparatorAction); diff --git a/doc/dsm/dsm_syntax.txt b/doc/dsm/dsm_syntax.txt index 0d9e97cd..d21e0d7f 100644 --- a/doc/dsm/dsm_syntax.txt +++ b/doc/dsm/dsm_syntax.txt @@ -96,6 +96,10 @@ sendDTMF(key [, duration_ms]) send a DTMF event (RFC4733 event) duration_ms defaults to 500ms +sendDTMFSequence(sequence [, duration_ms]) + send a sequence of DTMF events (RFC4733 event), e.g. 123#45*1 + duration_ms defaults to 500ms + B2B.connectCallee(remote_party, remote_uri) connect second leg of B2B session (see AmB2BSession)