int fs_switch_ivr_collect_digits_count(switch_core_session_t *session, char *buf, unsigned int buflen, unsigned int maxdigits, const char *terminators, char *terminator, unsigned int timeout) { switch_status_t status; status = switch_ivr_collect_digits_count(session, buf, buflen, maxdigits, terminators, terminator, timeout); return status == SWITCH_STATUS_SUCCESS ? 1 : 0; }
SWITCH_DECLARE(char *) CoreSession::getDigits(int maxdigits, char *terminators, int timeout, int interdigit) { this_check((char *)""); sanity_check((char *)""); begin_allow_threads(); char terminator; memset(dtmf_buf, 0, sizeof(dtmf_buf)); switch_ivr_collect_digits_count(session, dtmf_buf, sizeof(dtmf_buf), maxdigits, terminators, &terminator, (uint32_t) timeout, (uint32_t)interdigit, 0); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "getDigits dtmf_buf: %s\n", dtmf_buf); end_allow_threads(); return dtmf_buf; }
static switch_status_t play_and_collect(switch_core_session_t *session, switch_ivr_menu_t *menu, char *sound, switch_size_t need) { char terminator; uint32_t len; char *ptr; switch_status_t status = SWITCH_STATUS_FALSE; switch_input_args_t args = { 0 }; switch_channel_t *channel; char *sound_expanded = sound; switch_size_t menu_buf_len = 0; const char *terminator_str = "#"; if (!session || !menu || zstr(sound)) { return status; } if ((channel = switch_core_session_get_channel(session))) { const char *tmp; sound_expanded = switch_channel_expand_variables(channel, sound); if ((tmp = switch_channel_get_variable(channel, "ivr_menu_terminator")) && !zstr(tmp)) { terminator_str = tmp; } } memset(menu->buf, 0, menu->inlen + 1); menu->ptr = menu->buf; if (!need) { len = 1; ptr = NULL; } else { len = (uint32_t) menu->inlen + 1; ptr = menu->ptr; } args.buf = ptr; args.buflen = len; status = switch_ivr_play_file(session, NULL, sound_expanded, &args); if (sound_expanded != sound) { switch_safe_free(sound_expanded); } if (!need) { return status; } menu_buf_len = strlen(menu->buf); menu->ptr += menu_buf_len; if (menu_buf_len < need) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "waiting for %u/%u digits t/o %d\n", (uint32_t) (menu->inlen - strlen(menu->buf)), (uint32_t) need, menu->inter_timeout); status = switch_ivr_collect_digits_count(session, menu->ptr, menu->inlen - strlen(menu->buf), need, terminator_str, &terminator, menu_buf_len ? menu->inter_timeout : menu->timeout, menu->inter_timeout, menu->timeout); } if (menu->confirm_macro && status == SWITCH_STATUS_SUCCESS && *menu->buf != '\0') { switch_input_args_t confirm_args = { 0 }, *ap = NULL; char buf[10] = ""; char terminator_key; int att = menu->confirm_attempts; while (att) { confirm_args.buf = buf; confirm_args.buflen = sizeof(buf); memset(buf, 0, confirm_args.buflen); if (menu->confirm_key) { ap = &confirm_args; } switch_ivr_phrase_macro(session, menu->confirm_macro, menu->buf, NULL, ap); if (menu->confirm_key && *buf == '\0') { switch_ivr_collect_digits_count(session, buf, sizeof(buf), 1, terminator_str, &terminator_key, menu->timeout, 0, 0); } if (menu->confirm_key && *buf != '\0') { if (*menu->confirm_key == *buf) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "approving digits '%s' via confirm key %s\n", menu->buf, menu->confirm_key); break; } else { att = 0; break; } } att--; } if (!att) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "rejecting digits '%s' via confirm key %s\n", menu->buf, menu->confirm_key); *menu->buf = '\0'; } } switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "digits '%s'\n", menu->buf); return status; }