Fixes Park() argument handling
authorDavid Brooks <dbrooks@digium.com>
Wed, 8 Jul 2009 17:26:26 +0000 (17:26 +0000)
committerDavid Brooks <dbrooks@digium.com>
Wed, 8 Jul 2009 17:26:26 +0000 (17:26 +0000)
Park() was not respecting the arguments passed to it. Any extension/context/priority
given to it was being ignored. This patch remedies this.

(closes issue #15380)
Reported by: DLNoah

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@205254 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/features.c

index 12de34f..b09543f 100644 (file)
@@ -258,7 +258,8 @@ struct parkeduser {
        char exten[AST_MAX_EXTENSION];
        int priority;
        int parkingtime;                            /*!< Maximum length in parking lot before return */
-       int notquiteyet;
+       unsigned int notquiteyet:1;
+       unsigned int options_specified:1;
        char peername[1024];
        unsigned char moh_trys;
        struct ast_parkinglot *parkinglot;
@@ -791,13 +792,20 @@ static int park_call_full(struct ast_channel *chan, struct ast_channel *peer, st
 
        /* Remember what had been dialed, so that if the parking
           expires, we try to come back to the same place */
+
+       pu->options_specified = (!ast_strlen_zero(args->return_con) || !ast_strlen_zero(args->return_ext) || args->return_pri);
+
+       /* If extension has options specified, they override all other possibilities
+       such as the returntoorigin flag and transferred context. Information on
+       extension options is lost here, so we set a flag */
+
        ast_copy_string(pu->context, 
                S_OR(args->return_con, S_OR(chan->macrocontext, chan->context)), 
                sizeof(pu->context));
        ast_copy_string(pu->exten, 
                S_OR(args->return_ext, S_OR(chan->macroexten, chan->exten)), 
                sizeof(pu->exten));
-       pu->priority = pu->priority ? pu->priority : 
+       pu->priority = args->return_pri ? args->return_pri : 
                (chan->macropriority ? chan->macropriority : chan->priority);
 
        /* If parking a channel directly, don't quiet yet get parking running on it.
@@ -3251,13 +3259,18 @@ int manage_parkinglot(struct ast_parkinglot *curlot, fd_set *rfds, fd_set *efds,
 
                                        ast_add_extension2(con, 1, peername_flat, 1, NULL, NULL, "Dial", ast_strdup(returnexten), ast_free_ptr, registrar);
                                }
-                               if (comebacktoorigin) {
-                                       set_c_e_p(chan, pu->parkinglot->parking_con_dial, peername_flat, 1);
+                               if (pu->options_specified == 1) {
+                                       /* Park() was called with overriding return arguments, respect those arguments */
+                                       set_c_e_p(chan, pu->context, pu->exten, pu->priority);
                                } else {
-                                       ast_log(LOG_WARNING, "now going to parkedcallstimeout,s,1 | ps is %d\n",pu->parkingnum);
-                                       snprintf(parkingslot, sizeof(parkingslot), "%d", pu->parkingnum);
-                                       pbx_builtin_setvar_helper(chan, "PARKINGSLOT", parkingslot);
-                                       set_c_e_p(chan, "parkedcallstimeout", peername_flat, 1);
+                                       if (comebacktoorigin) {
+                                               set_c_e_p(chan, pu->parkinglot->parking_con_dial, peername_flat, 1);
+                                       } else {
+                                               ast_log(LOG_WARNING, "now going to parkedcallstimeout,s,1 | ps is %d\n",pu->parkingnum);
+                                               snprintf(parkingslot, sizeof(parkingslot), "%d", pu->parkingnum);
+                                               pbx_builtin_setvar_helper(chan, "PARKINGSLOT", parkingslot);
+                                               set_c_e_p(chan, "parkedcallstimeout", peername_flat, 1);
+                                       }
                                }
                        } else {
                                /* They've been waiting too long, send them back to where they came.  Theoretically they