]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-4741 parse timezone variable and adjust time for time based routing
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 31 Oct 2012 15:43:59 +0000 (10:43 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 31 Oct 2012 15:43:59 +0000 (10:43 -0500)
src/include/switch_xml.h
src/mod/applications/mod_sms/mod_sms.c
src/mod/dialplans/mod_dialplan_xml/mod_dialplan_xml.c
src/switch_xml.c

index a29250ad4992e2163a90b11cd306b6bc02f9a9d3..173981e5b23680f4a25d048db9d1f1842b3b92df 100644 (file)
@@ -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);
 
index 8b747cb015696a6bb0e838d0e93cb2324bcb109d..34b2971333cb44a11b6bd88b2f49531648701674 100644 (file)
@@ -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);
index 6b685d547dce3b618be465c7d90c55168f0a9345..ac1500c4f56c98360e9373cba9d22133502499be 100644 (file)
@@ -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,
index e949113a59bfa5411ccaee067dcdea5f1757ccac..e0f3e3d37db1d5583176cce2d2da4f74f8298620 100644 (file)
@@ -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;
        }