From c545cd3cf705d98c20af08be89762c4d5538acf9 Mon Sep 17 00:00:00 2001 From: Martin Pycko <martinp@digium.com> Date: Mon, 22 Sep 2003 15:27:09 +0000 Subject: [PATCH] Create better 'failed' CDRs for outgoing spool calls with context,extension,priority git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1538 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channel.c | 26 +++++++++++++++++++++++--- include/asterisk/channel.h | 18 ++++++++++++++++++ include/asterisk/pbx.h | 1 + pbx.c | 29 +++++++---------------------- 4 files changed, 49 insertions(+), 25 deletions(-) diff --git a/channel.c b/channel.c index 6b9038873b..00c863b75a 100755 --- a/channel.c +++ b/channel.c @@ -1489,7 +1489,7 @@ int ast_set_read_format(struct ast_channel *chan, int fmts) return 0; } -struct ast_channel *ast_request_and_dial(char *type, int format, void *data, int timeout, int *outstate, char *callerid) +struct ast_channel *__ast_request_and_dial(char *type, int format, void *data, int timeout, int *outstate, char *callerid, struct outgoing_helper *oh) { int state = 0; struct ast_channel *chan; @@ -1497,8 +1497,23 @@ struct ast_channel *ast_request_and_dial(char *type, int format, void *data, int int res = 0; chan = ast_request(type, format, data); if (chan) { - if (callerid) - ast_set_callerid(chan, callerid, 1); + if (oh) { + char *tmp, *var; + /* JDG chanvar */ + tmp = oh->variable; + /* FIXME replace this call with strsep NOT*/ + while( (var = strtok_r(NULL, "|", &tmp)) ) { + pbx_builtin_setvar( chan, var ); + } /* /JDG */ + if (*oh->context) + strncpy(chan->context, oh->context, sizeof(chan->context) - 1); + if (*oh->exten) + strncpy(chan->exten, oh->exten, sizeof(chan->exten) - 1); + if (*oh->callerid) + ast_set_callerid(chan, oh->callerid, 1); + chan->priority = oh->priority; + } + if (!ast_call(chan, data, 0)) { while(timeout && (chan->_state != AST_STATE_UP)) { res = ast_waitfor(chan, timeout); @@ -1566,6 +1581,11 @@ struct ast_channel *ast_request_and_dial(char *type, int format, void *data, int return chan; } +struct ast_channel *ast_request_and_dial(char *type, int format, void *data, int timeout, int *outstate, char *callerid) +{ + return __ast_request_and_dial(type, format, data, timeout, outstate, callerid, NULL); +} + struct ast_channel *ast_request(char *type, int format, void *data) { struct chanlist *chan; diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index f33bb62d32..16a148302f 100755 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -230,6 +230,22 @@ struct ast_channel { struct chanmon; +#define LOAD_OH(oh) { \ + oh.context = context; \ + oh.exten = exten; \ + oh.priority = priority; \ + oh.callerid = callerid; \ + oh.variable = variable; \ +} + +struct outgoing_helper { + char *context; + char *exten; + int priority; + char *callerid; + char *variable; +}; + #define AST_CDR_TRANSFER (1 << 0) #define AST_CDR_FORWARD (1 << 1) #define AST_CDR_CALLWAIT (1 << 2) @@ -327,6 +343,8 @@ int ast_device_state(char *device); */ struct ast_channel *ast_request_and_dial(char *type, int format, void *data, int timeout, int *reason, char *callerid); +struct ast_channel *__ast_request_and_dial(char *type, int format, void *data, int timeout, int *reason, char *callerid, struct outgoing_helper *oh); + //! Registers a channel /*! * \param type type of channel you are registering diff --git a/include/asterisk/pbx.h b/include/asterisk/pbx.h index 32dfcc1274..3238ab403a 100755 --- a/include/asterisk/pbx.h +++ b/include/asterisk/pbx.h @@ -521,6 +521,7 @@ struct ast_sw *ast_walk_context_switches(struct ast_context *con, struct ast_sw extern char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name); extern void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value); extern void pbx_builtin_clear_globals(void); +extern int pbx_builtin_setvar(struct ast_channel *chan, void *data); extern void pbx_substitute_variables_helper(struct ast_channel *c,const char *cp1,char *cp2,int count); int ast_extension_patmatch(const char *pattern, const char *data); diff --git a/pbx.c b/pbx.c index 0582081540..aa833c7917 100755 --- a/pbx.c +++ b/pbx.c @@ -162,13 +162,13 @@ static int pbx_builtin_setaccount(struct ast_channel *, void *); static int pbx_builtin_ringing(struct ast_channel *, void *); static int pbx_builtin_congestion(struct ast_channel *, void *); static int pbx_builtin_busy(struct ast_channel *, void *); -static int pbx_builtin_setvar(struct ast_channel *, void *); static int pbx_builtin_setglobalvar(struct ast_channel *, void *); static int pbx_builtin_noop(struct ast_channel *, void *); static int pbx_builtin_gotoif(struct ast_channel *, void *); static int pbx_builtin_gotoiftime(struct ast_channel *, void *); static int pbx_builtin_saynumber(struct ast_channel *, void *); static int pbx_builtin_saydigits(struct ast_channel *, void *); +int pbx_builtin_setvar(struct ast_channel *, void *); void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value); char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name); @@ -3786,31 +3786,16 @@ int ast_pbx_outgoing_exten(char *type, int format, void *data, int timeout, char struct async_stat *as; int res = -1; char *var, *tmp; + struct outgoing_helper oh; if (sync) { - chan = ast_request_and_dial(type, format, data, timeout, reason, callerid); + LOAD_OH(oh); + chan = __ast_request_and_dial(type, format, data, timeout, reason, callerid, &oh); if (chan) { - /* JDG chanvar */ - tmp = variable; - /* FIXME replace this call with strsep NOT*/ - while( (var = strtok_r(NULL, "|", &tmp)) ) { - pbx_builtin_setvar( chan, var ); - } /* /JDG */ if (chan->_state == AST_STATE_UP) { - res = 0; + res = 0; if (option_verbose > 3) ast_verbose(VERBOSE_PREFIX_4 "Channel %s was answered.\n", chan->name); - if (context && *context) - strncpy(chan->context, context, sizeof(chan->context) - 1); - if (exten && *exten) - strncpy(chan->exten, exten, sizeof(chan->exten) - 1); - if (callerid && *callerid) { - /* XXX call ast_set_callerid? */ - if (chan->callerid) - free(chan->callerid); - chan->callerid = strdup(callerid); - } - if (priority > 0) - chan->priority = priority; + if (sync > 1) { if (ast_pbx_run(chan)) { ast_log(LOG_WARNING, "Unable to run PBX on %s\n", chan->name); @@ -4345,7 +4330,7 @@ void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value } } -static int pbx_builtin_setvar(struct ast_channel *chan, void *data) +int pbx_builtin_setvar(struct ast_channel *chan, void *data) { char *name; char *value; -- GitLab