Mon Oct 8 12:39:08 2012

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 = "ac1f6a56484a8820659555499174e588" , .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 231 of file app_parkandannounce.c.

static void __unreg_module ( void   )  [static]

Definition at line 231 of file app_parkandannounce.c.

static int load_module ( void   )  [static]

Definition at line 225 of file app_parkandannounce.c.

References ast_register_application_xml, and parkandannounce_exec().

00226 {
00227    /* return ast_register_application(app, park_exec); */
00228    return ast_register_application_xml(app, parkandannounce_exec);
00229 }

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

Definition at line 92 of file app_parkandannounce.c.

References __ast_request_and_dial(), ast_channel::_state, args, ARRAY_LEN, AST_APP_ARG, ast_channel_lock, ast_channel_unlock, 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_party_id_copy(), ast_party_id_free(), ast_party_id_init(), ast_say_digits(), AST_STANDARD_APP_ARGS, AST_STATE_UP, ast_stopstream(), ast_strdupa, ast_streamfile(), ast_strlen_zero(), ast_variable_new(), ast_variables_destroy(), 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().

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

static int unload_module ( void   )  [static]

Definition at line 220 of file app_parkandannounce.c.

References ast_unregister_application().

00221 {
00222    return ast_unregister_application(app);
00223 }


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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 231 of file app_parkandannounce.c.

char* app = "ParkAndAnnounce" [static]

Definition at line 90 of file app_parkandannounce.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 231 of file app_parkandannounce.c.


Generated on Mon Oct 8 12:39:08 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7