From 4ab8fa13e126ef3beeba88fffd4a5a0e81f069a8 Mon Sep 17 00:00:00 2001 From: Marc Olivier Chouinard Date: Fri, 17 Sep 2010 00:07:30 -0400 Subject: [PATCH] switch_utils: Add time of day string compare function switch_tod_cmp. It usable in XML dialplan with time-of-day. String format is hh:mm:ss you can define a range like this : 09:00-17:00 (Second are not optional) --- src/include/switch_utils.h | 1 + src/switch_utils.c | 43 ++++++++++++++++++++++++++++++++++++++ src/switch_xml.c | 10 +++++++++ 3 files changed, 54 insertions(+) diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h index f24cee5e9f..4eac906f59 100644 --- a/src/include/switch_utils.h +++ b/src/include/switch_utils.h @@ -681,6 +681,7 @@ SWITCH_DECLARE(switch_bool_t) switch_network_list_validate_ip_token(switch_netwo SWITCH_DECLARE(int) switch_inet_pton(int af, const char *src, void *dst); SWITCH_DECLARE(int) switch_number_cmp(const char *exp, int val); +SWITCH_DECLARE(int) switch_tod_cmp(const char *exp, int val); /*! \brief Split a user@domain string as user and domain diff --git a/src/switch_utils.c b/src/switch_utils.c index 91b78f7bbb..cb4679d53a 100644 --- a/src/switch_utils.c +++ b/src/switch_utils.c @@ -2375,6 +2375,49 @@ SWITCH_DECLARE(int) switch_number_cmp(const char *exp, int val) } +SWITCH_DECLARE(int) switch_tod_cmp(const char *exp, int val) +{ + char *dup = strdup(exp); + char *minh; + char *minm; + char *mins; + char *maxh; + char *maxm; + char *maxs; + + switch_assert(dup); + + minh = dup; + if ((minm=strchr(dup, ':'))) { + *minm++ = '\0'; + if ((maxh=strchr(minm, '-'))) { + if ((maxm=strchr(maxh, ':'))) { + *maxh++ = '\0'; + *maxm++ = '\0'; + /* Check if min/max seconds are present */ + if ((mins=strchr(minm, ':'))) { + *mins++ = '\0'; + } else { + mins = "00"; + } + if ((maxs=strchr(maxm, ':'))) { + *maxs++ = '\0'; + } else { + maxs = "00"; + } + + if (val >= (atol(minh) * 60 * 60) + (atol(minm) * 60) + atol(mins) && val < (atol(maxh) * 60 * 60) + (atol(maxm) * 60) + atol(maxs)) { + switch_safe_free(dup); + return 1; + } + } + } + } + switch_safe_free(dup); + return 0; + +} + SWITCH_DECLARE(int) switch_split_user_domain(char *in, char **user, char **domain) { char *p = NULL, *h = NULL, *u = in; diff --git a/src/switch_xml.c b/src/switch_xml.c index 688978907f..77c3a5e20e 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -2662,6 +2662,7 @@ SWITCH_DECLARE(int) switch_xml_std_datetime_check(switch_xml_t xcond) { 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"); + const char *xtod = switch_xml_attr(xcond, "time-of-day"); switch_time_t ts = switch_micro_time_now(); int time_match = -1; @@ -2747,6 +2748,15 @@ SWITCH_DECLARE(int) switch_xml_std_datetime_check(switch_xml_t xcond) { "XML DateTime Check: minute of day[%d] =~ %s (%s)\n", test, xminday, time_match ? "PASS" : "FAIL"); } + if (time_match && xtod) { + int test = (tm.tm_hour * 60 * 60) + (tm.tm_min * 60) + tm.tm_sec; + char tmpdate[10]; + switch_snprintf(tmpdate, 6, "%d:%d:%d", tm.tm_hour, tm.tm_min, tm.tm_sec); + time_match = switch_tod_cmp(xtod, test); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG9, + "XML DateTime Check: time of day[%s] =~ %s (%s)\n", tmpdate, xtod, time_match ? "PASS" : "FAIL"); + } + return time_match; }