add time of day routing attrs to condition tags in xml dialplan
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@14137 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
1e8eb422f0
commit
835b6d31bb
|
@ -564,6 +564,8 @@ 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_inet_pton(int af, const char *src, void *dst);
|
||||||
|
|
||||||
|
SWITCH_DECLARE(int) switch_number_cmp(const char *exp, int val);
|
||||||
|
|
||||||
/* malloc or DIE macros */
|
/* malloc or DIE macros */
|
||||||
#ifdef NDEBUG
|
#ifdef NDEBUG
|
||||||
#define switch_malloc(ptr, len) (void)( (!!(ptr = malloc(len))) || (fprintf(stderr,"ABORT! Malloc failure at: %s:%s", __FILE__, __LINE__),abort(), 0), ptr )
|
#define switch_malloc(ptr, len) (void)( (!!(ptr = malloc(len))) || (fprintf(stderr,"ABORT! Malloc failure at: %s:%s", __FILE__, __LINE__),abort(), 0), ptr )
|
||||||
|
|
|
@ -44,6 +44,7 @@ typedef enum {
|
||||||
BREAK_NEVER
|
BREAK_NEVER
|
||||||
} break_t;
|
} break_t;
|
||||||
|
|
||||||
|
|
||||||
static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *caller_profile, switch_xml_t xexten, switch_caller_extension_t **extension)
|
static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *caller_profile, switch_xml_t xexten, switch_caller_extension_t **extension)
|
||||||
{
|
{
|
||||||
switch_xml_t xcond, xaction, xexpression;
|
switch_xml_t xcond, xaction, xexpression;
|
||||||
|
@ -65,6 +66,18 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
int ovector[30];
|
int ovector[30];
|
||||||
break_t do_break_i = BREAK_ON_FALSE;
|
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 *xwday = switch_xml_attr(xcond, "wday");
|
||||||
|
const char *xhour = switch_xml_attr(xcond, "hour");
|
||||||
|
const char *xminute = switch_xml_attr(xcond, "minute");
|
||||||
|
switch_time_t ts = switch_micro_time_now();
|
||||||
|
int time_match = -1;
|
||||||
|
switch_time_exp_t tm;
|
||||||
|
|
||||||
switch_safe_free(field_expanded);
|
switch_safe_free(field_expanded);
|
||||||
switch_safe_free(expression_expanded);
|
switch_safe_free(expression_expanded);
|
||||||
|
|
||||||
|
@ -74,6 +87,40 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch_time_exp_lt(&tm, ts);
|
||||||
|
|
||||||
|
if (time_match && xyear) {
|
||||||
|
time_match = switch_number_cmp(xyear, tm.tm_year + 1900);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time_match && xyday) {
|
||||||
|
time_match = switch_number_cmp(xyday, tm.tm_yday + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time_match && xmon) {
|
||||||
|
time_match = switch_number_cmp(xmon, tm.tm_mon + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time_match && xmday) {
|
||||||
|
time_match = switch_number_cmp(xmday, tm.tm_mday);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time_match && xweek) {
|
||||||
|
time_match = switch_number_cmp(xweek, (int) (tm.tm_yday + 1 / 7));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time_match && xwday) {
|
||||||
|
time_match = switch_number_cmp(xwday, tm.tm_wday + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time_match && xhour) {
|
||||||
|
time_match = switch_number_cmp(xhour, tm.tm_hour);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time_match && xminute) {
|
||||||
|
time_match = switch_number_cmp(xminute, tm.tm_min + 1);
|
||||||
|
}
|
||||||
|
|
||||||
field = (char *) switch_xml_attr(xcond, "field");
|
field = (char *) switch_xml_attr(xcond, "field");
|
||||||
|
|
||||||
if ((xexpression = switch_xml_child(xcond, "expression"))) {
|
if ((xexpression = switch_xml_child(xcond, "expression"))) {
|
||||||
|
@ -102,6 +149,17 @@ static int parse_exten(switch_core_session_t *session, switch_caller_profile_t *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (time_match == 0) {
|
||||||
|
if (do_break_i == BREAK_ON_FALSE || do_break_i == BREAK_ALWAYS) {
|
||||||
|
break;
|
||||||
|
} else if (do_break_i == BREAK_NEVER) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
proceed = 0;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (field) {
|
if (field) {
|
||||||
if (strchr(field, '$')) {
|
if (strchr(field, '$')) {
|
||||||
if ((field_expanded = switch_channel_expand_variables(channel, field)) == field) {
|
if ((field_expanded = switch_channel_expand_variables(channel, field)) == field) {
|
||||||
|
|
|
@ -1949,6 +1949,47 @@ SWITCH_DECLARE(int) switch_isxdigit(int c)
|
||||||
return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & (_N|_X)));
|
return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & (_N|_X)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SWITCH_DECLARE(int) switch_number_cmp(const char *exp, int val)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
if ((p=strchr(exp, '-'))) {
|
||||||
|
int min;
|
||||||
|
int max;
|
||||||
|
|
||||||
|
min = atol(exp);
|
||||||
|
p++;
|
||||||
|
max = atol(p);
|
||||||
|
|
||||||
|
if (val >= min && val <= max) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else if ((p=strchr(exp, ','))) {
|
||||||
|
const char *cur = exp;
|
||||||
|
p++;
|
||||||
|
while(cur) {
|
||||||
|
if (atol(cur) == val) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur = p;
|
||||||
|
if (p && p+1) {
|
||||||
|
if ((p = strchr((p+1), ','))) {
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (atol(exp) == val) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* For Emacs:
|
/* For Emacs:
|
||||||
* Local Variables:
|
* Local Variables:
|
||||||
* mode:c
|
* mode:c
|
||||||
|
|
Loading…
Reference in New Issue