diff --git a/CHANGES b/CHANGES
index 92990771b5..d42be61def 100644
--- a/CHANGES
+++ b/CHANGES
@@ -130,6 +130,10 @@ Applications
when using multiple options (so that j option could be used without having to
manually specify timezone and format) There are other beneftis eg. format can
now be used without specifying time zone as well.
+ * Added 'F()' option to Queue and Bridge. Similar to the dial option, these can
+ be supplied with arguments indicating where the callee should go after the caller
+ is hung up, or without options specified, the priority after the Queue/Bridge
+ will be used.
Parking
------------
diff --git a/apps/app_dial.c b/apps/app_dial.c
index fbd4ef68b9..902b781442 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -1615,13 +1615,6 @@ static int detect_disconnect(struct ast_channel *chan, char code, struct ast_str
return 0;
}
-static void replace_macro_delimiter(char *s)
-{
- for (; *s; s++)
- if (*s == '^')
- *s = ',';
-}
-
/* returns true if there is a valid privacy reply */
static int valid_priv_reply(struct ast_flags64 *opts, int res)
{
@@ -2628,7 +2621,7 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
ast_clear_flag(ast_channel_cdr(chan), AST_CDR_FLAG_DIALED);
ast_clear_flag(ast_channel_cdr(peer), AST_CDR_FLAG_DIALED);
- replace_macro_delimiter(opt_args[OPT_ARG_GOTO]);
+ ast_replace_subargument_delimiter(opt_args[OPT_ARG_GOTO]);
ast_parseable_goto(chan, opt_args[OPT_ARG_GOTO]);
/* peer goes to the same context and extension as chan, so just copy info from chan*/
ast_channel_context_set(peer, ast_channel_context(chan));
@@ -2659,7 +2652,7 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
ast_channel_context_set(peer, ast_channel_context(chan));
ast_channel_exten_set(peer, ast_channel_exten(chan));
- replace_macro_delimiter(opt_args[OPT_ARG_CALLEE_MACRO]);
+ ast_replace_subargument_delimiter(opt_args[OPT_ARG_CALLEE_MACRO]);
res = pbx_exec(peer, theapp, opt_args[OPT_ARG_CALLEE_MACRO]);
ast_debug(1, "Macro exited with status %d\n", res);
res = 0;
@@ -2699,7 +2692,7 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
res = -1;
/* perform a transfer to a new extension */
if (strchr(macro_transfer_dest, '^')) { /* context^exten^priority*/
- replace_macro_delimiter(macro_transfer_dest);
+ ast_replace_subargument_delimiter(macro_transfer_dest);
if (!ast_parseable_goto(chan, macro_transfer_dest))
ast_set_flag64(peerflags, OPT_GO_ON);
}
@@ -2724,7 +2717,7 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
theapp = pbx_findapp("Gosub");
if (theapp && !res9) {
- replace_macro_delimiter(opt_args[OPT_ARG_CALLEE_GOSUB]);
+ ast_replace_subargument_delimiter(opt_args[OPT_ARG_CALLEE_GOSUB]);
/* Set where we came from */
ast_channel_context_set(peer, "app_dial_gosub_virtual_context");
@@ -2814,7 +2807,7 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
res = -1;
/* perform a transfer to a new extension */
if (strchr(gosub_transfer_dest, '^')) { /* context^exten^priority*/
- replace_macro_delimiter(gosub_transfer_dest);
+ ast_replace_subargument_delimiter(gosub_transfer_dest);
if (!ast_parseable_goto(chan, gosub_transfer_dest))
ast_set_flag64(peerflags, OPT_GO_ON);
}
@@ -2928,7 +2921,7 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
}
if (!ast_check_hangup(peer) && ast_test_flag64(&opts, OPT_CALLEE_GO_ON)) {
if(!ast_strlen_zero(opt_args[OPT_ARG_CALLEE_GO_ON])) {
- replace_macro_delimiter(opt_args[OPT_ARG_CALLEE_GO_ON]);
+ ast_replace_subargument_delimiter(opt_args[OPT_ARG_CALLEE_GO_ON]);
ast_parseable_goto(peer, opt_args[OPT_ARG_CALLEE_GO_ON]);
} else { /* F() */
int goto_res;
diff --git a/apps/app_queue.c b/apps/app_queue.c
index d372a50ba3..7a91384b8f 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -1305,21 +1305,6 @@ static void set_queue_result(struct ast_channel *chan, enum queue_result res)
}
}
-/*!
- * \internal
- * \brief Converts delimited '^' characters in a target priority/extension/context string
- * to commas so that they can be used with ast_parseable_goto.
- * \param s string that '^' characters are being replaced in.
- */
-static void replace_macro_delimiter(char *s)
-{
- for (; *s; s++) {
- if (*s == '^') {
- *s = ',';
- }
- }
-}
-
static const char *int2strat(int strategy)
{
int x;
@@ -5326,7 +5311,7 @@ static int try_calling(struct queue_ent *qe, const struct ast_flags opts, char *
if (!ast_check_hangup(peer) && ast_test_flag(&opts, OPT_CALLEE_GO_ON)) {
if (!ast_strlen_zero(opt_args[OPT_ARG_CALLEE_GO_ON])) {
- replace_macro_delimiter(opt_args[OPT_ARG_CALLEE_GO_ON]);
+ ast_replace_subargument_delimiter(opt_args[OPT_ARG_CALLEE_GO_ON]);
if (ast_parseable_goto(peer, opt_args[OPT_ARG_CALLEE_GO_ON]) == AST_PBX_SUCCESS) {
ast_pbx_start(peer);
diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h
index e3b98435a0..c33f423228 100644
--- a/include/asterisk/utils.h
+++ b/include/asterisk/utils.h
@@ -428,6 +428,12 @@ int ast_pthread_create_detached_stack(pthread_t *thread, pthread_attr_t *attr, v
/* End of thread management support */
+/*!
+ \brief Replace '^' in a string with ','
+ \param s String within which to replace characters
+*/
+void ast_replace_subargument_delimiter(char *s);
+
/*!
\brief Process a string to find and replace characters
\param start The string to analyze
diff --git a/main/features.c b/main/features.c
index 96c528def8..71be7d3f7d 100644
--- a/main/features.c
+++ b/main/features.c
@@ -127,6 +127,36 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+
+