From a4a44fb140d432b8c4327e713fb215fcf7c42901 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 31 Oct 2012 10:43:59 -0500 Subject: [PATCH] FS-4741 parse timezone variable and adjust time for time based routing --- src/include/switch_xml.h | 2 +- src/mod/applications/mod_sms/mod_sms.c | 18 +++++++++++++++++- .../mod_dialplan_xml/mod_dialplan_xml.c | 7 ++++--- src/switch_xml.c | 4 +++- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/include/switch_xml.h b/src/include/switch_xml.h index a29250ad49..173981e5b2 100644 --- a/src/include/switch_xml.h +++ b/src/include/switch_xml.h @@ -423,7 +423,7 @@ 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, int *offset); +SWITCH_DECLARE(int) switch_xml_std_datetime_check(switch_xml_t xcond, int *offset, const char *tzname); SWITCH_DECLARE(switch_status_t) switch_xml_locate_language(switch_xml_t *root, switch_xml_t *node, switch_event_t *params, switch_xml_t *language, switch_xml_t *phrases, switch_xml_t *macros, const char *str_language); diff --git a/src/mod/applications/mod_sms/mod_sms.c b/src/mod/applications/mod_sms/mod_sms.c index 8b747cb015..34b2971333 100644 --- a/src/mod/applications/mod_sms/mod_sms.c +++ b/src/mod/applications/mod_sms/mod_sms.c @@ -64,6 +64,16 @@ typedef enum { } break_t; +#define check_tz() tzoff = switch_event_get_header(event, "tod_tz_offset"); \ + tzname = switch_event_get_header(event, "timezone"); \ + do { \ + if (!zstr(tzoff) && switch_is_number(tzoff)) { \ + offset = atoi(tzoff); \ + } else { \ + tzoff = NULL; \ + } \ + break; \ + } while(tzoff) static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_t **extension) { @@ -73,6 +83,10 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_ char *expression_expanded = NULL, *field_expanded = NULL; switch_regex_t *re = NULL; const char *to = switch_event_get_header(event, "to"); + const char *tzoff = NULL, *tzname = NULL; + int offset = 0; + + check_tz(); if (!to) { to = "nobody"; @@ -90,8 +104,10 @@ static int parse_exten(switch_event_t *event, switch_xml_t xexten, switch_event_ int ovector[30]; switch_bool_t anti_action = SWITCH_TRUE; break_t do_break_i = BREAK_ON_FALSE; + int time_match; - int time_match = switch_xml_std_datetime_check(xcond, NULL); + check_tz(); + time_match = switch_xml_std_datetime_check(xcond, tzoff ? &offset : NULL, tzname); switch_safe_free(field_expanded); switch_safe_free(expression_expanded); 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 6b685d547d..ac1500c4f5 100644 --- a/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c +++ b/src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c @@ -81,6 +81,7 @@ static switch_status_t exec_app(switch_core_session_t *session, const char *app, #define check_tz() tzoff = switch_channel_get_variable(channel, "tod_tz_offset"); \ + tzname = switch_channel_get_variable(channel, "timezone"); \ do { \ if (!zstr(tzoff) && switch_is_number(tzoff)) { \ offset = atoi(tzoff); \ @@ -99,7 +100,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t * char *expression_expanded = NULL, *field_expanded = NULL; switch_regex_t *re = NULL, *save_re = NULL; int offset = 0; - const char *tzoff; + const char *tzoff = NULL, *tzname = NULL; check_tz(); @@ -120,7 +121,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t * int time_match; check_tz(); - time_match = switch_xml_std_datetime_check(xcond, tzoff ? &offset : NULL); + time_match = switch_xml_std_datetime_check(xcond, tzoff ? &offset : NULL, tzname); switch_safe_free(field_expanded); @@ -173,7 +174,7 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t * for (xregex = switch_xml_child(xcond, "regex"); xregex; xregex = xregex->next) { check_tz(); - time_match = switch_xml_std_datetime_check(xregex, tzoff ? &offset : NULL); + time_match = switch_xml_std_datetime_check(xregex, tzoff ? &offset : NULL, tzname); if (time_match == 1) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG_CLEAN(session), SWITCH_LOG_DEBUG, diff --git a/src/switch_xml.c b/src/switch_xml.c index e949113a59..e0f3e3d37d 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -2883,7 +2883,7 @@ 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, int *offset) +SWITCH_DECLARE(int) switch_xml_std_datetime_check(switch_xml_t xcond, int *offset, const char *tzname) { const char *xdt = switch_xml_attr(xcond, "date-time"); @@ -2921,6 +2921,8 @@ SWITCH_DECLARE(int) switch_xml_std_datetime_check(switch_xml_t xcond, int *offse if (offset) { eoffset = *offset; switch_time_exp_tz(&tm, ts, *offset * 3600); + } else if (!zstr(tzname)) { + switch_time_exp_tz_name(tzname, &tm, ts); } else { tm = tm2; }