static int page_exec(struct ast_channel *chan, const char *data)
{
- char *tech, *resource, *tmp;
- char confbridgeopts[128], originator[AST_CHANNEL_NAME];
+ char *tech;
+ char *resource;
+ char *tmp;
+ char *predial_callee = NULL;
+ char confbridgeopts[128];
+ char originator[AST_CHANNEL_NAME];
struct page_options options = { { 0, }, { 0, } };
unsigned int confid = ast_random();
struct ast_app *app;
- int res = 0, pos = 0, i = 0;
+ int res = 0;
+ int pos = 0;
+ int i = 0;
struct ast_dial **dial_list;
unsigned int num_dials;
int timeout = 0;
return -1;
}
+ /* PREDIAL: Preprocess any callee gosub arguments. */
+ if (ast_test_flag(&options.flags, PAGE_PREDIAL_CALLEE)
+ && !ast_strlen_zero(options.opts[OPT_ARG_PREDIAL_CALLEE])) {
+ ast_replace_subargument_delimiter(options.opts[OPT_ARG_PREDIAL_CALLEE]);
+ predial_callee =
+ (char *) ast_app_expand_sub_args(chan, options.opts[OPT_ARG_PREDIAL_CALLEE]);
+ }
+
+ /* PREDIAL: Run gosub on the caller's channel */
if (ast_test_flag(&options.flags, PAGE_PREDIAL_CALLER)
&& !ast_strlen_zero(options.opts[OPT_ARG_PREDIAL_CALLER])) {
ast_replace_subargument_delimiter(options.opts[OPT_ARG_PREDIAL_CALLER]);
/* Set ANSWER_EXEC as global option */
ast_dial_option_global_enable(dial, AST_DIAL_OPTION_ANSWER_EXEC, confbridgeopts);
- if (ast_test_flag(&options.flags, PAGE_PREDIAL_CALLEE)
- && !ast_strlen_zero(options.opts[OPT_ARG_PREDIAL_CALLEE])) {
- ast_dial_option_global_enable(dial, AST_DIAL_OPTION_PREDIAL, options.opts[OPT_ARG_PREDIAL_CALLEE]);
+ if (predial_callee) {
+ ast_dial_option_global_enable(dial, AST_DIAL_OPTION_PREDIAL, predial_callee);
}
if (timeout) {
dial_list[pos++] = dial;
}
+ ast_free(predial_callee);
+
if (!ast_test_flag(&options.flags, PAGE_QUIET)) {
res = ast_streamfile(chan, "beep", ast_channel_language(chan));
if (!res)
ast_channel_unlock(channel->owner);
if (!ast_strlen_zero(predial_string)) {
- const char *predial_callee = ast_app_expand_sub_args(chan, predial_string);
- if (!predial_callee) {
- ast_log(LOG_ERROR, "Could not expand subroutine arguments in predial request '%s'\n", predial_string);
+ if (chan) {
+ ast_autoservice_start(chan);
+ }
+ ast_pre_call(channel->owner, predial_string);
+ if (chan) {
+ ast_autoservice_stop(chan);
}
- ast_autoservice_start(chan);
- ast_pre_call(channel->owner, predial_callee);
- ast_autoservice_stop(chan);
- ast_free((char *) predial_callee);
}
return 0;
int res = -1;
char *predial_string = dial->options[AST_DIAL_OPTION_PREDIAL];
- if (!ast_strlen_zero(predial_string)) {
- ast_replace_subargument_delimiter(predial_string);
- }
-
AST_LIST_LOCK(&dial->channels);
AST_LIST_TRAVERSE(&dial->channels, channel, list) {
if ((res = begin_dial_prerun(channel, chan, cap, predial_string))) {
int success = 0;
char *predial_string = dial->options[AST_DIAL_OPTION_PREDIAL];
- if (!ast_strlen_zero(predial_string)) {
- ast_replace_subargument_delimiter(predial_string);
- }
-
/* Iterate through channel list, requesting and calling each one */
AST_LIST_LOCK(&dial->channels);
AST_LIST_TRAVERSE(&dial->channels, channel, list) {
char *tech = "Local", *device = tmp, *stuff;
char *predial_string = dial->options[AST_DIAL_OPTION_PREDIAL];
- if (!ast_strlen_zero(predial_string)) {
- ast_replace_subargument_delimiter(predial_string);
- }
-
/* If call forwarding is disabled just drop the original channel and don't attempt to dial the new one */
if (FIND_RELATIVE_OPTION(dial, channel, AST_DIAL_OPTION_DISABLE_CALL_FORWARDING)) {
ast_hangup(original);