#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_info * | ast_module_info = &__mod_info |
Definition in file app_parkandannounce.c.
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 }
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.