CHANGES: Update changes log to include r403414 entry
[asterisk/asterisk.git] / apps / app_morsecode.c
index 0145eb9..2d7c117 100644 (file)
  * \ingroup applications
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
+/*** MODULEINFO
+       <support_level>extended</support_level>
+ ***/
 
 #include "asterisk.h"
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
 #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/indications.h"
 
-static char *tdesc = "Morse code";
-
-static char *app_morsecode = "Morsecode";
-
-static char *morsecode_synopsis = "Plays morse code";
-
-static char *morsecode_descrip =
-"Usage: Morsecode(<string>)\n"
-"Plays the Morse code equivalent of the passed string.  If the variable\n"
-"MORSEDITLEN is set, it will use that value for the length (in ms) of the dit\n"
-"(defaults to 80).  Additionally, if MORSETONE is set, it will use that tone\n"
-"(in Hz).  The tone default is 800.\n";
-
-LOCAL_USER_DECL;
-
-static char *morsecode[] = {
+/*** DOCUMENTATION
+       <application name="Morsecode" language="en_US">
+               <synopsis>
+                       Plays morse code.
+               </synopsis>
+               <syntax>
+                       <parameter name="string" required="true">
+                               <para>String to playback as morse code to channel</para>
+                       </parameter>
+               </syntax>
+               <description>
+                       <para>Plays the Morse code equivalent of the passed string.</para>
+                       <para>This application does not automatically answer and should be preceeded by
+                       an application such as Answer() or Progress().</para>
+                       <para>This application uses the following variables:</para>
+                       <variablelist>
+                               <variable name="MORSEDITLEN">
+                                       <para>Use this value in (ms) for length of dit</para>
+                               </variable>
+                               <variable name="MORSETONE">
+                                       <para>The pitch of the tone in (Hz), default is 800</para>
+                               </variable>
+                       </variablelist>
+               </description>
+               <see-also>
+                       <ref type="application">SayAlpha</ref>
+                       <ref type="application">SayPhonetic</ref>
+               </see-also>
+       </application>
+ ***/  
+static const char app_morsecode[] = "Morsecode";
+
+static const char * const morsecode[] = {
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /*  0-15 */
        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", /* 16-31 */
        " ",      /* 32 - <space> */
@@ -74,10 +88,10 @@ static char *morsecode[] = {
        "--..--", /* 44 - , */
        "-....-", /* 45 - - */
        ".-.-.-", /* 46 - . */
-       "-··-·",  /* 47 - / */
+       "-..-.",  /* 47 - / */
        "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", /* 48-57 - 0-9 */
        "---...", /* 58 - : */
-       "-·-·-·", /* 59 - ; */
+       "-.-.-.", /* 59 - ; */
        "",       /* 60 - < */
        "-...-",  /* 61 - = */
        "",       /* 62 - > */
@@ -109,39 +123,40 @@ static void playtone(struct ast_channel *chan, int tone, int len)
        ast_playtones_stop(chan);
 }
 
-static int morsecode_exec(struct ast_channel *chan, void *data)
+static int morsecode_exec(struct ast_channel *chan, const char *data)
 {
        int res=0, ditlen, tone;
-       char *digit;
+       const char *digit;
        const char *ditlenc, *tonec;
-       struct localuser *u;
-
-       LOCAL_USER_ADD(u);
 
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "Syntax: Morsecode(<string>) - no argument found\n");
-               LOCAL_USER_REMOVE(u);
                return 0;
        }
 
        /* Use variable MORESEDITLEN, if set (else 80) */
+       ast_channel_lock(chan);
        ditlenc = pbx_builtin_getvar_helper(chan, "MORSEDITLEN");
-       if (ast_strlen_zero(ditlenc) || (sscanf(ditlenc, "%d", &ditlen) != 1)) {
+       if (ast_strlen_zero(ditlenc) || (sscanf(ditlenc, "%30d", &ditlen) != 1)) {
                ditlen = 80;
        }
+       ast_channel_unlock(chan);
 
        /* Use variable MORSETONE, if set (else 800) */
+       ast_channel_lock(chan);
        tonec = pbx_builtin_getvar_helper(chan, "MORSETONE");
-       if (ast_strlen_zero(tonec) || (sscanf(tonec, "%d", &tone) != 1)) {
+       if (ast_strlen_zero(tonec) || (sscanf(tonec, "%30d", &tone) != 1)) {
                tone = 800;
        }
+       ast_channel_unlock(chan);
 
        for (digit = data; *digit; digit++) {
-               char *dahdit;
-               if (*digit < 0) {
+               int digit2 = *digit;
+               const char *dahdit;
+               if (digit2 < 0) {
                        continue;
                }
-               for (dahdit = morsecode[(int)*digit]; *dahdit; dahdit++) {
+               for (dahdit = morsecode[digit2]; *dahdit; dahdit++) {
                        if (*dahdit == '-') {
                                playtone(chan, tone, 3 * ditlen);
                        } else if (*dahdit == '.') {
@@ -158,34 +173,17 @@ static int morsecode_exec(struct ast_channel *chan, void *data)
                playtone(chan, 0, 2 * ditlen);
        }
 
-       LOCAL_USER_REMOVE(u);
-       return res;
-}
-
-static int unload_module(void *mod)
-{
-       int res;
-
-       res = ast_unregister_application(app_morsecode);
-
-       STANDARD_HANGUP_LOCALUSERS;
-
        return res;
 }
 
-static int load_module(void *mod)
-{
-       return ast_register_application(app_morsecode, morsecode_exec, morsecode_synopsis, morsecode_descrip);
-}
-
-static const char *description(void)
+static int unload_module(void)
 {
-       return tdesc;
+       return ast_unregister_application(app_morsecode);
 }
 
-static const char *key(void)
+static int load_module(void)
 {
-       return ASTERISK_GPL_KEY;
+       return ast_register_application_xml(app_morsecode, morsecode_exec);
 }
 
-STD_MOD1;
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Morse code");