From 827f2eae920e403dff3cc240b7b74e65b7afc7c1 Mon Sep 17 00:00:00 2001 From: Mark Michelson <mmichelson@digium.com> Date: Fri, 16 Mar 2012 15:38:45 +0000 Subject: [PATCH] Revert the pre-dial addition. The code may be just fine, but it had not received a "ship it!" on review board yet. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@359857 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- CHANGES | 6 - apps/app_dial.c | 53 +------- include/asterisk/pbx.h | 19 --- main/pbx.c | 269 +++-------------------------------------- 4 files changed, 19 insertions(+), 328 deletions(-) diff --git a/CHANGES b/CHANGES index 4c4aaa008d..92990771b5 100644 --- a/CHANGES +++ b/CHANGES @@ -131,12 +131,6 @@ Applications manually specify timezone and format) There are other beneftis eg. format can now be used without specifying time zone as well. - * Added 'b' and 'B' options to Dial. These options will allow you to run - last-minute dialplan on the caller and callee channels while the Dial - application is executing, but before the call is started. For example you - can use the 'b' option to run dialplan on the callee channel to get the name - of the newly created channel right away. - Parking ------------ * New per parking lot options: comebackcontext and comebackdialtime. See diff --git a/apps/app_dial.c b/apps/app_dial.c index 3932a71ddf..fbd4ef68b9 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -108,21 +108,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") channel before doing anything on the called channel. You will rarely need to use this option, the default behavior is adequate in most cases.</para> </option> - <option name="b" argsep=","> - <para>Before initiating the actual call, Gosub to the specified - context,exten,priority using the newly created channel(s).</para> - <para>The Gosub will be executed for each destination channel</para> - <argument name="context" required="true"/> - <argument name="exten" required="true"/> - <argument name="priority" required="true"/> - </option> - <option name="B" argsep=","> - <para>Before initiating the actual call, Gosub to the specified - context,exten,priority using the current channel</para> - <argument name="context" required="true"/> - <argument name="exten" required="true"/> - <argument name="priority" required="true"/> - </option> <option name="C"> <para>Reset the call detail record (CDR) for this call.</para> </option> @@ -605,8 +590,6 @@ enum { #define OPT_FORCE_CID_TAG (1LLU << 38) #define OPT_FORCE_CID_PRES (1LLU << 39) #define OPT_CALLER_ANSWER (1LLU << 40) -#define OPT_PREDIAL_CALLEE_GOSUB (1LLU << 41) -#define OPT_PREDIAL_CALLER_GOSUB (1LLU << 42) enum { OPT_ARG_ANNOUNCE = 0, @@ -626,8 +609,6 @@ enum { OPT_ARG_FORCECLID, OPT_ARG_FORCE_CID_TAG, OPT_ARG_FORCE_CID_PRES, - OPT_ARG_PREDIAL_CALLER_GOSUB, - OPT_ARG_PREDIAL_CALLEE_GOSUB, /* note: this entry _MUST_ be the last one in the enum */ OPT_ARG_ARRAY_SIZE, }; @@ -671,14 +652,12 @@ AST_APP_OPTIONS(dial_exec_options, BEGIN_OPTIONS AST_APP_OPTION('x', OPT_CALLEE_MIXMONITOR), AST_APP_OPTION('X', OPT_CALLER_MIXMONITOR), AST_APP_OPTION('z', OPT_CANCEL_TIMEOUT), - AST_APP_OPTION_ARG('b', OPT_PREDIAL_CALLEE_GOSUB, OPT_ARG_PREDIAL_CALLEE_GOSUB), - AST_APP_OPTION_ARG('B', OPT_PREDIAL_CALLER_GOSUB, OPT_ARG_PREDIAL_CALLER_GOSUB), END_OPTIONS ); #define CAN_EARLY_BRIDGE(flags,chan,peer) (!ast_test_flag64(flags, OPT_CALLEE_HANGUP | \ OPT_CALLER_HANGUP | OPT_CALLEE_TRANSFER | OPT_CALLER_TRANSFER | \ OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR | OPT_CALLEE_PARK | \ - OPT_CALLER_PARK | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_CALLEE_GOSUB | OPT_PREDIAL_CALLER_GOSUB | OPT_PREDIAL_CALLEE_GOSUB) && \ + OPT_CALLER_PARK | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_CALLEE_GOSUB) && \ !ast_channel_audiohooks(chan) && !ast_channel_audiohooks(peer) && \ ast_framehook_list_is_empty(ast_channel_framehooks(chan)) && ast_framehook_list_is_empty(ast_channel_framehooks(peer))) @@ -2190,22 +2169,14 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast ast_channel_lock(chan); if ((outbound_group = pbx_builtin_getvar_helper(chan, "OUTBOUND_GROUP_ONCE"))) { - outbound_group = ast_strdupa(outbound_group); + outbound_group = ast_strdupa(outbound_group); pbx_builtin_setvar_helper(chan, "OUTBOUND_GROUP_ONCE", NULL); } else if ((outbound_group = pbx_builtin_getvar_helper(chan, "OUTBOUND_GROUP"))) { outbound_group = ast_strdupa(outbound_group); } - ast_channel_unlock(chan); + ast_channel_unlock(chan); ast_copy_flags64(peerflags, &opts, OPT_DTMF_EXIT | OPT_GO_ON | OPT_ORIGINAL_CLID | OPT_CALLER_HANGUP | OPT_IGNORE_FORWARDING | OPT_IGNORE_CONNECTEDLINE | - OPT_CANCEL_TIMEOUT | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_CALLEE_GOSUB | OPT_FORCECLID | OPT_PREDIAL_CALLER_GOSUB | OPT_PREDIAL_CALLEE_GOSUB); - - /* PREDIAL: Run gosub on the caller's channel */ - if (ast_test_flag64(&opts, OPT_PREDIAL_CALLER_GOSUB) && !ast_strlen_zero(opt_args[OPT_ARG_PREDIAL_CALLER_GOSUB])) { - struct ast_channel *c = chan; - const char *goto_target = opt_args[OPT_ARG_PREDIAL_CALLER_GOSUB]; - - ast_pbx_exten_run_parseargs(c, goto_target, 1); - } + OPT_CANCEL_TIMEOUT | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_CALLEE_GOSUB | OPT_FORCECLID); /* loop through the list of dial destinations */ rest = args.peers; @@ -2435,22 +2406,6 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast ast_channel_unlock(tc); ast_channel_unlock(chan); - - /* PREDIAL: Run gosub on the callee's channel - * We run the callee predial before ast_call() in case the user wishes to do something on the newly created channel - * before the channel does anything important - * - * Inside the target gosub we will be able to do something with the newly created channel name - * ie: now the calling channel can know what channel will be used to call the destination - * ex: now we will know that SIP/abc-123 is calling SIP/def-124 - */ - if (ast_test_flag64(&opts, OPT_PREDIAL_CALLEE_GOSUB) && !ast_strlen_zero(opt_args[OPT_ARG_PREDIAL_CALLEE_GOSUB])) { - struct ast_channel *c = tc; - const char *goto_target = opt_args[OPT_ARG_PREDIAL_CALLEE_GOSUB]; - - ast_pbx_exten_run_parseargs(c, goto_target, 1); - } - res = ast_call(tc, numsubst, 0); /* Place the call, but don't wait on the answer */ ast_channel_lock(chan); diff --git a/include/asterisk/pbx.h b/include/asterisk/pbx.h index 2b10cc84f4..f7dc7b919e 100644 --- a/include/asterisk/pbx.h +++ b/include/asterisk/pbx.h @@ -331,8 +331,6 @@ struct ast_pbx_args { struct { /*! Do not hangup the channel when the PBX is complete. */ unsigned int no_hangup_chan:1; - /*! Reuse existing pbx on the channel (used for arbitrarily jumping into dialplan) */ - unsigned int use_existing_pbx:1; }; }; }; @@ -1113,23 +1111,6 @@ void pbx_set_overrideswitch(const char *newval); */ int ast_goto_if_exists(struct ast_channel *chan, const char *context, const char *exten, int priority); -/*! - * \note This function will check the validity of a goto target, see - * if it's reachable given the current channel state, and save the - * parsed tokens to the given buffers. - */ -int ast_pbx_exten_parse(struct ast_channel *chan, const char *goto_target, struct ast_str *context, struct ast_str *exten, struct ast_str *priority, struct varshead *varshead); - -/*! - * \note This function will run dialplan on a channel at context,exten,priority - */ -enum ast_pbx_result ast_pbx_exten_run_parseargs(struct ast_channel *chan, const char *gosub_args, int restore_dialplan_location); - -/*! - * \note This function will run dialplan on a channel at context,exten,priority and set also ARG - */ -enum ast_pbx_result ast_pbx_exten_run(struct ast_channel *chan, const char *context, const char *exten, int priority, struct varshead *varshead, int restore_dialplan_location); - /*! * \note This function will handle locking the channel as needed. */ diff --git a/main/pbx.c b/main/pbx.c index 48a734734f..905310ccf3 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -5105,21 +5105,19 @@ static enum ast_pbx_result __ast_pbx_run(struct ast_channel *c, int error = 0; /* set an error conditions */ struct ast_pbx *pbx; - if (!args || !args->use_existing_pbx) { - /* A little initial setup here */ - if (ast_channel_pbx(c)) { - ast_log(LOG_WARNING, "%s already has PBX structure??\n", ast_channel_name(c)); - /* XXX and now what ? */ - ast_free(ast_channel_pbx(c)); - } - if (!(pbx = ast_calloc(1, sizeof(*pbx)))) { - return -1; - } - ast_channel_pbx_set(c, pbx); - /* Set reasonable defaults */ - ast_channel_pbx(c)->rtimeoutms = 10000; - ast_channel_pbx(c)->dtimeoutms = 5000; - } + /* A little initial setup here */ + if (ast_channel_pbx(c)) { + ast_log(LOG_WARNING, "%s already has PBX structure??\n", ast_channel_name(c)); + /* XXX and now what ? */ + ast_free(ast_channel_pbx(c)); + } + if (!(pbx = ast_calloc(1, sizeof(*pbx)))) { + return -1; + } + ast_channel_pbx_set(c, pbx); + /* Set reasonable defaults */ + ast_channel_pbx(c)->rtimeoutms = 10000; + ast_channel_pbx(c)->dtimeoutms = 5000; autoloopflag = ast_test_flag(ast_channel_flags(c), AST_FLAG_IN_AUTOLOOP); /* save value to restore at the end */ ast_set_flag(ast_channel_flags(c), AST_FLAG_IN_AUTOLOOP); @@ -5392,11 +5390,8 @@ static enum ast_pbx_result __ast_pbx_run(struct ast_channel *c, } ast_set2_flag(ast_channel_flags(c), autoloopflag, AST_FLAG_IN_AUTOLOOP); ast_clear_flag(ast_channel_flags(c), AST_FLAG_BRIDGE_HANGUP_RUN); /* from one round to the next, make sure this gets cleared */ - - if (!args || !args->use_existing_pbx) { - pbx_destroy(ast_channel_pbx(c)); - ast_channel_pbx_set(c, NULL); - } + pbx_destroy(ast_channel_pbx(c)); + ast_channel_pbx_set(c, NULL); if (!args || !args->no_hangup_chan) { ast_hangup(c); @@ -10849,237 +10844,3 @@ int ast_pbx_init(void) return (hints && hintdevices && statecbs) ? 0 : -1; } - -/*! \brief return the pieces of a goto style target if it's valid. - * - * \param chan Channel on which to test target validity - * \param goto_target Goto target string. ([[context,]extension,]priority) see below for examples - * \param context Parsed context (ast_str must be pre created) - * \param exten Parsed exten (ast_str must be pre created) - * \param priority Parsed priority (ast_str must be pre created) (can be null if not needed) - * \param varshead Parsed variables from the gosub (can be null if not needed) - * - * \return -1 on failure - * \return parsed priority integer on success (> 0) - * - * \note lock channel before calling - * - * \example goto_target valid format: priority - * \example goto_target valid format: label - * \example goto_target valid format: exten,priority - * \example goto_target valid format: exten,label - * \example goto_target valid format: context,exten,priority - * \example goto_target valid format: context,exten,label - * \example goto_target <valid_format>(args) - */ -int ast_pbx_exten_parse(struct ast_channel *chan, const char *goto_target, struct ast_str *context, struct ast_str *exten, struct ast_str *priority, struct varshead *varshead) -{ - int parse_args = 0; - char *target = ast_strdupa(goto_target); /* Target must be writable for AST_STANDARD_RAW_ARGS */ - char *start_args = target; - int ipriority; - AST_DECLARE_APP_ARGS(args, - AST_APP_ARG(context); - AST_APP_ARG(exten); - AST_APP_ARG(priority); - ); - AST_DECLARE_APP_ARGS(args2, - AST_APP_ARG(argval)[100]; - ); - - ast_str_truncate(context, 0); - ast_str_truncate(exten, 0); - - /* Find the args (if any) */ - if (varshead && ((start_args = strchr(start_args, '(')) != NULL)) { - char *end_args; - - parse_args = 1; - *start_args = 0; - start_args++; - - if ((end_args = strchr(start_args, ')')) != NULL) { - *end_args = 0; - } - else { - ast_log(LOG_WARNING, "Ouch. No closing paren for Gosub parameters: '%s'?\n", goto_target); - } - } - - AST_STANDARD_RAW_ARGS(args, target); - - if (priority) { - ast_str_truncate(priority, 0); - } - - if (ast_strlen_zero(goto_target)) { - ast_log(LOG_WARNING, "goto_target cannot be empty ([[context,]extension,]priority)\n"); - return -1; - } - - if (ast_strlen_zero(args.exten)) { - /* Only a priority in this one */ - args.priority = args.context; - args.exten = (char *) ast_channel_exten(chan); - args.context = (char *) ast_channel_context(chan); - } else if (ast_strlen_zero(args.priority)) { - /* Only an extension and priority in this one */ - args.priority = args.exten; - args.exten = args.context; - args.context = (char *) ast_channel_context(chan); - } - - if (sscanf(args.priority, "%d", &ipriority) > 0) { - if (!ast_exists_extension(chan, args.context, args.exten, ipriority, S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL))) { - ast_log(LOG_WARNING, "priority based goto target not found: %s\n", goto_target); - ipriority = 0; - return -1; - } - } else { - if (!(ipriority = ast_findlabel_extension(chan, args.context, args.exten, args.priority, S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL)))) { - ast_log(LOG_WARNING, "label based goto target not found: %s\n", goto_target); - ipriority = 0; - return -1; - } - } - - ast_str_set(&context, 0, "%s", args.context); - ast_str_set(&exten, 0, "%s", args.exten); - - if (priority) { - ast_str_set(&priority, 0, "%s", args.priority); - } - - if (parse_args) { - int i; - struct ast_str *argument_name = ast_str_create(64); - struct ast_var_t *variable; - int argument_num = 1; - - AST_STANDARD_RAW_ARGS(args2, start_args); - - for (i = 0; i < args2.argc; i++) { - ast_str_truncate(argument_name, 0); - ast_str_append(&argument_name, 0, "ARG%d", argument_num); - - variable = ast_var_assign(ast_str_buffer(argument_name), args2.argval[i]); - AST_LIST_INSERT_TAIL(varshead, variable, entries); - argument_num++; - - ast_log(LOG_WARNING, "Setting '%s' to '%s' %p\n", ast_str_buffer(argument_name), args2.argval[i], variable); - ast_debug(1, "Setting '%s' to '%s'\n", ast_str_buffer(argument_name), args2.argval[i]); - } - - ast_free(argument_name); - } - - return ipriority; -} - -/*! \brief run dialplan on a channel, optionally restoring the channel to the previous dialplan location - * - * \param chan Channel on which to run dialplan - * \param args Gosub style args in the form of context,exten,priority(arg1,arg2,argn,...) - * \param restore_dialplan_location 1/0 whether to restore the channel's dialplan location to where it was before we were called - * - * \retval AST_PBX_SUCCESS on success - * \retval AST_PBX_ERROR on error - * - */ -enum ast_pbx_result ast_pbx_exten_run_parseargs(struct ast_channel *chan, const char *gosub_args, int restore_dialplan_location) { - struct varshead varshead; - struct ast_var_t *variable; - struct ast_str *context = ast_str_create(64); - struct ast_str *exten = ast_str_create(64); - int ipriority; - enum ast_pbx_result res = AST_PBX_ERROR; - - memset(&varshead, 0, sizeof(varshead)); - - if ((ipriority = ast_pbx_exten_parse(chan, gosub_args, context, exten, NULL, &varshead)) > 0) { - res = ast_pbx_exten_run(chan, ast_str_buffer(context), ast_str_buffer(exten), ipriority, &varshead, 1); - } - - AST_LIST_TRAVERSE_SAFE_BEGIN(&varshead, variable, entries) { - AST_LIST_REMOVE_CURRENT(entries); - ast_var_delete(variable); - } - AST_LIST_TRAVERSE_SAFE_END; - - ast_free(context); - ast_free(exten); - - return res; -} - -/*! \brief run dialplan on a channel, optionally restoring the channel to the previous dialplan location - * - * \param chan Channel on which to run dialplan - * \param context Context in which to execute - * \param exten Exten within the context - * \param priority Priority within the exten - * \param varshead Array of arguments to pass to destination. Args will be set in the form of ARG1,ARG2,ARGn,... - * \param restore_dialplan_location 1/0 whether to restore the channel's dialplan location to where it was before we were called - * - * \retval AST_PBX_HANGUP on error - * \retval AST_PBX_OK on success - * - */ -enum ast_pbx_result ast_pbx_exten_run(struct ast_channel *chan, const char *context, const char *exten, int priority, struct varshead *varshead, int restore_dialplan_location) -{ - struct ast_str *backup_context; - struct ast_str *backup_exten; - int backup_priority = 0; - enum ast_pbx_result res; - struct ast_pbx_args run_args; - struct ast_var_t *variable; - - /* Back up current dialplan location */ - if (restore_dialplan_location) { - backup_context = ast_str_create(64); - backup_exten = ast_str_create(64); - - ast_str_set(&backup_context, 0, "%s", ast_channel_context(chan)); - ast_str_set(&backup_exten, 0, "%s", ast_channel_exten(chan)); - backup_priority = ast_channel_priority(chan); - } - - /* New dialplan location */ - ast_channel_context_set(chan, context); - ast_channel_exten_set(chan, exten); - ast_channel_priority_set(chan, priority); - - /* set args, if any */ - if (varshead) { - AST_LIST_TRAVERSE(varshead, variable, entries) { - pbx_builtin_pushvar_helper(chan, ast_var_name(variable), ast_var_value(variable)); - } - } - - memset(&run_args, 0, sizeof(run_args)); - if (ast_channel_pbx(chan)) { - run_args.use_existing_pbx = 1; - } - run_args.no_hangup_chan = 1; - res = __ast_pbx_run(chan, &run_args); - - /* Allow use of previously set variables. Ie: if there was previously ARG1,ARG2,etc set on the channel - we want access to those old values since the dialplan we ran is now finished */ - if (varshead) { - AST_LIST_TRAVERSE(varshead, variable, entries) { - pbx_builtin_setvar_helper(chan, ast_var_name(variable), NULL); - } - } - - if (restore_dialplan_location) { - /* Restore current dialplan location */ - ast_channel_context_set(chan, ast_str_buffer(backup_context)); - ast_channel_exten_set(chan, ast_str_buffer(backup_exten)); - ast_channel_priority_set(chan, backup_priority); - - ast_free(backup_context); - ast_free(backup_exten); - } - - return res; -}