Fri Nov 12 11:51:11 2010

Asterisk developer's documentation


app_read.c File Reference

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"
Include dependency graph for app_read.c:

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_infoast_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

Detailed Description

Trivial application to read a variable.

Author:
Mark Spencer <markster@digium.com>

Definition in file app_read.c.


Define Documentation

#define ast_next_data ( instr,
ptr,
delim   )     if((ptr=strchr(instr,delim))) { *(ptr) = '\0' ; ptr++;}

Definition at line 125 of file app_read.c.


Enumeration Type Documentation

anonymous enum
Enumerator:
OPT_SKIP 
OPT_INDICATION 
OPT_NOANSWER 

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;


Function Documentation

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 }


Variable Documentation

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.

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

Generated by  doxygen 1.6.2