Use find_user for existsmailbox
[asterisk/asterisk.git] / apps / app_read.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Trivial application to read a variable
5  * 
6  * Copyright (C) 2003, Digium
7  *
8  * Mark Spencer <markster@digium.com>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13  
14 #include <asterisk/lock.h>
15 #include <asterisk/file.h>
16 #include <asterisk/logger.h>
17 #include <asterisk/channel.h>
18 #include <asterisk/pbx.h>
19 #include <asterisk/app.h>
20 #include <asterisk/module.h>
21 #include <asterisk/translate.h>
22 #include <asterisk/options.h>
23 #include <asterisk/utils.h>
24 #include <string.h>
25 #include <stdlib.h>
26 #include <pthread.h>
27
28 static char *tdesc = "Read Variable Application";
29
30 static char *app = "Read";
31
32 static char *synopsis = "Read a variable";
33
34 static char *descrip = 
35 "  Read(variable[|filename][|maxdigits]):  Reads a #-terminated string of digits from\n"
36 "the user, optionally playing a given filename first.  Returns -1 on hangup or\n"
37 "error and 0 otherwise.\n"
38 "  maxdigits   -- maximum acceptable number of digits. Stops reading after maxdigits\n"
39 "                 have been entered (without requiring the user press the '#' key).\n"
40 "                 Defaults to 0 - no limit - wait for the user press the '#' key.\n"
41 "                 Any value below 0 means the same. Max accepted value is 255.\n";      
42
43 STANDARD_LOCAL_USER;
44
45 LOCAL_USER_DECL;
46
47 static int read_exec(struct ast_channel *chan, void *data)
48 {
49         int res = 0;
50         struct localuser *u;
51         char tmp[256];
52         char *varname;
53         char *filename;
54         char *stringp;
55         char *maxdigitstr;
56         int maxdigits=255;
57         if (!data || ast_strlen_zero((char *)data)) {
58                 ast_log(LOG_WARNING, "Read requires an argument (variable)\n");
59                 return -1;
60         }
61         strncpy(tmp, (char *)data, sizeof(tmp)-1);
62         stringp=(char *)calloc(1,strlen(tmp)+1);
63         snprintf(stringp,strlen(tmp)+1,"%s",tmp);
64         varname = strsep(&stringp, "|");
65         filename = strsep(&stringp, "|");
66         maxdigitstr = strsep(&stringp,"|");
67         if (!(filename) || ast_strlen_zero(filename)) 
68                 filename = NULL;
69         if (maxdigitstr) {
70             maxdigits = atoi(maxdigitstr);
71             if ((maxdigits<1) || (maxdigits>255)) {
72                 maxdigits = 255;
73             } else
74                 ast_verbose(VERBOSE_PREFIX_3 "Accepting a maximum of %i digits.\n", maxdigits);
75         }       
76         if (!(varname) || ast_strlen_zero(varname)) {
77                 ast_log(LOG_WARNING, "Read requires an variable name\n");
78                 return -1;
79         }
80         LOCAL_USER_ADD(u);
81         if (chan->_state != AST_STATE_UP) {
82                 /* Answer if the line isn't up. */
83                 res = ast_answer(chan);
84         }
85         strncpy(tmp, (char *)varname, sizeof(tmp)-1);
86         if (!res) {
87                 ast_stopstream(chan);
88                 res = ast_app_getdata(chan, filename, tmp, maxdigits, 0);
89                 if (!res)
90                         pbx_builtin_setvar_helper(chan, varname, tmp);
91                 ast_verbose(VERBOSE_PREFIX_3 "User entered '%s'\n", tmp);
92         }
93         LOCAL_USER_REMOVE(u);
94         return res;
95 }
96
97 int unload_module(void)
98 {
99         STANDARD_HANGUP_LOCALUSERS;
100         return ast_unregister_application(app);
101 }
102
103 int load_module(void)
104 {
105         return ast_register_application(app, read_exec, synopsis, descrip);
106 }
107
108 char *description(void)
109 {
110         return tdesc;
111 }
112
113 int usecount(void)
114 {
115         int res;
116         STANDARD_USECOUNT(res);
117         return res;
118 }
119
120 char *key()
121 {
122         return ASTERISK_GPL_KEY;
123 }