Allow a Skinny device to monitor a dialplan hint (w00t!).
[asterisk/asterisk.git] / apps / app_read.c
index f9c1f48..cde03c6 100644 (file)
@@ -57,17 +57,15 @@ AST_APP_OPTIONS(read_app_options, {
        AST_APP_OPTION('n', OPT_NOANSWER),
 });
 
-static char *tdesc = "Read Variable Application";
-
 static char *app = "Read";
 
 static char *synopsis = "Read a variable";
 
 static char *descrip = 
-"  Read(variable[|filename][|maxdigits][|option][|attempts][|timeout])\n\n"
+"  Read(variable[|filename[&filename2...]][|maxdigits][|option][|attempts][|timeout])\n\n"
 "Reads a #-terminated string of digits a certain number of times from the\n"
 "user in to the given variable.\n"
-"  filename   -- file to play before reading digits or tone with option i\n"
+"  filename   -- file(s) to play before reading digits or tone with option i\n"
 "  maxdigits  -- maximum acceptable number of digits. Stops reading after\n"
 "                maxdigits have been entered (without requiring the user to\n"
 "                press the '#' key).\n"
@@ -79,24 +77,23 @@ static char *descrip =
 "                'n' to read digits even if the line is not up.\n"
 "  attempts   -- if greater than 1, that many attempts will be made in the \n"
 "                event no data is entered.\n"
-"  timeout    -- if greater than 0, that value will override the default timeout.\n\n"
+"  timeout    -- The number of seconds to wait for a digit response. If greater\n"
+"                than 0, that value will override the default timeout. Can be floating point.\n\n"
 "Read should disconnect if the function fails or errors out.\n";
 
-LOCAL_USER_DECL;
 
 #define ast_next_data(instr,ptr,delim) if((ptr=strchr(instr,delim))) { *(ptr) = '\0' ; ptr++;}
 
 static int read_exec(struct ast_channel *chan, void *data)
 {
        int res = 0;
-       struct localuser *u;
-       char tmp[256];
-       int maxdigits=255;
-       int tries = 1;
-       int to = 0;
-       int x = 0;
+       struct ast_module_user *u;
+       char tmp[256] = "";
+       int maxdigits = 255;
+       int tries = 1, to = 0, x = 0;
+       double tosec;
        char *argcopy = NULL;
-       struct tone_zone_sound *ts;
+       struct ind_tone_zone_sound *ts;
        struct ast_flags flags = {0};
 
         AST_DECLARE_APP_ARGS(arglist,
@@ -113,7 +110,7 @@ static int read_exec(struct ast_channel *chan, void *data)
                return -1;
        }
 
-       LOCAL_USER_ADD(u);
+       u = ast_module_user_add(chan);
        
        argcopy = ast_strdupa(data);
 
@@ -130,11 +127,11 @@ static int read_exec(struct ast_channel *chan, void *data)
        }
 
        if (!ast_strlen_zero(arglist.timeout)) {
-               to = atoi(arglist.timeout);
-               if (to <= 0)
+               tosec = atof(arglist.timeout);
+               if (tosec <= 0)
                        to = 0;
                else
-                       to *= 1000;
+                       to = tosec * 1000.0;
        }
 
        if (ast_strlen_zero(arglist.filename)) {
@@ -149,7 +146,7 @@ static int read_exec(struct ast_channel *chan, void *data)
        }
        if (ast_strlen_zero(arglist.variable)) {
                ast_log(LOG_WARNING, "Invalid! Usage: Read(variable[|filename][|maxdigits][|option][|attempts][|timeout])\n\n");
-               LOCAL_USER_REMOVE(u);
+               ast_module_user_remove(u);
                return -1;
        }
        ts=NULL;
@@ -162,7 +159,7 @@ static int read_exec(struct ast_channel *chan, void *data)
                if (ast_test_flag(&flags,OPT_SKIP)) {
                        /* At the user's option, skip if the line is not up */
                        pbx_builtin_setvar_helper(chan, arglist.variable, "\0");
-                       LOCAL_USER_REMOVE(u);
+                       ast_module_user_remove(u);
                        return 0;
                } else if (!ast_test_flag(&flags,OPT_NOANSWER)) {
                        /* Otherwise answer unless we're supposed to read while on-hook */
@@ -209,39 +206,30 @@ static int read_exec(struct ast_channel *chan, void *data)
                                }
                                res = 0;
                        } else {
+                               pbx_builtin_setvar_helper(chan, arglist.variable, tmp);
                                if (option_verbose > 2)
                                        ast_verbose(VERBOSE_PREFIX_3 "User disconnected\n");
                        }
                }
        }
-       LOCAL_USER_REMOVE(u);
+       ast_module_user_remove(u);
        return res;
 }
 
-static int unload_module(void *mod)
+static int unload_module(void)
 {
        int res;
 
        res = ast_unregister_application(app);
        
-       STANDARD_HANGUP_LOCALUSERS;
+       ast_module_user_hangup_all();
 
        return res;     
 }
 
-static int load_module(void *mod)
+static int load_module(void)
 {
        return ast_register_application(app, read_exec, synopsis, descrip);
 }
 
-static const char *description(void)
-{
-       return tdesc;
-}
-
-static const char *key(void)
-{
-       return ASTERISK_GPL_KEY;
-}
-
-STD_MOD1;
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Read Variable Application");