|
|
|
@ -25,6 +25,7 @@
|
|
|
|
|
#include <asterisk/musiconhold.h>
|
|
|
|
|
#include <asterisk/callerid.h>
|
|
|
|
|
#include <asterisk/utils.h>
|
|
|
|
|
#include <asterisk/app.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
@ -467,96 +468,92 @@ static int dial_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
|
|
|
|
|
/* DTMF SCRIPT*/
|
|
|
|
|
if ((sdtmfptr = strstr(transfer, "D("))) {
|
|
|
|
|
strncpy(sdtmfdata, sdtmfptr + 2, sizeof(sdtmfdata) - 1);
|
|
|
|
|
/* Overwrite with X's what was the sdtmf info */
|
|
|
|
|
while(*sdtmfptr && (*sdtmfptr != ')'))
|
|
|
|
|
*(sdtmfptr++) = 'X';
|
|
|
|
|
if (*sdtmfptr)
|
|
|
|
|
*sdtmfptr = 'X';
|
|
|
|
|
/* Now find the end */
|
|
|
|
|
sdtmfptr = strchr(sdtmfdata, ')');
|
|
|
|
|
if (sdtmfptr)
|
|
|
|
|
*sdtmfptr = '\0';
|
|
|
|
|
else {
|
|
|
|
|
ast_log(LOG_WARNING, "D( Data lacking trailing ')'\n");
|
|
|
|
|
}
|
|
|
|
|
strncpy(sdtmfdata, sdtmfptr + 2, sizeof(sdtmfdata) - 1);
|
|
|
|
|
/* Overwrite with X's what was the sdtmf info */
|
|
|
|
|
while (*sdtmfptr && (*sdtmfptr != ')'))
|
|
|
|
|
*(sdtmfptr++) = 'X';
|
|
|
|
|
if (*sdtmfptr)
|
|
|
|
|
*sdtmfptr = 'X';
|
|
|
|
|
/* Now find the end */
|
|
|
|
|
sdtmfptr = strchr(sdtmfdata, ')');
|
|
|
|
|
if (sdtmfptr)
|
|
|
|
|
*sdtmfptr = '\0';
|
|
|
|
|
else
|
|
|
|
|
ast_log(LOG_WARNING, "D( Data lacking trailing ')'\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* XXX LIMIT SUPPORT */
|
|
|
|
|
if ((limitptr = strstr(transfer, "L("))) {
|
|
|
|
|
strncpy(limitdata, limitptr + 2, sizeof(limitdata) - 1);
|
|
|
|
|
/* Overwrite with X's what was the limit info */
|
|
|
|
|
while(*limitptr && (*limitptr != ')'))
|
|
|
|
|
*(limitptr++) = 'X';
|
|
|
|
|
if (*limitptr)
|
|
|
|
|
*limitptr = 'X';
|
|
|
|
|
/* Now find the end */
|
|
|
|
|
limitptr = strchr(limitdata, ')');
|
|
|
|
|
if (limitptr)
|
|
|
|
|
*limitptr = '\0';
|
|
|
|
|
else {
|
|
|
|
|
ast_log(LOG_WARNING, "Limit Data lacking trailing ')'\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var = pbx_builtin_getvar_helper(chan,"LIMIT_PLAYAUDIO_CALLER");
|
|
|
|
|
play_to_caller = var ? ast_true(var) : 1;
|
|
|
|
|
|
|
|
|
|
var = pbx_builtin_getvar_helper(chan,"LIMIT_PLAYAUDIO_CALLEE");
|
|
|
|
|
play_to_callee = var ? ast_true(var) : 0;
|
|
|
|
|
|
|
|
|
|
if(! play_to_caller && ! play_to_callee)
|
|
|
|
|
play_to_caller=1;
|
|
|
|
|
|
|
|
|
|
var = pbx_builtin_getvar_helper(chan,"LIMIT_WARNING_FILE");
|
|
|
|
|
warning_sound = var ? var : "timeleft";
|
|
|
|
|
|
|
|
|
|
var = pbx_builtin_getvar_helper(chan,"LIMIT_TIMEOUT_FILE");
|
|
|
|
|
end_sound = var ? var : NULL;
|
|
|
|
|
strncpy(limitdata, limitptr + 2, sizeof(limitdata) - 1);
|
|
|
|
|
/* Overwrite with X's what was the limit info */
|
|
|
|
|
while(*limitptr && (*limitptr != ')'))
|
|
|
|
|
*(limitptr++) = 'X';
|
|
|
|
|
if (*limitptr)
|
|
|
|
|
*limitptr = 'X';
|
|
|
|
|
/* Now find the end */
|
|
|
|
|
limitptr = strchr(limitdata, ')');
|
|
|
|
|
if (limitptr)
|
|
|
|
|
*limitptr = '\0';
|
|
|
|
|
else
|
|
|
|
|
ast_log(LOG_WARNING, "Limit Data lacking trailing ')'\n");
|
|
|
|
|
|
|
|
|
|
var = pbx_builtin_getvar_helper(chan,"LIMIT_PLAYAUDIO_CALLER");
|
|
|
|
|
play_to_caller = var ? ast_true(var) : 1;
|
|
|
|
|
|
|
|
|
|
var = pbx_builtin_getvar_helper(chan,"LIMIT_CONNECT_FILE");
|
|
|
|
|
start_sound = var ? var : NULL;
|
|
|
|
|
var = pbx_builtin_getvar_helper(chan,"LIMIT_PLAYAUDIO_CALLEE");
|
|
|
|
|
play_to_callee = var ? ast_true(var) : 0;
|
|
|
|
|
|
|
|
|
|
var=stack=limitdata;
|
|
|
|
|
|
|
|
|
|
var = strsep(&stack, ":");
|
|
|
|
|
if(var) {
|
|
|
|
|
timelimit = atol(var);
|
|
|
|
|
playargs++;
|
|
|
|
|
var = strsep(&stack, ":");
|
|
|
|
|
if(var) {
|
|
|
|
|
play_warning = atol(var);
|
|
|
|
|
playargs++;
|
|
|
|
|
var = strsep(&stack, ":");
|
|
|
|
|
if(var) {
|
|
|
|
|
warning_freq = atol(var);
|
|
|
|
|
playargs++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!play_to_caller && !play_to_callee)
|
|
|
|
|
play_to_caller=1;
|
|
|
|
|
|
|
|
|
|
if(! timelimit) {
|
|
|
|
|
timelimit=play_to_caller=play_to_callee=play_warning=warning_freq=0;
|
|
|
|
|
warning_sound=NULL;
|
|
|
|
|
}
|
|
|
|
|
/* undo effect of S(x) in case they are both used */
|
|
|
|
|
calldurationlimit=0;
|
|
|
|
|
/* more efficient do it like S(x) does since no advanced opts*/
|
|
|
|
|
if(! play_warning && ! start_sound && ! end_sound && timelimit) {
|
|
|
|
|
calldurationlimit=timelimit/1000;
|
|
|
|
|
timelimit=play_to_caller=play_to_callee=play_warning=warning_freq=0;
|
|
|
|
|
}
|
|
|
|
|
else if (option_verbose > 2) {
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"Limit Data:\n");
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"timelimit=%ld\n",timelimit);
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"play_warning=%ld\n",play_warning);
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"play_to_caller=%s\n",play_to_caller ? "yes" : "no");
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"play_to_callee=%s\n",play_to_callee ? "yes" : "no");
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"warning_freq=%ld\n",warning_freq);
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"start_sound=%s\n",start_sound ? start_sound : "UNDEF");
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"warning_sound=%s\n",warning_sound ? warning_sound : "UNDEF");
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"end_sound=%s\n",end_sound ? end_sound : "UNDEF");
|
|
|
|
|
}
|
|
|
|
|
var = pbx_builtin_getvar_helper(chan,"LIMIT_WARNING_FILE");
|
|
|
|
|
warning_sound = var ? var : "timeleft";
|
|
|
|
|
|
|
|
|
|
var = pbx_builtin_getvar_helper(chan,"LIMIT_TIMEOUT_FILE");
|
|
|
|
|
end_sound = var ? var : NULL;
|
|
|
|
|
|
|
|
|
|
var = pbx_builtin_getvar_helper(chan,"LIMIT_CONNECT_FILE");
|
|
|
|
|
start_sound = var ? var : NULL;
|
|
|
|
|
|
|
|
|
|
var=stack=limitdata;
|
|
|
|
|
|
|
|
|
|
var = strsep(&stack, ":");
|
|
|
|
|
if (var) {
|
|
|
|
|
timelimit = atol(var);
|
|
|
|
|
playargs++;
|
|
|
|
|
var = strsep(&stack, ":");
|
|
|
|
|
if (var) {
|
|
|
|
|
play_warning = atol(var);
|
|
|
|
|
playargs++;
|
|
|
|
|
var = strsep(&stack, ":");
|
|
|
|
|
if(var) {
|
|
|
|
|
warning_freq = atol(var);
|
|
|
|
|
playargs++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!timelimit) {
|
|
|
|
|
timelimit=play_to_caller=play_to_callee=play_warning=warning_freq=0;
|
|
|
|
|
warning_sound=NULL;
|
|
|
|
|
}
|
|
|
|
|
/* undo effect of S(x) in case they are both used */
|
|
|
|
|
calldurationlimit=0;
|
|
|
|
|
/* more efficient do it like S(x) does since no advanced opts*/
|
|
|
|
|
if (!play_warning && !start_sound && !end_sound && timelimit) {
|
|
|
|
|
calldurationlimit=timelimit/1000;
|
|
|
|
|
timelimit=play_to_caller=play_to_callee=play_warning=warning_freq=0;
|
|
|
|
|
} else if (option_verbose > 2) {
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"Limit Data:\n");
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"timelimit=%ld\n",timelimit);
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"play_warning=%ld\n",play_warning);
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"play_to_caller=%s\n",play_to_caller ? "yes" : "no");
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"play_to_callee=%s\n",play_to_callee ? "yes" : "no");
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"warning_freq=%ld\n",warning_freq);
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"start_sound=%s\n",start_sound ? start_sound : "UNDEF");
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"warning_sound=%s\n",warning_sound ? warning_sound : "UNDEF");
|
|
|
|
|
ast_verbose(VERBOSE_PREFIX_3"end_sound=%s\n",end_sound ? end_sound : "UNDEF");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* XXX ANNOUNCE SUPPORT */
|
|
|
|
@ -845,40 +842,37 @@ static int dial_exec(struct ast_channel *chan, void *data)
|
|
|
|
|
|
|
|
|
|
// Ok, done. stop autoservice
|
|
|
|
|
res = ast_autoservice_stop(chan);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
res = 0;
|
|
|
|
|
|
|
|
|
|
if(!res) {
|
|
|
|
|
if (calldurationlimit > 0) {
|
|
|
|
|
time(&now);
|
|
|
|
|
chan->whentohangup = now + calldurationlimit;
|
|
|
|
|
}
|
|
|
|
|
} else
|
|
|
|
|
res = 0;
|
|
|
|
|
|
|
|
|
|
if(strlen(sdtmfdata))
|
|
|
|
|
res = ast_dtmf_stream(peer,chan,sdtmfdata,0);
|
|
|
|
|
if (!res) {
|
|
|
|
|
if (calldurationlimit > 0) {
|
|
|
|
|
time(&now);
|
|
|
|
|
chan->whentohangup = now + calldurationlimit;
|
|
|
|
|
}
|
|
|
|
|
if (!ast_strlen_zero(sdtmfdata))
|
|
|
|
|
res = ast_dtmf_stream(peer,chan,sdtmfdata,0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!res) {
|
|
|
|
|
memset(&config,0,sizeof(struct ast_bridge_config));
|
|
|
|
|
config.play_to_caller=play_to_caller;
|
|
|
|
|
config.play_to_callee=play_to_callee;
|
|
|
|
|
config.allowredirect_in = allowredir_in;
|
|
|
|
|
config.allowredirect_out = allowredir_out;
|
|
|
|
|
config.allowdisconnect = allowdisconnect;
|
|
|
|
|
config.timelimit = timelimit;
|
|
|
|
|
config.play_warning = play_warning;
|
|
|
|
|
config.warning_freq = warning_freq;
|
|
|
|
|
config.warning_sound = warning_sound;
|
|
|
|
|
config.end_sound = end_sound;
|
|
|
|
|
config.start_sound = start_sound;
|
|
|
|
|
res = ast_bridge_call(chan,peer,&config);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
res = -1;
|
|
|
|
|
if (!res) {
|
|
|
|
|
memset(&config,0,sizeof(struct ast_bridge_config));
|
|
|
|
|
config.play_to_caller=play_to_caller;
|
|
|
|
|
config.play_to_callee=play_to_callee;
|
|
|
|
|
config.allowredirect_in = allowredir_in;
|
|
|
|
|
config.allowredirect_out = allowredir_out;
|
|
|
|
|
config.allowdisconnect = allowdisconnect;
|
|
|
|
|
config.timelimit = timelimit;
|
|
|
|
|
config.play_warning = play_warning;
|
|
|
|
|
config.warning_freq = warning_freq;
|
|
|
|
|
config.warning_sound = warning_sound;
|
|
|
|
|
config.end_sound = end_sound;
|
|
|
|
|
config.start_sound = start_sound;
|
|
|
|
|
res = ast_bridge_call(chan,peer,&config);
|
|
|
|
|
} else
|
|
|
|
|
res = -1;
|
|
|
|
|
|
|
|
|
|
if (res != AST_PBX_NO_HANGUP_PEER)
|
|
|
|
|
ast_hangup(peer);
|
|
|
|
|
ast_hangup(peer);
|
|
|
|
|
}
|
|
|
|
|
out:
|
|
|
|
|
hanguptree(outgoing, NULL);
|
|
|
|
|