[Freeswitch-svn] [commit] r3338 - in freeswitch/branches/knhor/trunk/src: . include
Freeswitch SVN
knhor at freeswitch.org
Mon Nov 13 00:14:30 EST 2006
Author: knhor
Date: Mon Nov 13 00:14:29 2006
New Revision: 3338
Modified:
freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
freeswitch/branches/knhor/trunk/src/switch_ivr.c
Log:
fix docs for switch_ivr_menu_init.
add switch_ivr_build_xml_menu_stack function, it expects xml like in the following example;
<menus>
<menu name="main" greet-long="greet-long.wav" greet-short="greet-short.wav" invalid-sound="invalid.wav" timeout ="15000" max-failures="3">
<entry action="exit" digits="*"/>
<entry action="menu-sub" digits="2" param="menu2"/>
<entry action="exec-api" digits="3" param="api arg"/>
<entry action="play-sound" digits="4" param="asound.wav"/>
<entry action="call-transfer" digits="7" param="888"/>
<entry action="menu-sub" digits="8" param="menu8"/>>
</menu>
<menu name="menu8" greet-long="greet-long.wav" greet-short="greet-short.wav" invalid-sound="invalid.wav" timeout ="15000" max-failures="3">
<entry action="menu-back" digits="#"/>
<entry action="play-sound" digits="4" param="asound.wav"/>
<entry action="menu-top" digits="*"/>
</menu>
<menu name="menu2" greet-long="greet-long.wav" greet-short="greet-short.wav" invalid-sound="invalid.wav" timeout ="15000" max-failures="3">
<entry action="menu-back" digits="#"/>
<entry action="play-sound" digits="4" param="asound.wav"/>
<entry action="menu-top" digits="*"/>
</menu>
</menus>
Modified: freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/branches/knhor/trunk/src/include/switch_ivr.h (original)
+++ freeswitch/branches/knhor/trunk/src/include/switch_ivr.h Mon Nov 13 00:14:29 2006
@@ -499,10 +499,12 @@
*\param greeting_sound Optional pointer to a main sound (press 1 for this 2 for that).
*\param short_greeting_sound Optional pointer to a shorter main sound for subsequent loops.
*\param invalid_sound Optional pointer to a sound to play after invalid input.
+ *\param tts_engine Text To Speech engine name
+ *\param tts_voice Text To Speech engine voice name
*\param timeout A number of milliseconds to pause before looping.
*\param max_failures Maximum number of failures to withstand before hangingup This resets everytime you enter the menu.
*\param pool memory pool (NULL to create one)
- *\return SWUTCH_STATUS_SUCCESS if the menu was created
+ *\return SWITCH_STATUS_SUCCESS if the menu was created
*/
SWITCH_DECLARE(switch_status_t) switch_ivr_menu_init(switch_ivr_menu_t **new_menu,
switch_ivr_menu_t *main,
@@ -557,6 +559,18 @@
*/
SWITCH_DECLARE(switch_status_t) switch_ivr_menu_free_stack(switch_ivr_menu_t *stack);
+/*!
+ *\brief build a menu stack from an xml source
+ *\param menu_stack The menu stack object that will be created for you
+ *\param xml_menus The xml Menus source
+ *\param xml_menu The xml Menu source of the menu to be created
+ *\param pool memory pool (NULL to create one)
+ *\return SWITCH_STATUS_SUCCESS if all is well
+ */
+SWITCH_DECLARE(switch_status_t) switch_ivr_build_xml_menu_stack(switch_ivr_menu_t **menu_stack,
+ switch_xml_t xml_menus,
+ switch_xml_t xml_menu,
+ switch_memory_pool_t *pool);
/** @} */
SWITCH_END_EXTERN_C
Modified: freeswitch/branches/knhor/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/switch_ivr.c (original)
+++ freeswitch/branches/knhor/trunk/src/switch_ivr.c Mon Nov 13 00:14:29 2006
@@ -3695,15 +3695,16 @@
if (!strcmp(menu->buf, ap->bind)) {
char *membuf;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR menu %s matched %s\n", menu->name, menu->buf);
match++;
errs = 0;
if (ap->function) {
todo = ap->function(menu, arg, sizeof(arg), obj);
aptr = arg;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR function on menu '%s' matched '%s'\n", menu->name, menu->buf);
} else {
todo = ap->ivr_action;
aptr = ap->arg;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR action on menu '%s' matched '%s' param '%s'\n", menu->name, menu->buf,aptr);
}
switch(todo) {
@@ -3728,6 +3729,7 @@
break;
case SWITCH_IVR_ACTION_EXECAPP: {
const switch_application_interface_t *application_interface;
+
if ((membuf = strdup(aptr))) {
char *app_name = membuf;
char *app_arg = strchr(app_name, ' ');
@@ -3788,6 +3790,95 @@
}
switch_safe_free(menu->buf);
+
+ return status;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_ivr_build_xml_menu_stack(switch_ivr_menu_t **menu_stack,
+ switch_xml_t xml_menus,
+ switch_xml_t xml_menu,
+ switch_memory_pool_t *pool)
+{
+ switch_status_t status = SWITCH_STATUS_FALSE;
+ char *menu_name = (char *)switch_xml_attr_soft(xml_menu,"name"); // if the attr doesn't exist, return ""
+ char *greet_long = (char *)switch_xml_attr(xml_menu,"greet-long"); // if the attr doesn't exist, return NULL
+ char *greet_short = (char *)switch_xml_attr(xml_menu,"greet-short"); // if the attr doesn't exist, return NULL
+ char *invalid_sound = (char *)switch_xml_attr(xml_menu,"invalid-sound"); // if the attr doesn't exist, return NULL
+ char *tts_engine = (char *)switch_xml_attr(xml_menu,"tts-engine"); // if the attr doesn't exist, return NULL
+ char *tts_voice = (char *)switch_xml_attr(xml_menu,"tts-voice"); // if the attr doesn't exist, return NULL
+ char *timeout = (char *)switch_xml_attr_soft(xml_menu,"timeout"); // if the attr doesn't exist, return ""
+ char *max_failures = (char *)switch_xml_attr_soft(xml_menu,"max-failures"); // if the attr doesn't exist, return ""
+ switch_ivr_menu_t *menu = NULL;
+
+ status = switch_ivr_menu_init(&menu,
+ *menu_stack,
+ menu_name,
+ greet_long,
+ greet_short,
+ invalid_sound,
+ tts_engine,
+ tts_voice,
+ atoi(timeout)*1000,
+ atoi(max_failures),
+ pool
+ );
+ if (status == SWITCH_STATUS_SUCCESS) {
+ switch_xml_t xml_kvp;
+ struct ivr_action_map {
+ char *name;
+ switch_ivr_action_t action;
+ } iam [] = {
+ {"exit", SWITCH_IVR_ACTION_DIE},
+ {"menu-sub", SWITCH_IVR_ACTION_EXECMENU},
+ {"exec-api", SWITCH_IVR_ACTION_EXECAPP},
+ {"play-sound", SWITCH_IVR_ACTION_PLAYSOUND},
+ {"say-text", SWITCH_IVR_ACTION_SAYTEXT},
+ {"menu-back", SWITCH_IVR_ACTION_BACK},
+ {"menu-top", SWITCH_IVR_ACTION_TOMAIN},
+ {"call-transfer", SWITCH_IVR_ACTION_TRANSFER},
+ };
+ int iam_qty = sizeof(iam)/sizeof(iam[0]);
+
+ // set the menu stack for the caller
+ if (*menu_stack == NULL) {
+ *menu_stack = menu;
+ }
+
+ // build menu entries
+ for(xml_kvp = switch_xml_child(xml_menu, "entry"); xml_kvp != NULL && status == SWITCH_STATUS_SUCCESS; xml_kvp = xml_kvp->next) {
+ char *action = (char *)switch_xml_attr(xml_kvp, "action");
+ char *digits = (char *)switch_xml_attr(xml_kvp, "digits");
+ char *param = (char *)switch_xml_attr_soft(xml_kvp, "param");
+
+ if (!switch_strlen_zero(action) && !switch_strlen_zero(digits)) {
+ int i,found;
+
+ for(i=0,found=0; i<iam_qty && !found; i++) {
+ found = (strcasecmp(iam[i].name,action) == 0);
+ }
+
+ if (found) {
+ i--;
+ // do we need to build a new sub-menu ?
+ if (iam[i].action == SWITCH_IVR_ACTION_EXECMENU && switch_ivr_find_menu(*menu_stack, param) == NULL) {
+ if ((xml_menu = switch_xml_find_child(xml_menus, "menu", "name", param)) != NULL) {
+ status = switch_ivr_build_xml_menu_stack(menu_stack, xml_menus, xml_menu, pool);
+ }
+ }
+ // finally bind the menu entry
+ if (status == SWITCH_STATUS_SUCCESS) {
+ status = switch_ivr_menu_bind_action(menu, iam[i].action, param, digits);
+ }
+ }
+ } else {
+ status = SWITCH_STATUS_FALSE;
+ }
+ }
+ }
+
+ if (status != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to build xml menu '%s'\n",menu_name);
+ }
return status;
}
More information about the Freeswitch-svn
mailing list