Merge "res_musiconhold: Start playlist after initial announcement"
[asterisk/asterisk.git] / apps / app_sayunixtime.c
old mode 100755 (executable)
new mode 100644 (file)
index a641779..b60c71e
 /*
- * Asterisk -- A telephony toolkit for Linux.
+ * Asterisk -- An open source telephony toolkit.
  *
- * SayUnixTime application
- * 
- * Copyright (c) 2003 Tilghman Lesher.  All rights reserved.
+ * Copyright (c) 2003, 2006 Tilghman Lesher.  All rights reserved.
+ * Copyright (c) 2006 Digium, Inc.
  *
  * Tilghman Lesher <app_sayunixtime__200309@the-tilghman.com>
  *
  * This code is released by the author with no restrictions on usage.
  *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
+/*! \file
+ *
+ * \brief SayUnixTime application
+ *
+ * \author Tilghman Lesher <app_sayunixtime__200309@the-tilghman.com>
+ * 
+ * \ingroup applications
+ */
 
-#include "asterisk.h"
+/*** MODULEINFO
+       <support_level>core</support_level>
+ ***/
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+#include "asterisk.h"
 
 #include "asterisk/file.h"
-#include "asterisk/logger.h"
-#include "asterisk/options.h"
 #include "asterisk/channel.h"
 #include "asterisk/pbx.h"
 #include "asterisk/module.h"
 #include "asterisk/say.h"
-
-
-static char *tdesc = "Say time";
+#include "asterisk/app.h"
+
+/*** DOCUMENTATION
+       <application name="SayUnixTime" language="en_US">
+               <synopsis>
+                       Says a specified time in a custom format.
+               </synopsis>
+               <syntax>
+                       <parameter name="unixtime" required="false">
+                               <para>time, in seconds since Jan 1, 1970.  May be negative. Defaults to now.</para>
+                       </parameter>
+                       <parameter name="timezone" required="false" >
+                               <para>timezone, see <directory>/usr/share/zoneinfo</directory> for a list. Defaults to machine default.</para>
+                       </parameter>
+                       <parameter name="format" required="false" >
+                               <para>a format the time is to be said in.  See <filename>voicemail.conf</filename>.
+                               Defaults to <literal>ABdY "digits/at" IMp</literal></para>
+                       </parameter>
+                       <parameter name="options" required="false">
+                                <optionlist>
+                                       <option name="j">
+                                               <para>Allow the calling user to dial digits to jump to that extension.
+                                               This option is automatically enabled if
+                                               <variable>SAY_DTMF_INTERRUPT</variable> is present on the channel and
+                                               set to 'true' (case insensitive)</para>
+                                       </option>
+                               </optionlist>
+                       </parameter>
+               </syntax>
+               <description>
+                       <para>Uses some of the sound files stored in <directory>/var/lib/asterisk/sounds</directory> to construct a phrase 
+                       saying the specified date and/or time in the specified format. </para>
+               </description>
+               <see-also>
+                       <ref type="function">STRFTIME</ref>
+                       <ref type="function">STRPTIME</ref>
+                       <ref type="function">IFTIME</ref>
+               </see-also>
+       </application>
+       <application name="DateTime" language="en_US">
+               <synopsis>
+                       Says a specified time in a custom format.
+               </synopsis>
+               <syntax>
+                       <parameter name="unixtime">
+                               <para>time, in seconds since Jan 1, 1970.  May be negative. Defaults to now.</para>
+                       </parameter>
+                       <parameter name="timezone">
+                               <para>timezone, see <filename>/usr/share/zoneinfo</filename> for a list. Defaults to machine default.</para>
+                       </parameter>
+                       <parameter name="format">
+                               <para>a format the time is to be said in.  See <filename>voicemail.conf</filename>.
+                               Defaults to <literal>ABdY "digits/at" IMp</literal></para>
+                       </parameter>
+               </syntax>
+               <description>
+                       <para>Say the date and time in a specified format.</para>
+               </description>
+       </application>
+
+ ***/
+
+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";
 
-static char *sayunixtime_synopsis = "Says a specified time in a custom format";
-
-static char *sayunixtime_descrip =
-"SayUnixTime([unixtime][|[timezone][|format]])\n"
-"  unixtime: time, in seconds since Jan 1, 1970.  May be negative.\n"
-"              defaults to now.\n"
-"  timezone: timezone, see /usr/share/zoneinfo for a list.\n"
-"              defaults to machine default.\n"
-"  format:   a format the time is to be said in.  See voicemail.conf.\n"
-"              defaults to \"ABdY 'digits/at' IMp\"\n"
-"  Returns 0 or -1 on hangup.\n";
-static char *datetime_descrip =
-"DateTime([unixtime][|[timezone][|format]])\n"
-"  unixtime: time, in seconds since Jan 1, 1970.  May be negative.\n"
-"              defaults to now.\n"
-"  timezone: timezone, see /usr/share/zoneinfo for a list.\n"
-"              defaults to machine default.\n"
-"  format:   a format the time is to be said in.  See voicemail.conf.\n"
-"              defaults to \"ABdY 'digits/at' IMp\"\n"
-"  Returns 0 or -1 on hangup.\n";
-
-STANDARD_LOCAL_USER;
-
-LOCAL_USER_DECL;
-
-static int sayunixtime_exec(struct ast_channel *chan, void *data)
+static int sayunixtime_exec(struct ast_channel *chan, const char *data)
 {
-       int res=0;
-       struct localuser *u;
-       char *s,*zone=NULL,*timec,*format;
+       AST_DECLARE_APP_ARGS(args,
+               AST_APP_ARG(timeval);
+               AST_APP_ARG(timezone);
+               AST_APP_ARG(format);
+               AST_APP_ARG(options);
+       );
+       char *parse;
+       int res = 0;
        time_t unixtime;
-       struct timeval tv;
-       
-       LOCAL_USER_ADD(u);
-
-       gettimeofday(&tv,NULL);
-       unixtime = (time_t)tv.tv_sec;
-
-       if( !strcasecmp(chan->language, "da" ) ) {
-               format = "A dBY HMS";
-       } else if ( !strcasecmp(chan->language, "de" ) ) {
-               format = "A dBY HMS";
-       } else {
-               format = "ABdY 'digits/at' IMp";
-       } 
-
-       if (data) {
-               s = data;
-               s = ast_strdupa(s);
-               if (s) {
-                       timec = strsep(&s,"|");
-                       if ((timec) && (*timec != '\0')) {
-                               long timein;
-                               if (sscanf(timec,"%ld",&timein) == 1) {
-                                       unixtime = (time_t)timein;
-                               }
-                       }
-                       if (s) {
-                               zone = strsep(&s,"|");
-                               if (zone && (*zone == '\0'))
-                                       zone = NULL;
-                               if (s) {
-                                       format = s;
-                               }
-                       }
-               } else {
-                       ast_log(LOG_ERROR, "Out of memory error\n");
+       /* 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];
+       const char *interrupt_string;
+
+       if (!data) {
+               return 0;
+       }
+
+       parse = ast_strdupa(data);
+
+       AST_STANDARD_APP_ARGS(args, parse);
+
+       /* 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) {
+       /* Check if 'SAY_DTMF_INTERRUPT' is true and apply the same behavior as the j flag. */
+       ast_channel_lock(chan);
+       interrupt_string = pbx_builtin_getvar_helper(chan, "SAY_DTMF_INTERRUPT");
+       if (ast_true(interrupt_string)) {
+               haltondigits = AST_DIGIT_ANY;
+       }
+       ast_channel_unlock(chan);
+
+       ast_get_time_t(ast_strlen_zero(args.timeval) ? NULL : args.timeval, &unixtime, time(NULL), NULL);
+
+       if (ast_channel_state(chan) != AST_STATE_UP) {
                res = ast_answer(chan);
        }
-       if (!res)
-               res = ast_say_date_with_format(chan, unixtime, AST_DIGIT_ANY, chan->language, format, zone);
 
-       LOCAL_USER_REMOVE(u);
+       if (!res) {
+               res = ast_say_date_with_format(chan, unixtime, haltondigits,
+                                              ast_channel_language(chan), ast_strlen_zero(args.format) ? NULL : args.format, ast_strlen_zero(args.timezone) ? NULL : args.timezone);
+       }
+
        return res;
 }
 
-int unload_module(void)
+static int unload_module(void)
 {
        int res;
-       STANDARD_HANGUP_LOCALUSERS;
+       
        res = ast_unregister_application(app_sayunixtime);
-       if (! res)
-               return ast_unregister_application(app_datetime);
-       else
-               return res;
-}
-
-int load_module(void)
-{
-       int res;
-       res = ast_register_application(app_sayunixtime, sayunixtime_exec, sayunixtime_synopsis, sayunixtime_descrip);
-       if (! res)
-               return ast_register_application(app_datetime, sayunixtime_exec, sayunixtime_synopsis, datetime_descrip);
-       else
-               return res;
-}
-
-char *description(void)
-{
-       return tdesc;
+       res |= ast_unregister_application(app_datetime);
+       
+       return res;
 }
 
-int usecount(void)
+static int load_module(void)
 {
        int res;
-       STANDARD_USECOUNT(res);
+       
+       res = ast_register_application_xml(app_sayunixtime, sayunixtime_exec);
+       res |= ast_register_application_xml(app_datetime, sayunixtime_exec);
+       
        return res;
 }
 
-char *key()
-{
-       return ASTERISK_GPL_KEY;
-}
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Say time");