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, 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_info * | ast_module_info = &__mod_info |
ParkAndAnnounce application for Asterisk.
Definition in file app_parkandannounce.c.
| 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 }
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.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 209 of file app_parkandannounce.c.
1.6.2