add an event to phrases to be used as possible variables in parsing

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16885 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2010-03-03 20:49:38 +00:00
parent d2c6900240
commit 19e7c013d8
2 changed files with 34 additions and 5 deletions

View File

@ -790,8 +790,9 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_menu_stack_xml_add_custom(switch_ivr_
*/
SWITCH_DECLARE(switch_status_t) switch_ivr_menu_stack_xml_init(switch_ivr_menu_xml_ctx_t ** xml_menu_ctx, switch_memory_pool_t *pool);
SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro(switch_core_session_t *session, const char *macro_name, const char *data, const char *lang,
SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro_event(switch_core_session_t *session, const char *macro_name, const char *data, switch_event_t *event, const char *lang,
switch_input_args_t *args);
#define switch_ivr_phrase_macro(session, macro_name, data, lang, args) switch_ivr_phrase_macro_event(session, macro_name, data, NULL, lang, args)
SWITCH_DECLARE(void) switch_ivr_delay_echo(switch_core_session_t *session, uint32_t delay_ms);
SWITCH_DECLARE(switch_status_t) switch_ivr_find_bridged_uuid(const char *uuid, char *b_uuid, switch_size_t blen);
SWITCH_DECLARE(void) switch_ivr_intercept_session(switch_core_session_t *session, const char *uuid, switch_bool_t bleg);

View File

@ -90,7 +90,7 @@ SWITCH_DECLARE(switch_say_type_t) switch_ivr_get_say_type_by_name(const char *na
return (switch_say_type_t) x;
}
SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro(switch_core_session_t *session, const char *macro_name, const char *data, const char *lang,
SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro_event(switch_core_session_t *session, const char *macro_name, const char *data, switch_event_t *event, const char *lang,
switch_input_args_t *args)
{
switch_event_t *hint_data;
@ -129,6 +129,9 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro(switch_core_session_t *s
switch_event_add_header_string(hint_data, SWITCH_STACK_BOTTOM, "lang", chan_lang);
if (data) {
switch_event_add_header_string(hint_data, SWITCH_STACK_BOTTOM, "data", data);
if (event) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "data", data);
}
} else {
data = "";
}
@ -221,8 +224,27 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro(switch_core_session_t *s
}
while (input && !done) {
char *field = (char *) switch_xml_attr(input, "field");
char *pattern = (char *) switch_xml_attr(input, "pattern");
const char *do_break = switch_xml_attr_soft(input, "break_on_match");
char *field_expanded = NULL;
char *field_expanded_alloc = NULL;
if (!field) {
field = (char *) data;
}
if (event) {
field_expanded_alloc = switch_event_expand_headers(event, field);
} else {
field_expanded_alloc = switch_channel_expand_variables(channel, field);
}
if (field_expanded_alloc == field) {
field_expanded_alloc = NULL;
field_expanded = field;
} else {
field_expanded = field_expanded_alloc;
}
if (pattern) {
switch_regex_t *re = NULL;
@ -235,7 +257,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro(switch_core_session_t *s
status = SWITCH_STATUS_SUCCESS;
if ((proceed = switch_regex_perform(data, pattern, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
if ((proceed = switch_regex_perform(field_expanded, pattern, &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) {
match = switch_xml_child(input, "match");
} else {
match = switch_xml_child(input, "nomatch");
@ -256,13 +278,17 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro(switch_core_session_t *s
goto done;
}
memset(substituted, 0, len);
switch_perform_substitution(re, proceed, adata, data, substituted, len, ovector);
switch_perform_substitution(re, proceed, adata, field_expanded, substituted, len, ovector);
odata = substituted;
} else {
odata = adata;
}
expanded = switch_channel_expand_variables(channel, odata);
if (event) {
expanded = switch_event_expand_headers(event, odata);
} else {
expanded = switch_channel_expand_variables(channel, odata);
}
if (expanded == odata) {
expanded = NULL;
@ -344,6 +370,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_phrase_macro(switch_core_session_t *s
}
switch_safe_free(field_expanded_alloc);
if (status != SWITCH_STATUS_SUCCESS) {
done = 1;
break;