Index: include/asterisk/pbx.h =================================================================== --- include/asterisk/pbx.h (revision 235421) +++ include/asterisk/pbx.h (working copy) @@ -147,6 +147,14 @@ int ast_check_timing(const struct ast_timing *i); /*! + * \brief Evaluate a pre-constructed bitmap as to whether a particular time falls within the range specified. + * \param i Pointer to an ast_timing structure. + * \param tv Specified time + * \retval Returns 1, if the time matches or 0, if the time falls outside of the specified range. + */ +int ast_check_timing2(const struct ast_timing *i, const struct timeval tv); + +/*! * \brief Deallocates memory structures associated with a timing bitmap. * \param i Pointer to an ast_timing structure. * \retval 0 success Index: main/pbx.c =================================================================== --- main/pbx.c (revision 235422) +++ main/pbx.c (working copy) @@ -332,6 +332,7 @@ GotoIf IFTIME + TESTTIME @@ -717,6 +718,30 @@ RaiseException + + + Sets a time to be used with the channel to test logical conditions. + + + + Date in ISO 8601 format + + + Time in HH:MM:SS format (24-hour time) + + + Timezone name + + + + To test dialplan timing conditions at times other than the current time, use + this function to set an alternate date and time. For example, you may wish to evaluate + whether a location will correctly identify to callers that the area is closed on Christmas + Day, when Christmas would otherwise fall on a day when the office is normally open. + + GotoIfTime + + La merde se produit. @@ -7285,10 +7310,14 @@ int ast_check_timing(const struct ast_timing *i) { + return ast_check_timing2(i, ast_tvnow()); +} + +int ast_check_timing2(const struct ast_timing *i, const struct timeval tv) +{ struct ast_tm tm; - struct timeval now = ast_tvnow(); - ast_localtime(&now, &tm, i->timezone); + ast_localtime(&tv, &tm, i->timezone); /* If it's not the right month, return */ if (!(i->monthmask & (1 << tm.tm_mon))) @@ -8927,12 +8956,47 @@ } /*! + * \ingroup functions + */ +static int testtime_write(struct ast_channel *chan, const char *cmd, char *var, const char *value) +{ + struct ast_tm tm; + struct timeval tv; + char *remainder, result[30], timezone[80]; + + /* Turn off testing? */ + if (!pbx_checkcondition(value)) { + pbx_builtin_setvar_helper(chan, "TESTTIME", NULL); + return 0; + } + + /* Parse specified time */ + if (!(remainder = ast_strptime(value, "%Y/%m/%d %H:%M:%S", &tm))) { + return -1; + } + sscanf(remainder, "%79s", timezone); + tv = ast_mktime(&tm, S_OR(timezone, NULL)); + + snprintf(result, sizeof(result), "%ld", (long) tv.tv_sec); + pbx_builtin_setvar_helper(chan, "TESTTIME", result); + return 0; +} + +static struct ast_custom_function testtime_function = { + .name = "TESTTIME", + .write = testtime_write, +}; + +/*! * \ingroup applications */ static int pbx_builtin_gotoiftime(struct ast_channel *chan, const char *data) { char *s, *ts, *branch1, *branch2, *branch; struct ast_timing timing; + const char *ctime; + struct timeval tv = ast_tvnow(); + long timesecs; if (ast_strlen_zero(data)) { ast_log(LOG_WARNING, "GotoIfTime requires an argument:\n