From 518ccb67066cb659bd9760c093c0e5603401659a Mon Sep 17 00:00:00 2001 From: Jonathan Rose Date: Fri, 9 Dec 2011 20:27:03 +0000 Subject: [PATCH] Remove autojump extensions from SayUnixTime, make an option to perform automatic jumps. When a caller sends DTMF while the SayUnixTime application is saying the time, The call would jump to the next extension much like it does during Background(). This patch adds option 'j' to SayUnixTime which when used employs the old behavior. Also, this patch allows arguments to sayunixtime to not be used as empty strings in the case of something like 'sayunixtime(,,,j)' or 'sayunixtime(,,pattern). (closes issue ASTERISK-16675) Reported by: jlpedrosa Patches: patch_SayUnixTime_noJump.patch uploaded by jlpedrosa (license 5959) Review: https://reviewboard.asterisk.org/r/956/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@347866 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- CHANGES | 9 +++++++ apps/app_sayunixtime.c | 57 +++++++++++++++++++++++++++++++++-------- include/asterisk/file.h | 1 + 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index cbde563536..011ce8e702 100644 --- a/CHANGES +++ b/CHANGES @@ -45,6 +45,15 @@ Queue changes * Added queue options autopausebusy and autopauseunavail for automatically pausing a queue member when their device reports busy or congestion. +Applications +------------ + * Added 'j' option to SayUnixTime. SayUnixTime no longer auto jumps to extension + when receiving DTMF. Use the 'j' option to enable extension jumping. Also + changed arguments to SayUnixTime so that every option is truly optional even + when using multiple options (so that j option could be used without having to + manually specify timezone and format) There are other beneftis eg. format can + now be used without specifying time zone as well. + CDR postgresql driver changes ----------------------------- * Added command "cdr show pgsql status" to check connection status diff --git a/apps/app_sayunixtime.c b/apps/app_sayunixtime.c index fc1b238dd8..8a3756225c 100644 --- a/apps/app_sayunixtime.c +++ b/apps/app_sayunixtime.c @@ -46,16 +46,23 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") Says a specified time in a custom format. - + time, in seconds since Jan 1, 1970. May be negative. Defaults to now. - + timezone, see /usr/share/zoneinfo for a list. Defaults to machine default. - + a format the time is to be said in. See voicemail.conf. Defaults to ABdY "digits/at" IMp + + + + + Uses some of the sound files stored in /var/lib/asterisk/sounds to construct a phrase @@ -90,6 +97,20 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") ***/ +enum { + OPT_JUMP = (1 << 0), +}; + +enum { + OPT_ARG_JUMP = 0, + /* note: this entry _MUST_ be the last one in the enum */ + OPT_ARG_ARRAY_SIZE, +}; + +AST_APP_OPTIONS(sayunixtime_exec_options, BEGIN_OPTIONS + AST_APP_OPTION_ARG('j', OPT_JUMP, OPT_ARG_JUMP), +END_OPTIONS ); + static char *app_sayunixtime = "SayUnixTime"; static char *app_datetime = "DateTime"; @@ -99,26 +120,42 @@ static int sayunixtime_exec(struct ast_channel *chan, const char *data) AST_APP_ARG(timeval); AST_APP_ARG(timezone); AST_APP_ARG(format); + AST_APP_ARG(options); ); char *parse; int res = 0; time_t unixtime; - - if (!data) + /* New default behavior is do not jump on key pressed */ + const char * haltondigits = AST_DIGIT_NONE; + struct ast_flags64 opts = { 0, }; + char *opt_args[OPT_ARG_ARRAY_SIZE]; + + if (!data) { return 0; + } parse = ast_strdupa(data); AST_STANDARD_APP_ARGS(args, parse); - ast_get_time_t(args.timeval, &unixtime, time(NULL), NULL); + /* check if we had the 'j' jump flag in option list */ + if (!ast_strlen_zero(args.options)) { + ast_app_parse_options64(sayunixtime_exec_options, &opts, opt_args, args.options); + if (ast_test_flag64(&opts, OPT_JUMP)){ + haltondigits = AST_DIGIT_ANY; + } + } - if (chan->_state != AST_STATE_UP) + ast_get_time_t(ast_strlen_zero(args.timeval) ? NULL : args.timeval, &unixtime, time(NULL), NULL); + + if (chan->_state != AST_STATE_UP) { res = ast_answer(chan); + } - if (!res) - res = ast_say_date_with_format(chan, unixtime, AST_DIGIT_ANY, - chan->language, args.format, args.timezone); + if (!res) { + res = ast_say_date_with_format(chan, unixtime, haltondigits, + chan->language, ast_strlen_zero(args.format) ? NULL : args.format, ast_strlen_zero(args.timezone) ? NULL : args.timezone); + } return res; } diff --git a/include/asterisk/file.h b/include/asterisk/file.h index 4b03251011..e7817b3777 100644 --- a/include/asterisk/file.h +++ b/include/asterisk/file.h @@ -44,6 +44,7 @@ struct ast_format; #define AST_MAX_FORMATS 10 /*! Convenient for waiting */ +#define AST_DIGIT_NONE "" #define AST_DIGIT_ANY "0123456789#*ABCD" #define AST_DIGIT_ANYNUM "0123456789"