Trivial application to read a variable. More...
#include "asterisk.h"#include "asterisk/file.h"#include "asterisk/pbx.h"#include "asterisk/channel.h"#include "asterisk/app.h"#include "asterisk/module.h"#include "asterisk/indications.h"
Go to the source code of this file.
Defines | |
| #define | ast_next_data(instr, ptr, delim) if((ptr=strchr(instr,delim))) { *(ptr) = '\0' ; ptr++;} |
Enumerations | |
| enum | { OPT_SKIP = (1 << 0), OPT_INDICATION = (1 << 1), OPT_NOANSWER = (1 << 2) } |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static int | load_module (void) |
| static int | read_exec (struct ast_channel *chan, void *data) |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Read Variable Application" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "0901e4e500243c855563a2d78b0c03e4" , .load = load_module, .unload = unload_module, } |
| static char * | app = "Read" |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static struct ast_app_option | read_app_options [128] = { [ 's' ] = { .flag = OPT_SKIP }, [ 'i' ] = { .flag = OPT_INDICATION }, [ 'n' ] = { .flag = OPT_NOANSWER },} |
| enum { ... } | read_option_flags |
Trivial application to read a variable.
Definition in file app_read.c.
| #define ast_next_data | ( | instr, | |||
| ptr, | |||||
| delim | ) | if((ptr=strchr(instr,delim))) { *(ptr) = '\0' ; ptr++;} |
Definition at line 125 of file app_read.c.
| anonymous enum |
Definition at line 111 of file app_read.c.
00111 { 00112 OPT_SKIP = (1 << 0), 00113 OPT_INDICATION = (1 << 1), 00114 OPT_NOANSWER = (1 << 2), 00115 } read_option_flags;
| static void __reg_module | ( | void | ) | [static] |
Definition at line 281 of file app_read.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 281 of file app_read.c.
| static int load_module | ( | void | ) | [static] |
Definition at line 276 of file app_read.c.
References ast_register_application_xml, and read_exec().
00277 { 00278 return ast_register_application_xml(app, read_exec); 00279 }
| static int read_exec | ( | struct ast_channel * | chan, | |
| void * | data | |||
| ) | [static] |
Definition at line 127 of file app_read.c.
References ast_channel::_state, ast_answer(), AST_APP_ARG, ast_app_getdata(), ast_app_parse_options(), ast_check_hangup(), AST_DECLARE_APP_ARGS, ast_get_indication_tone(), AST_GETDATA_COMPLETE, AST_GETDATA_EMPTY_END_TERMINATED, AST_GETDATA_INTERRUPTED, AST_GETDATA_TIMEOUT, ast_log(), ast_playtones_start(), ast_playtones_stop(), AST_STANDARD_APP_ARGS, AST_STATE_UP, ast_stopstream(), ast_strlen_zero(), ast_test_flag, ast_tone_zone_sound_unref(), ast_verb, ast_waitfordigit(), ast_tone_zone_sound::data, LOG_WARNING, OPT_INDICATION, OPT_NOANSWER, OPT_SKIP, ast_channel::pbx, pbx_builtin_setvar_helper(), read_app_options, ast_pbx::rtimeoutms, status, and ast_channel::zone.
Referenced by load_module().
00128 { 00129 int res = 0; 00130 char tmp[256] = ""; 00131 int maxdigits = 255; 00132 int tries = 1, to = 0, x = 0; 00133 double tosec; 00134 char *argcopy = NULL; 00135 struct ast_tone_zone_sound *ts = NULL; 00136 struct ast_flags flags = {0}; 00137 const char *status = "ERROR"; 00138 00139 AST_DECLARE_APP_ARGS(arglist, 00140 AST_APP_ARG(variable); 00141 AST_APP_ARG(filename); 00142 AST_APP_ARG(maxdigits); 00143 AST_APP_ARG(options); 00144 AST_APP_ARG(attempts); 00145 AST_APP_ARG(timeout); 00146 ); 00147 00148 pbx_builtin_setvar_helper(chan, "READSTATUS", status); 00149 if (ast_strlen_zero(data)) { 00150 ast_log(LOG_WARNING, "Read requires an argument (variable)\n"); 00151 return 0; 00152 } 00153 00154 argcopy = ast_strdupa(data); 00155 00156 AST_STANDARD_APP_ARGS(arglist, argcopy); 00157 00158 if (!ast_strlen_zero(arglist.options)) { 00159 ast_app_parse_options(read_app_options, &flags, NULL, arglist.options); 00160 } 00161 00162 if (!ast_strlen_zero(arglist.attempts)) { 00163 tries = atoi(arglist.attempts); 00164 if (tries <= 0) 00165 tries = 1; 00166 } 00167 00168 if (!ast_strlen_zero(arglist.timeout)) { 00169 tosec = atof(arglist.timeout); 00170 if (tosec <= 0) 00171 to = 0; 00172 else 00173 to = tosec * 1000.0; 00174 } 00175 00176 if (ast_strlen_zero(arglist.filename)) { 00177 arglist.filename = NULL; 00178 } 00179 if (!ast_strlen_zero(arglist.maxdigits)) { 00180 maxdigits = atoi(arglist.maxdigits); 00181 if ((maxdigits < 1) || (maxdigits > 255)) { 00182 maxdigits = 255; 00183 } else 00184 ast_verb(3, "Accepting a maximum of %d digits.\n", maxdigits); 00185 } 00186 if (ast_strlen_zero(arglist.variable)) { 00187 ast_log(LOG_WARNING, "Invalid! Usage: Read(variable[,filename][,maxdigits][,option][,attempts][,timeout])\n\n"); 00188 return 0; 00189 } 00190 if (ast_test_flag(&flags, OPT_INDICATION)) { 00191 if (!ast_strlen_zero(arglist.filename)) { 00192 ts = ast_get_indication_tone(chan->zone, arglist.filename); 00193 } 00194 } 00195 if (chan->_state != AST_STATE_UP) { 00196 if (ast_test_flag(&flags, OPT_SKIP)) { 00197 /* At the user's option, skip if the line is not up */ 00198 pbx_builtin_setvar_helper(chan, arglist.variable, ""); 00199 pbx_builtin_setvar_helper(chan, "READSTATUS", "SKIPPED"); 00200 return 0; 00201 } else if (!ast_test_flag(&flags, OPT_NOANSWER)) { 00202 /* Otherwise answer unless we're supposed to read while on-hook */ 00203 res = ast_answer(chan); 00204 } 00205 } 00206 if (!res) { 00207 while (tries && !res) { 00208 ast_stopstream(chan); 00209 if (ts && ts->data[0]) { 00210 if (!to) 00211 to = chan->pbx ? chan->pbx->rtimeoutms : 6000; 00212 res = ast_playtones_start(chan, 0, ts->data, 0); 00213 for (x = 0; x < maxdigits; ) { 00214 res = ast_waitfordigit(chan, to); 00215 ast_playtones_stop(chan); 00216 if (res < 1) { 00217 if (res == 0) 00218 status = "TIMEOUT"; 00219 tmp[x]='\0'; 00220 break; 00221 } 00222 tmp[x++] = res; 00223 if (tmp[x-1] == '#') { 00224 tmp[x-1] = '\0'; 00225 status = "OK"; 00226 break; 00227 } 00228 if (x >= maxdigits) { 00229 status = "OK"; 00230 } 00231 } 00232 } else { 00233 res = ast_app_getdata(chan, arglist.filename, tmp, maxdigits, to); 00234 if (res == AST_GETDATA_COMPLETE || res == AST_GETDATA_EMPTY_END_TERMINATED) 00235 status = "OK"; 00236 else if (res == AST_GETDATA_TIMEOUT) 00237 status = "TIMEOUT"; 00238 else if (res == AST_GETDATA_INTERRUPTED) 00239 status = "INTERRUPTED"; 00240 } 00241 if (res > -1) { 00242 pbx_builtin_setvar_helper(chan, arglist.variable, tmp); 00243 if (!ast_strlen_zero(tmp)) { 00244 ast_verb(3, "User entered '%s'\n", tmp); 00245 tries = 0; 00246 } else { 00247 tries--; 00248 if (tries) 00249 ast_verb(3, "User entered nothing, %d chance%s left\n", tries, (tries != 1) ? "s" : ""); 00250 else 00251 ast_verb(3, "User entered nothing.\n"); 00252 } 00253 res = 0; 00254 } else { 00255 pbx_builtin_setvar_helper(chan, arglist.variable, tmp); 00256 ast_verb(3, "User disconnected\n"); 00257 } 00258 } 00259 } 00260 00261 if (ts) { 00262 ts = ast_tone_zone_sound_unref(ts); 00263 } 00264 00265 if (ast_check_hangup(chan)) 00266 status = "HANGUP"; 00267 pbx_builtin_setvar_helper(chan, "READSTATUS", status); 00268 return 0; 00269 }
| static int unload_module | ( | void | ) | [static] |
Definition at line 271 of file app_read.c.
References ast_unregister_application().
00272 { 00273 return ast_unregister_application(app); 00274 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Read Variable Application" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "0901e4e500243c855563a2d78b0c03e4" , .load = load_module, .unload = unload_module, } [static] |
Definition at line 281 of file app_read.c.
char* app = "Read" [static] |
Definition at line 123 of file app_read.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 281 of file app_read.c.
struct ast_app_option read_app_options[128] = { [ 's' ] = { .flag = OPT_SKIP }, [ 'i' ] = { .flag = OPT_INDICATION }, [ 'n' ] = { .flag = OPT_NOANSWER },} [static] |
Definition at line 121 of file app_read.c.
Referenced by read_exec().
| enum { ... } read_option_flags |
1.6.2