From 223871ea764696135a117d5da223adba465f0a3c Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 3 Mar 2010 20:51:11 +0000 Subject: [PATCH] add optional loops attr to xml dp (brought to you by Moc) git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16886 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- .../mod_dialplan_xml/mod_dialplan_xml.c | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c b/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c index 0607a75775..4878011cc2 100644 --- a/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c +++ b/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c @@ -272,9 +272,11 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t * if (anti_action) { for (xaction = switch_xml_child(xcond, "anti-action"); xaction; xaction = xaction->next) { const char *application = switch_xml_attr_soft(xaction, "application"); + const char *loop = switch_xml_attr(xaction, "loop"); const char *data; const char *inline_ = switch_xml_attr_soft(xaction, "inline"); int xinline = switch_true(inline_); + int loop_count = 1; if (!zstr(xaction->txt)) { data = xaction->txt; @@ -282,9 +284,6 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t * data = (char *) switch_xml_attr_soft(xaction, "data"); } - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: %s ANTI-Action %s(%s) %s\n", switch_channel_get_name(channel), application, data, xinline ? "INLINE" : ""); - if (!*extension) { if ((*extension = switch_caller_extension_new(session, exten_name, caller_profile->destination_number)) == 0) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Memory Error!\n"); @@ -293,22 +292,33 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t * } } - if (xinline) { - exec_app(session, application, data); - } else { - switch_caller_extension_add_application(session, *extension, application, data); + if (loop) { + loop_count = atoi(loop); + } + + for (;loop_count > 0; loop_count--) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, + "Dialplan: %s ANTI-Action %s(%s) %s\n", switch_channel_get_name(channel), application, data, xinline ? "INLINE" : ""); + + if (xinline) { + exec_app(session, application, data); + } else { + switch_caller_extension_add_application(session, *extension, application, data); + } } proceed = 1; } } else { for (xaction = switch_xml_child(xcond, "action"); xaction; xaction = xaction->next) { char *application = (char *) switch_xml_attr_soft(xaction, "application"); + const char *loop = switch_xml_attr(xaction, "loop"); char *data = NULL; char *substituted = NULL; uint32_t len = 0; char *app_data = NULL; const char *inline_ = switch_xml_attr_soft(xaction, "inline"); int xinline = switch_true(inline_); + int loop_count = 1; if (!zstr(xaction->txt)) { data = xaction->txt; @@ -338,16 +348,19 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t * } } - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: %s Action %s(%s) %s\n", switch_channel_get_name(channel), application, app_data, xinline ? "INLINE" : ""); - - - if (xinline) { - exec_app(session, application, app_data); - } else { - switch_caller_extension_add_application(session, *extension, application, app_data); + if (loop) { + loop_count = atoi(loop); } + for (;loop_count > 0; loop_count--) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, + "Dialplan: %s Action %s(%s) %s\n", switch_channel_get_name(channel), application, app_data, xinline ? "INLINE" : ""); + if (xinline) { + exec_app(session, application, app_data); + } else { + switch_caller_extension_add_application(session, *extension, application, app_data); + } + } switch_safe_free(substituted); } }