Fri Nov 12 11:50:47 2010

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

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, void *data)
static int unload_module (void)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .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 = "0901e4e500243c855563a2d78b0c03e4" , .load = load_module, .unload = unload_module, }
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>
  • With TONS of help from Mark!

Definition in file app_parkandannounce.c.


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 209 of file app_parkandannounce.c.

static void __unreg_module ( void   )  [static]

Definition at line 209 of file app_parkandannounce.c.

static int load_module ( void   )  [static]

Definition at line 203 of file app_parkandannounce.c.

References ast_register_application_xml, and parkandannounce_exec().

00204 {
00205    /* return ast_register_application(app, park_exec); */
00206    return ast_register_application_xml(app, parkandannounce_exec);
00207 }

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

Definition at line 88 of file app_parkandannounce.c.

References __ast_request_and_dial(), ast_channel::_state, 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_streamfile(), ast_strlen_zero(), ast_variable_new(), ast_verb, ast_waitstream(), buf, ast_channel::cid, ast_callerid::cid_name, ast_callerid::cid_num, ast_channel::context, ast_channel::exten, ast_channel::language, LOG_WARNING, ast_channel::name, outgoing_helper::parent_channel, ast_channel::priority, s, ast_dial::timeout, 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, chan->priority, chan->cid.cid_num);
00130       if (!ast_exists_extension(chan, chan->context, chan->exten, chan->priority, chan->cid.cid_num)) {
00131       ast_verb(3, "Warning: Return Context Invalid, call will return to default|s\n");
00132       }
00133 
00134    /* we are using masq_park here to protect * from touching the channel once we park it.  If the channel comes out of timeout
00135    before we are done announcing and the channel is messed with, Kablooeee.  So we use Masq to prevent this.  */
00136 
00137    res = ast_masq_park_call(chan, NULL, timeout, &lot);
00138    if (res == -1)
00139       return res;
00140 
00141    ast_verb(3, "Call Parking Called, lot: %d, timeout: %d, context: %s\n", lot, timeout, args.return_context);
00142 
00143    /* Now place the call to the extension */
00144 
00145    snprintf(buf, sizeof(buf), "%d", lot);
00146    oh.parent_channel = chan;
00147    oh.vars = ast_variable_new("_PARKEDAT", buf, "");
00148    dchan = __ast_request_and_dial(dialtech, AST_FORMAT_SLINEAR, args.dial, 30000, &outstate, chan->cid.cid_num, chan->cid.cid_name, &oh);
00149 
00150    if (dchan) {
00151       if (dchan->_state == AST_STATE_UP) {
00152          ast_verb(4, "Channel %s was answered.\n", dchan->name);
00153       } else {
00154          ast_verb(4, "Channel %s was never answered.\n", dchan->name);
00155          ast_log(LOG_WARNING, "PARK: Channel %s was never answered for the announce.\n", dchan->name);
00156          ast_hangup(dchan);
00157          return -1;
00158       }
00159    } else {
00160       ast_log(LOG_WARNING, "PARK: Unable to allocate announce channel.\n");
00161       return -1; 
00162    }
00163 
00164    ast_stopstream(dchan);
00165 
00166    /* now we have the call placed and are ready to play stuff to it */
00167 
00168    ast_verb(4, "Announce Template:%s\n", args.template);
00169 
00170    for (looptemp = 0; looptemp < ARRAY_LEN(tmp); looptemp++) {
00171       if ((tmp[looptemp] = strsep(&args.template, ":")) != NULL)
00172          continue;
00173       else
00174          break;
00175    }
00176 
00177    for (i = 0; i < looptemp; i++) {
00178       ast_verb(4, "Announce:%s\n", tmp[i]);
00179       if (!strcmp(tmp[i], "PARKED")) {
00180          ast_say_digits(dchan, lot, "", dchan->language);
00181       } else {
00182          dres = ast_streamfile(dchan, tmp[i], dchan->language);
00183          if (!dres) {
00184             dres = ast_waitstream(dchan, "");
00185          } else {
00186             ast_log(LOG_WARNING, "ast_streamfile of %s failed on %s\n", tmp[i], dchan->name);
00187             dres = 0;
00188          }
00189       }
00190    }
00191 
00192    ast_stopstream(dchan);  
00193    ast_hangup(dchan);
00194    
00195    return res;
00196 }

static int unload_module ( void   )  [static]

Definition at line 198 of file app_parkandannounce.c.

References ast_unregister_application().

00199 {
00200    return ast_unregister_application(app);
00201 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .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 = "0901e4e500243c855563a2d78b0c03e4" , .load = load_module, .unload = unload_module, } [static]

Definition at line 209 of file app_parkandannounce.c.

char* app = "ParkAndAnnounce" [static]

Definition at line 86 of file app_parkandannounce.c.

Definition at line 209 of file app_parkandannounce.c.


Generated by  doxygen 1.6.2