diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h index 4eac906f59..a52676ddda 100644 --- a/src/include/switch_utils.h +++ b/src/include/switch_utils.h @@ -683,6 +683,10 @@ 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); +SWITCH_DECLARE(int) switch_fulldate_cmp(const char *exp, switch_time_t *ts); +SWITCH_DECLARE(void) switch_split_date(const char *exp, int *year, int *month, int *day); +SWITCH_DECLARE(void) switch_split_time(const char *exp, int *hour, int *min, int *sec); + /*! \brief Split a user@domain string as user and domain \param in the input string diff --git a/src/switch_utils.c b/src/switch_utils.c index cb4679d53a..6df515906e 100644 --- a/src/switch_utils.c +++ b/src/switch_utils.c @@ -2090,6 +2090,137 @@ SWITCH_DECLARE(char *) switch_url_decode(char *s) return s; } +SWITCH_DECLARE(void) switch_split_time(const char *exp, int *hour, int *min, int *sec) +{ + char *dup = strdup(exp); + char *shour = NULL; + char *smin = NULL; + char *ssec = NULL; + + switch_assert(dup); + + shour = dup; + if ((smin=strchr(dup, ':'))) { + *smin++ = '\0'; + if ((ssec=strchr(smin, ':'))) { + *ssec++ = '\0'; + } else { + ssec = "00"; + } + if (hour && shour) { + *hour = atol(shour); + } + if (min && smin) { + *min = atol(smin); + } + if (sec && ssec) { + *sec = atol(ssec); + } + + } + switch_safe_free(dup); + return; + +} + +SWITCH_DECLARE(void) switch_split_date(const char *exp, int *year, int *month, int *day) +{ + char *dup = strdup(exp); + char *syear = NULL; + char *smonth = NULL; + char *sday = NULL; + + switch_assert(dup); + + syear = dup; + if ((smonth=strchr(dup, '-'))) { + *smonth++ = '\0'; + if ((sday=strchr(smonth, '-'))) { + *sday++ = '\0'; + if (year && syear) { + *year = atol(syear); + } + if (month && smonth) { + *month = atol(smonth); + } + if (day && sday) { + *day = atol(sday); + } + } + } + switch_safe_free(dup); + return; + +} + +/* Ex exp value "2009-10-10 14:33:22~2009-11-10 17:32:31" */ +SWITCH_DECLARE(int) switch_fulldate_cmp(const char *exp, switch_time_t *ts) +{ + char *dup = strdup(exp); + char *sStart; + char *sEnd; + char *sDate; + char *sTime; + switch_time_t tsStart; + switch_time_t tsEnd; + + switch_assert(dup); + + sStart = dup; + if ((sEnd=strchr(dup, '~'))) { + *sEnd++ = '\0'; + sDate = sStart; + if ((sTime=strchr(sStart, ' '))) { + struct tm tmTmp; + int year, month, day; + int hour, min, sec; + + *sTime++ = '\0'; + + switch_split_date(sDate, &year, &month, &day); + switch_split_time(sTime, &hour, &min, &sec); + tmTmp.tm_year = year; + tmTmp.tm_mon = month; + tmTmp.tm_mday = day; + + tmTmp.tm_hour = hour; + tmTmp.tm_min = min; + tmTmp.tm_sec = sec; + tmTmp.tm_isdst = 0; + tsStart = mktime(&tmTmp); + + sDate = sEnd; + if ((sTime=strchr(sEnd, ' '))) { + struct tm tmTmp; + int year, month, day; + int hour, min, sec; + + *sTime++ = '\0'; + + switch_split_date(sDate, &year, &month, &day); + switch_split_time(sTime, &hour, &min, &sec); + tmTmp.tm_year = year; + tmTmp.tm_mon = month; + tmTmp.tm_mday = day; + + tmTmp.tm_hour = hour; + tmTmp.tm_min = min; + tmTmp.tm_sec = sec; + tmTmp.tm_isdst = 0; + tsEnd = mktime(&tmTmp); + + if (tsStart <= *ts && tsEnd > *ts) { + switch_safe_free(dup); + return 1; + } + } + } + } + switch_safe_free(dup); + return 0; + +} + /* Written by Marc Espie, public domain */ #define SWITCH_CTYPE_NUM_CHARS 256 diff --git a/src/switch_xml.c b/src/switch_xml.c index 77c3a5e20e..3e46fc0ae2 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -2652,6 +2652,7 @@ SWITCH_DECLARE(switch_xml_t) switch_xml_cut(switch_xml_t xml) SWITCH_DECLARE(int) switch_xml_std_datetime_check(switch_xml_t xcond) { + const char *xdt = switch_xml_attr(xcond, "date-time"); const char *xyear = switch_xml_attr(xcond, "year"); const char *xyday = switch_xml_attr(xcond, "yday"); const char *xmon = switch_xml_attr(xcond, "mon"); @@ -2670,6 +2671,15 @@ SWITCH_DECLARE(int) switch_xml_std_datetime_check(switch_xml_t xcond) { switch_time_exp_lt(&tm, ts); + if (time_match && xdt) { + char tmpdate[80]; + switch_size_t retsize; + switch_strftime(tmpdate, &retsize, sizeof(tmpdate), "%Y-%m-%d %H:%M:%S", &tm); + time_match = switch_fulldate_cmp(xdt, &ts); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "XML DateTime Check: date time[%s] =~ %s (%s)\n", tmpdate, xdt, time_match ? "PASS" : "FAIL"); + } + if (time_match && xyear) { int test = tm.tm_year + 1900; time_match = switch_number_cmp(xyear, test);