SWITCH_DECLARE(void) IVRMenu::bindAction(char *action, const char *arg, const char *bind) { switch_ivr_action_t ivr_action = SWITCH_IVR_ACTION_NOOP; this_check_void(); if (switch_ivr_menu_str2action(action, &ivr_action) == SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "bind %s to %s(%s)\n", bind, action, arg); switch_ivr_menu_bind_action(menu, ivr_action, arg, bind); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "invalid action %s\n", action); } }
SWITCH_DECLARE(switch_status_t) switch_ivr_menu_stack_xml_build(switch_ivr_menu_xml_ctx_t *xml_menu_ctx, switch_ivr_menu_t ** menu_stack, switch_xml_t xml_menus, switch_xml_t xml_menu) { switch_status_t status = SWITCH_STATUS_FALSE; if (xml_menu_ctx != NULL && menu_stack != NULL && xml_menu != NULL) { const char *menu_name = switch_xml_attr_soft(xml_menu, "name"); /* if the attr doesn't exist, return "" */ const char *greet_long = switch_xml_attr(xml_menu, "greet-long"); /* if the attr doesn't exist, return NULL */ const char *greet_short = switch_xml_attr(xml_menu, "greet-short"); /* if the attr doesn't exist, return NULL */ const char *invalid_sound = switch_xml_attr(xml_menu, "invalid-sound"); /* if the attr doesn't exist, return NULL */ const char *exit_sound = switch_xml_attr(xml_menu, "exit-sound"); /* if the attr doesn't exist, return NULL */ const char *timeout = switch_xml_attr_soft(xml_menu, "timeout"); /* if the attr doesn't exist, return "" */ const char *max_failures = switch_xml_attr_soft(xml_menu, "max-failures"); /* if the attr doesn't exist, return "" */ const char *max_timeouts = switch_xml_attr_soft(xml_menu, "max-timeouts"); const char *confirm_macro = switch_xml_attr(xml_menu, "confirm-macro"); const char *confirm_key = switch_xml_attr(xml_menu, "confirm-key"); const char *tts_engine = switch_xml_attr(xml_menu, "tts-engine"); const char *tts_voice = switch_xml_attr(xml_menu, "tts-voice"); const char *confirm_attempts = switch_xml_attr_soft(xml_menu, "confirm-attempts"); const char *digit_len = switch_xml_attr_soft(xml_menu, "digit-len"); const char *inter_timeout = switch_xml_attr_soft(xml_menu, "inter-digit-timeout"); switch_ivr_menu_t *menu = NULL; if (zstr(max_timeouts)) { max_timeouts = max_failures; } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "building menu '%s'\n", menu_name); status = switch_ivr_menu_init(&menu, *menu_stack, menu_name, greet_long, greet_short, invalid_sound, exit_sound, confirm_macro, confirm_key, tts_engine, tts_voice, atoi(confirm_attempts), atoi(inter_timeout), atoi(digit_len), atoi(timeout), strlen(max_failures) ? atoi(max_failures) : 0, strlen(max_timeouts) ? atoi(max_timeouts) : 0, xml_menu_ctx->pool); /* set the menu_stack for the caller */ if (status == SWITCH_STATUS_SUCCESS && *menu_stack == NULL) { *menu_stack = menu; if (xml_menu_ctx->autocreated) { switch_set_flag(menu, SWITCH_IVR_MENU_FLAG_FREEPOOL); } } if (status == SWITCH_STATUS_SUCCESS && menu != NULL) { switch_xml_t xml_kvp; /* build menu entries */ for (xml_kvp = switch_xml_child(xml_menu, "entry"); xml_kvp != NULL && status == SWITCH_STATUS_SUCCESS; xml_kvp = xml_kvp->next) { const char *action = switch_xml_attr(xml_kvp, "action"); const char *digits = switch_xml_attr(xml_kvp, "digits"); const char *param = switch_xml_attr_soft(xml_kvp, "param"); if (is_valid_action(action) && !zstr(digits)) { switch_ivr_menu_xml_map_t *xml_map = xml_menu_ctx->map; int found = 0; /* find and appropriate xml handler */ while (xml_map != NULL && !found) { if (!(found = (strcasecmp(xml_map->name, action) == 0))) { xml_map = xml_map->next; } } if (found && xml_map != NULL) { /* do we need to build a new sub-menu ? */ if (xml_map->action == SWITCH_IVR_ACTION_EXECMENU && switch_ivr_menu_find(*menu_stack, param) == NULL) { if ((xml_menu = switch_xml_find_child(xml_menus, "menu", "name", param)) != NULL) { status = switch_ivr_menu_stack_xml_build(xml_menu_ctx, menu_stack, xml_menus, xml_menu); } } /* finally bind the menu entry */ if (status == SWITCH_STATUS_SUCCESS) { if (xml_map->function != NULL) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "binding menu caller control '%s'/'%s' to '%s'\n", xml_map->name, param, digits); status = switch_ivr_menu_bind_function(menu, xml_map->function, param, digits); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "binding menu action '%s' to '%s'\n", xml_map->name, digits); status = switch_ivr_menu_bind_action(menu, xml_map->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\n"); } return status; }