Wed Apr 6 11:29:50 2011

Asterisk developer's documentation


app_parkandannounce.c File Reference

ParkAndAnnounce application for Asterisk. More...

#include "asterisk.h"
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/features.h"
#include "asterisk/say.h"
#include "asterisk/lock.h"
#include "asterisk/utils.h"
#include "asterisk/app.h"

Go to the source code of this file.

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int load_module (void)
static int parkandannounce_exec (struct ast_channel *chan, const char *data)
static int unload_module (void)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Call Parking and Announce 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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static char * app = "ParkAndAnnounce"
static struct ast_module_infoast_module_info = &__mod_info


Detailed Description

ParkAndAnnounce application for Asterisk.

Author:
Ben Miller <bgmiller@dccinc.com>

Definition in file app_parkandannounce.c.


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 215 of file app_parkandannounce.c.

static void __unreg_module ( void   )  [static]

Definition at line 215 of file app_parkandannounce.c.

static int load_module ( void   )  [static]

Definition at line 209 of file app_parkandannounce.c.

References ast_register_application_xml, and parkandannounce_exec().

00210 {
00211    /* return ast_register_application(app, park_exec); */
00212    return ast_register_application_xml(app, parkandannounce_exec);
00213 }

static int parkandannounce_exec ( struct ast_channel chan,
const char *  data 
) [static]

Definition at line 88 of file app_parkandannounce.c.

References __ast_request_and_dial(), ast_channel::_state, args, ARRAY_LEN, AST_APP_ARG, ast_clear_flag, AST_DECLARE_APP_ARGS, ast_exists_extension(), AST_FLAG_IN_AUTOLOOP, AST_FORMAT_SLINEAR, ast_hangup(), ast_log(), ast_masq_park_call(), ast_parseable_goto(), ast_say_digits(), AST_STANDARD_APP_ARGS, AST_STATE_UP, ast_stopstream(), ast_strdupa, ast_streamfile(), ast_strlen_zero(), ast_variable_new(), ast_verb, ast_waitstream(), ast_channel::caller, ast_channel::context, ast_channel::exten, ast_party_caller::id, ast_channel::language, LOG_WARNING, ast_channel::name, ast_party_id::name, ast_party_id::number, outgoing_helper::parent_channel, ast_channel::priority, S_COR, ast_party_name::str, ast_party_number::str, strsep(), ast_dial::timeout, ast_party_name::valid, ast_party_number::valid, and outgoing_helper::vars.

Referenced by load_module().

00089 {
00090    int res = -1;
00091    int lot, timeout = 0, dres;
00092    char *dialtech, *tmp[100], buf[13];
00093    int looptemp, i;
00094    char *s;
00095 
00096    struct ast_channel *dchan;
00097    struct outgoing_helper oh = { 0, };
00098    int outstate;
00099    AST_DECLARE_APP_ARGS(args,
00100       AST_APP_ARG(template);
00101       AST_APP_ARG(timeout);
00102       AST_APP_ARG(dial);
00103       AST_APP_ARG(return_context);
00104    );
00105    if (ast_strlen_zero(data)) {
00106       ast_log(LOG_WARNING, "ParkAndAnnounce requires arguments: (announce:template|timeout|dial|[return_context])\n");
00107       return -1;
00108    }
00109   
00110    s = ast_strdupa(data);
00111    AST_STANDARD_APP_ARGS(args, s);
00112 
00113    if (args.timeout)
00114       timeout = atoi(args.timeout) * 1000;
00115 
00116    if (ast_strlen_zero(args.dial)) {
00117       ast_log(LOG_WARNING, "PARK: A dial resource must be specified i.e: Console/dsp or DAHDI/g1/5551212\n");
00118       return -1;
00119    }
00120 
00121    dialtech = strsep(&args.dial, "/");
00122    ast_verb(3, "Dial Tech,String: (%s,%s)\n", dialtech, args.dial);
00123 
00124    if (!ast_strlen_zero(args.return_context)) {
00125       ast_clear_flag(chan, AST_FLAG_IN_AUTOLOOP);
00126       ast_parseable_goto(chan, args.return_context);
00127    }
00128 
00129    ast_verb(3, "Return Context: (%s,%s,%d) ID: %s\n", chan->context, chan->exten,
00130       chan->priority,
00131       S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, ""));
00132    if (!ast_exists_extension(chan, chan->context, chan->exten, chan->priority,
00133       S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL))) {
00134       ast_verb(3, "Warning: Return Context Invalid, call will return to default|s\n");
00135    }
00136 
00137    /* we are using masq_park here to protect * from touching the channel once we park it.  If the channel comes out of timeout
00138    before we are done announcing and the channel is messed with, Kablooeee.  So we use Masq to prevent this.  */
00139 
00140    res = ast_masq_park_call(chan, NULL, timeout, &lot);
00141    if (res == -1)
00142       return res;
00143 
00144    ast_verb(3, "Call Parking Called, lot: %d, timeout: %d, context: %s\n", lot, timeout, args.return_context);
00145 
00146    /* Now place the call to the extension */
00147 
00148    snprintf(buf, sizeof(buf), "%d", lot);
00149    oh.parent_channel = chan;
00150    oh.vars = ast_variable_new("_PARKEDAT", buf, "");
00151    dchan = __ast_request_and_dial(dialtech, AST_FORMAT_SLINEAR, chan, args.dial, 30000,
00152       &outstate,
00153       S_COR(chan->caller.id.number.valid, chan->caller.id.number.str, NULL),
00154       S_COR(chan->caller.id.name.valid, chan->caller.id.name.str, NULL),
00155       &oh);
00156    if (dchan) {
00157       if (dchan->_state == AST_STATE_UP) {
00158          ast_verb(4, "Channel %s was answered.\n", dchan->name);
00159       } else {
00160          ast_verb(4, "Channel %s was never answered.\n", dchan->name);
00161          ast_log(LOG_WARNING, "PARK: Channel %s was never answered for the announce.\n", dchan->name);
00162          ast_hangup(dchan);
00163          return -1;
00164       }
00165    } else {
00166       ast_log(LOG_WARNING, "PARK: Unable to allocate announce channel.\n");
00167       return -1; 
00168    }
00169 
00170    ast_stopstream(dchan);
00171 
00172    /* now we have the call placed and are ready to play stuff to it */
00173 
00174    ast_verb(4, "Announce Template:%s\n", args.template);
00175 
00176    for (looptemp = 0; looptemp < ARRAY_LEN(tmp); looptemp++) {
00177       if ((tmp[looptemp] = strsep(&args.template, ":")) != NULL)
00178          continue;
00179       else
00180          break;
00181    }
00182 
00183    for (i = 0; i < looptemp; i++) {
00184       ast_verb(4, "Announce:%s\n", tmp[i]);
00185       if (!strcmp(tmp[i], "PARKED")) {
00186          ast_say_digits(dchan, lot, "", dchan->language);
00187       } else {
00188          dres = ast_streamfile(dchan, tmp[i], dchan->language);
00189          if (!dres) {
00190             dres = ast_waitstream(dchan, "");
00191          } else {
00192             ast_log(LOG_WARNING, "ast_streamfile of %s failed on %s\n", tmp[i], dchan->name);
00193             dres = 0;
00194          }
00195       }
00196    }
00197 
00198    ast_stopstream(dchan);  
00199    ast_hangup(dchan);
00200    
00201    return res;
00202 }

static int unload_module ( void   )  [static]

Definition at line 204 of file app_parkandannounce.c.

References ast_unregister_application().

00205 {
00206    return ast_unregister_application(app);
00207 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Call Parking and Announce 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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 215 of file app_parkandannounce.c.

char* app = "ParkAndAnnounce" [static]

Definition at line 86 of file app_parkandannounce.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 215 of file app_parkandannounce.c.


Generated on Wed Apr 6 11:29:50 2011 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7