Fri Jun 19 12:10:01 2009

Asterisk developer's documentation


app_readexten.c File Reference

Trivial application to read an extension into a variable. More...

#include "asterisk.h"
#include "asterisk/file.h"
#include "asterisk/pbx.h"
#include "asterisk/app.h"
#include "asterisk/module.h"
#include "asterisk/indications.h"
#include "asterisk/channel.h"

Go to the source code of this file.

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 acf_isexten_exec (struct ast_channel *chan, const char *cmd, char *parse, char *buffer, size_t buflen)
static int load_module (void)
static int readexten_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 and evaluate extension validity" , .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 = "a9c98e5d177805051735cb5b0b16b0a0" , .load = load_module, .unload = unload_module, }
static struct ast_custom_function acf_isexten
static char * app = "ReadExten"
static struct ast_module_infoast_module_info = &__mod_info
static char * descrip
static struct ast_app_option readexten_app_options [128] = { [ 's' ] = { .flag = OPT_SKIP }, [ 'i' ] = { .flag = OPT_INDICATION }, [ 'n' ] = { .flag = OPT_NOANSWER },}
enum { ... }  readexten_option_flags
static char * synopsis = "Read an extension into a variable"


Detailed Description

Trivial application to read an extension into a variable.

Author:
David Chappell <David.Chappell@trincoll.edu>

Definition in file app_readexten.c.


Enumeration Type Documentation

anonymous enum

Enumerator:
OPT_SKIP 
OPT_INDICATION 
OPT_NOANSWER 

Definition at line 39 of file app_readexten.c.

00039      {
00040    OPT_SKIP = (1 << 0),
00041    OPT_INDICATION = (1 << 1),
00042    OPT_NOANSWER = (1 << 2),
00043 } readexten_option_flags;


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 259 of file app_readexten.c.

static void __unreg_module ( void   )  [static]

Definition at line 259 of file app_readexten.c.

static int acf_isexten_exec ( struct ast_channel chan,
const char *  cmd,
char *  parse,
char *  buffer,
size_t  buflen 
) [static]

Definition at line 202 of file app_readexten.c.

References AST_APP_ARG, ast_copy_string(), AST_DECLARE_APP_ARGS, ast_exists_extension(), ast_log(), AST_STANDARD_APP_ARGS, ast_strlen_zero(), chan, ast_channel::cid, ast_callerid::cid_num, ast_channel::context, context, and LOG_WARNING.

00203 {
00204    int priority_int;
00205    AST_DECLARE_APP_ARGS(args,
00206       AST_APP_ARG(context);
00207       AST_APP_ARG(extension);
00208       AST_APP_ARG(priority);
00209    );
00210 
00211    AST_STANDARD_APP_ARGS(args, parse);
00212 
00213    if (ast_strlen_zero(args.context))
00214       args.context = chan->context;
00215 
00216    if (ast_strlen_zero(args.extension)) {
00217       ast_log(LOG_WARNING, "Syntax: VALID_EXTEN([<context>],<extension>[,<priority>]) - missing argument <extension>!\n");
00218       return -1;
00219    }
00220 
00221    if (ast_strlen_zero(args.priority))
00222       priority_int = 1;
00223    else
00224       priority_int = atoi(args.priority);
00225 
00226    if (ast_exists_extension(chan, args.context, args.extension, priority_int, chan->cid.cid_num))
00227        ast_copy_string(buffer, "1", buflen);
00228    else
00229        ast_copy_string(buffer, "0", buflen);
00230 
00231    return 0;
00232 }

static int load_module ( void   )  [static]

Definition at line 252 of file app_readexten.c.

References acf_isexten, ast_custom_function_register, ast_register_application, and readexten_exec().

00253 {
00254    int res = ast_register_application(app, readexten_exec, synopsis, descrip);
00255    res |= ast_custom_function_register(&acf_isexten);
00256    return res;
00257 }

static int readexten_exec ( struct ast_channel chan,
void *  data 
) [static]

Definition at line 75 of file app_readexten.c.

References ast_channel::_state, ast_answer(), AST_APP_ARG, ast_app_parse_options(), ast_check_hangup(), ast_debug, AST_DECLARE_APP_ARGS, ast_exists_extension(), ast_get_indication_tone(), ast_log(), ast_matchmore_extension(), ast_playtones_start(), ast_playtones_stop(), AST_STANDARD_APP_ARGS, AST_STATE_UP, ast_stopstream(), ast_strdupa, ast_streamfile(), ast_strlen_zero(), ast_test_flag, ast_waitfordigit(), chan, ast_channel::cid, ast_callerid::cid_num, ast_channel::context, context, tone_zone_sound::data, ast_pbx::dtimeoutms, exten, ast_flags::flags, ast_channel::language, LOG_WARNING, ast_channel::name, OPT_INDICATION, OPT_NOANSWER, OPT_SKIP, ast_channel::pbx, pbx_builtin_setvar_helper(), ast_pbx::rtimeoutms, status, and ast_channel::zone.

Referenced by load_module().

00076 {
00077    int res = 0;
00078    char exten[256] = "";
00079    int maxdigits = sizeof(exten) - 1;
00080    int timeout = 0, digit_timeout = 0, x = 0;
00081    char *argcopy = NULL, *status = "";
00082    struct tone_zone_sound *ts = NULL;
00083    struct ast_flags flags = {0};
00084 
00085     AST_DECLARE_APP_ARGS(arglist,
00086       AST_APP_ARG(variable);
00087       AST_APP_ARG(filename);
00088       AST_APP_ARG(context);
00089       AST_APP_ARG(options);
00090       AST_APP_ARG(timeout);
00091    );
00092    
00093    if (ast_strlen_zero(data)) {
00094       ast_log(LOG_WARNING, "ReadExten requires at least one argument\n");
00095       pbx_builtin_setvar_helper(chan, "READEXTENSTATUS", "ERROR");
00096       return 0;
00097    }
00098 
00099    argcopy = ast_strdupa(data);
00100    AST_STANDARD_APP_ARGS(arglist, argcopy);
00101 
00102    if (ast_strlen_zero(arglist.variable)) {
00103       ast_log(LOG_WARNING, "Invalid! Usage: ReadExten(variable[|filename][|context][|options][|timeout])\n\n");
00104       pbx_builtin_setvar_helper(chan, "READEXTENSTATUS", "ERROR");
00105       return 0;
00106    }
00107 
00108    if (ast_strlen_zero(arglist.filename))
00109       arglist.filename = NULL;
00110 
00111    if (ast_strlen_zero(arglist.context))
00112       arglist.context = chan->context;
00113 
00114    if (!ast_strlen_zero(arglist.options))
00115       ast_app_parse_options(readexten_app_options, &flags, NULL, arglist.options);
00116 
00117    if (!ast_strlen_zero(arglist.timeout)) {
00118       timeout = atoi(arglist.timeout);
00119       if (timeout > 0)
00120          timeout *= 1000;
00121    }
00122 
00123    if (timeout <= 0)
00124       timeout = chan->pbx ? chan->pbx->rtimeoutms : 10000;
00125 
00126    if (digit_timeout <= 0)
00127       digit_timeout = chan->pbx ? chan->pbx->dtimeoutms : 5000;
00128 
00129    if (ast_test_flag(&flags, OPT_INDICATION) && !ast_strlen_zero(arglist.filename))
00130       ts = ast_get_indication_tone(chan->zone, arglist.filename);
00131 
00132    do {
00133       if (chan->_state != AST_STATE_UP) {
00134          if (ast_test_flag(&flags, OPT_SKIP)) {
00135             /* At the user's option, skip if the line is not up */
00136             pbx_builtin_setvar_helper(chan, arglist.variable, "");
00137             status = "SKIP";
00138             break;
00139          } else if (!ast_test_flag(&flags, OPT_NOANSWER)) {
00140             /* Otherwise answer unless we're supposed to read while on-hook */
00141             res = ast_answer(chan);
00142          }
00143       }
00144 
00145       if (res < 0) {
00146          status = "HANGUP";
00147          break;
00148       }
00149 
00150       ast_playtones_stop(chan);
00151       ast_stopstream(chan);
00152 
00153       if (ts && ts->data[0])
00154          res = ast_playtones_start(chan, 0, ts->data, 0);
00155       else if (arglist.filename)
00156          res = ast_streamfile(chan, arglist.filename, chan->language);
00157 
00158       for (x = 0; x < maxdigits; x++) {
00159          ast_debug(3, "extension so far: '%s', timeout: %d\n", exten, timeout);
00160          res = ast_waitfordigit(chan, timeout);
00161 
00162          ast_playtones_stop(chan);
00163          ast_stopstream(chan);
00164          timeout = digit_timeout;
00165 
00166          if (res < 1) {    /* timeout expired or hangup */
00167             if (ast_check_hangup(chan))
00168                status = "HANGUP";
00169             else
00170                status = "TIMEOUT";
00171             break;
00172          }
00173 
00174          exten[x] = res;
00175          if (!ast_matchmore_extension(chan, arglist.context, exten, 1 /* priority */, chan->cid.cid_num)) {
00176             if (!ast_exists_extension(chan, arglist.context, exten, 1, chan->cid.cid_num) && res == '#') {
00177                exten[x] = '\0';
00178             }
00179             break;
00180          }
00181       }
00182 
00183       if (!ast_strlen_zero(status))
00184          break;
00185 
00186       if (ast_exists_extension(chan, arglist.context, exten, 1, chan->cid.cid_num)) {
00187          ast_debug(3, "User entered valid extension '%s'\n", exten);
00188          pbx_builtin_setvar_helper(chan, arglist.variable, exten);
00189          status = "OK";
00190       } else {
00191          ast_debug(3, "User dialed invalid extension '%s' in context '%s' on %s\n", exten, arglist.context, chan->name);
00192          pbx_builtin_setvar_helper(chan, "INVALID_EXTEN", exten);
00193          status = "INVALID";
00194       }
00195    } while (0);
00196 
00197    pbx_builtin_setvar_helper(chan, "READEXTENSTATUS", status);
00198 
00199    return status[0] == 'H' ? -1 : 0;
00200 }

static int unload_module ( void   )  [static]

Definition at line 244 of file app_readexten.c.

References acf_isexten, ast_custom_function_unregister(), and ast_unregister_application().

00245 {
00246    int res = ast_unregister_application(app);
00247    res |= ast_custom_function_unregister(&acf_isexten);
00248 
00249    return res; 
00250 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Read and evaluate extension validity" , .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 = "a9c98e5d177805051735cb5b0b16b0a0" , .load = load_module, .unload = unload_module, } [static]

Definition at line 259 of file app_readexten.c.

struct ast_custom_function acf_isexten [static]

Definition at line 234 of file app_readexten.c.

Referenced by load_module(), and unload_module().

char* app = "ReadExten" [static]

Definition at line 51 of file app_readexten.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 259 of file app_readexten.c.

char* descrip [static]

Definition at line 55 of file app_readexten.c.

struct ast_app_option readexten_app_options[128] = { [ 's' ] = { .flag = OPT_SKIP }, [ 'i' ] = { .flag = OPT_INDICATION }, [ 'n' ] = { .flag = OPT_NOANSWER },} [static]

Definition at line 49 of file app_readexten.c.

enum { ... } readexten_option_flags

char* synopsis = "Read an extension into a variable" [static]

Definition at line 53 of file app_readexten.c.


Generated on Fri Jun 19 12:10:01 2009 for Asterisk - the Open Source PBX by  doxygen 1.4.7