diff --git a/src/include/switch_xml.h b/src/include/switch_xml.h index 9a3b72d6fa..220e65df02 100644 --- a/src/include/switch_xml.h +++ b/src/include/switch_xml.h @@ -413,6 +413,8 @@ SWITCH_DECLARE(switch_status_t) switch_xml_unbind_search_function_ptr(_In_ switc ///\return the section mask SWITCH_DECLARE(switch_xml_section_t) switch_xml_parse_section_string(_In_opt_z_ const char *str); +SWITCH_DECLARE(int) switch_xml_std_datetime_check(switch_xml_t xcond); + SWITCH_END_EXTERN_C ///\} #endif // _SWITCH_XML_H 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 4878011cc2..478b129f5a 100644 --- a/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c +++ b/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c @@ -101,19 +101,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t * switch_bool_t anti_action = SWITCH_TRUE; break_t do_break_i = BREAK_ON_FALSE; - const char *xyear = switch_xml_attr(xcond, "year"); - const char *xyday = switch_xml_attr(xcond, "yday"); - const char *xmon = switch_xml_attr(xcond, "mon"); - const char *xmday = switch_xml_attr(xcond, "mday"); - const char *xweek = switch_xml_attr(xcond, "week"); - const char *xmweek = switch_xml_attr(xcond, "mweek"); - const char *xwday = switch_xml_attr(xcond, "wday"); - const char *xhour = switch_xml_attr(xcond, "hour"); - const char *xminute = switch_xml_attr(xcond, "minute"); - const char *xminday = switch_xml_attr(xcond, "minute-of-day"); - switch_time_t ts = switch_micro_time_now(); - int time_match = -1; - switch_time_exp_t tm; + int time_match = switch_xml_std_datetime_check(xcond); switch_safe_free(field_expanded); switch_safe_free(expression_expanded); @@ -124,81 +112,6 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t * goto done; } - switch_time_exp_lt(&tm, ts); - - if (time_match && xyear) { - int test = tm.tm_year + 1900; - time_match = switch_number_cmp(xyear, test); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: year[%d] =~ %s (%s)\n", test, xyear, time_match ? "PASS" : "FAIL"); - } - - if (time_match && xyday) { - int test = tm.tm_yday + 1; - time_match = switch_number_cmp(xyday, test); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: day of year[%d] =~ %s (%s)\n", test, xyday, time_match ? "PASS" : "FAIL"); - } - - if (time_match && xmon) { - int test = tm.tm_mon + 1; - time_match = switch_number_cmp(xmon, test); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: month[%d] =~ %s (%s)\n", test, xmon, time_match ? "PASS" : "FAIL"); - } - - if (time_match && xmday) { - int test = tm.tm_mday; - time_match = switch_number_cmp(xmday, test); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: day of month[%d] =~ %s (%s)\n", test, xmday, time_match ? "PASS" : "FAIL"); - } - - if (time_match && xweek) { - int test = (int) (tm.tm_yday / 7 + 1); - time_match = switch_number_cmp(xweek, test); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: week of year[%d] =~ %s (%s)\n", test, xweek, time_match ? "PASS" : "FAIL"); - } - - if (time_match && xmweek) { - /* calculate the day of the week of the first of the month (0-6) */ - int firstdow = (int) (7 - (tm.tm_mday - (tm.tm_wday + 1)) % 7) % 7; - /* calculate the week of the month (1-6) */ - int test = (int) ceil((tm.tm_mday + firstdow) / 7.0); - time_match = switch_number_cmp(xmweek, test); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: week of month[%d] =~ %s (%s)\n", test, xmweek, time_match ? "PASS" : "FAIL"); - } - - if (time_match && xwday) { - int test = tm.tm_wday + 1; - time_match = switch_number_cmp(xwday, test); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: day of week[%d] =~ %s (%s)\n", test, xwday, time_match ? "PASS" : "FAIL"); - } - - if (time_match && xhour) { - int test = tm.tm_hour; - time_match = switch_number_cmp(xhour, test); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: hour[%d] =~ %s (%s)\n", test, xhour, time_match ? "PASS" : "FAIL"); - } - - if (time_match && xminute) { - int test = tm.tm_min; - time_match = switch_number_cmp(xminute, test); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: minute[%d] =~ %s (%s)\n", test, xminute, time_match ? "PASS" : "FAIL"); - } - - if (time_match && xminday) { - int test = (tm.tm_hour * 60) + (tm.tm_min + 1); - time_match = switch_number_cmp(xminday, test); - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, - "Dialplan: minute of day[%d] =~ %s (%s)\n", test, xminday, time_match ? "PASS" : "FAIL"); - } - field = (char *) switch_xml_attr(xcond, "field"); if ((xexpression = switch_xml_child(xcond, "expression"))) { diff --git a/src/switch_xml.c b/src/switch_xml.c index 3c8bf76833..efda5dbe12 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -2601,6 +2601,107 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_cut(switch_xml_t xml) return xml; } +SWITCH_DECLARE(int) switch_xml_std_datetime_check(switch_xml_t xcond) { + + const char *xyear = switch_xml_attr(xcond, "year"); + const char *xyday = switch_xml_attr(xcond, "yday"); + const char *xmon = switch_xml_attr(xcond, "mon"); + const char *xmday = switch_xml_attr(xcond, "mday"); + const char *xweek = switch_xml_attr(xcond, "week"); + const char *xmweek = switch_xml_attr(xcond, "mweek"); + const char *xwday = switch_xml_attr(xcond, "wday"); + const char *xhour = switch_xml_attr(xcond, "hour"); + const char *xminute = switch_xml_attr(xcond, "minute"); + const char *xminday = switch_xml_attr(xcond, "minute-of-day"); + + switch_time_t ts = switch_micro_time_now(); + int time_match = -1; + switch_time_exp_t tm; + + switch_time_exp_lt(&tm, ts); + + if (time_match && xyear) { + int test = tm.tm_year + 1900; + time_match = switch_number_cmp(xyear, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime Check: year[%d] =~ %s (%s)\n", test, xyear, time_match ? "PASS" : "FAIL"); + } + + if (time_match && xyday) { + int test = tm.tm_yday + 1; + time_match = switch_number_cmp(xyday, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime Check: day of year[%d] =~ %s (%s)\n", test, xyday, time_match ? "PASS" : "FAIL"); + } + + if (time_match && xmon) { + int test = tm.tm_mon + 1; + time_match = switch_number_cmp(xmon, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime Check: month[%d] =~ %s (%s)\n", test, xmon, time_match ? "PASS" : "FAIL"); + } + + if (time_match && xmday) { + int test = tm.tm_mday; + time_match = switch_number_cmp(xmday, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime Check: day of month[%d] =~ %s (%s)\n", test, xmday, time_match ? "PASS" : "FAIL"); + } + + if (time_match && xweek) { + int test = (int) (tm.tm_yday / 7 + 1); + time_match = switch_number_cmp(xweek, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime Check: week of year[%d] =~ %s (%s)\n", test, xweek, time_match ? "PASS" : "FAIL"); + } + if (time_match && xweek) { + int test = (int) (tm.tm_yday / 7 + 1); + time_match = switch_number_cmp(xweek, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime Check: week of year[%d] =~ %s (%s)\n", test, xweek, time_match ? "PASS" : "FAIL"); + } + + if (time_match && xmweek) { + /* calculate the day of the week of the first of the month (0-6) */ + int firstdow = (int) (7 - (tm.tm_mday - (tm.tm_wday + 1)) % 7) % 7; + /* calculate the week of the month (1-6)*/ + int test = (int) ceil((tm.tm_mday + firstdow) / 7.0); + time_match = switch_number_cmp(xmweek, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime: week of month[%d] =~ %s (%s)\n", test, xmweek, time_match ? "PASS" : "FAIL"); + } + + if (time_match && xwday) { + int test = tm.tm_wday + 1; + time_match = switch_number_cmp(xwday, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime Check: day of week[%d] =~ %s (%s)\n", test, xwday, time_match ? "PASS" : "FAIL"); + } + if (time_match && xhour) { + int test = tm.tm_hour; + time_match = switch_number_cmp(xhour, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime Check: hour[%d] =~ %s (%s)\n", test, xhour, time_match ? "PASS" : "FAIL"); + } + + if (time_match && xminute) { + int test = tm.tm_min; + time_match = switch_number_cmp(xminute, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime Check: minute[%d] =~ %s (%s)\n", test, xminute, time_match ? "PASS" : "FAIL"); + } + + if (time_match && xminday) { + int test = (tm.tm_hour * 60) + (tm.tm_min + 1); + time_match = switch_number_cmp(xminday, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime Check: minute of day[%d] =~ %s (%s)\n", test, xminday, time_match ? "PASS" : "FAIL"); + } + + return time_match; +} + + #ifdef WIN32 /* * globbing functions for windows, part of libc on unix, this code was cut and paste from