Merged revisions 96573 via svnmerge from
authorJason Parker <jparker@digium.com>
Fri, 4 Jan 2008 22:57:56 +0000 (22:57 +0000)
committerJason Parker <jparker@digium.com>
Fri, 4 Jan 2008 22:57:56 +0000 (22:57 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

(Closes issue #11237)
........
r96573 | qwell | 2008-01-04 16:55:56 -0600 (Fri, 04 Jan 2008) | 4 lines

Properly continue in the dialplan if using PARKINGEXTEN and the slot is full.

Issue 11237, patch by me.

........

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

res/res_features.c

index 8de1c1f..44f413c 100644 (file)
@@ -401,7 +401,7 @@ static int park_call_full(struct ast_channel *chan, struct ast_channel *peer, in
                        AST_LIST_UNLOCK(&parkinglot);
                        ast_free(pu);
                        ast_log(LOG_WARNING, "Requested parking extension already exists: %s@%s\n", parkingexten, parking_con);
-                       return 0;       /* Continue execution if possible */
+                       return 1;       /* Continue execution if possible */
                }
                ast_copy_string(pu->parkingexten, parkingexten, sizeof(pu->parkingexten));
                x = atoi(parkingexten);
@@ -2352,10 +2352,15 @@ static int park_call_exec(struct ast_channel *chan, void *data)
         * of a park--it is still theoretically possible for a transfer to happen before
         * we get here, but it is _really_ unlikely */
        char *orig_chan_name = ast_strdupa(chan->name);
+       char orig_exten[AST_MAX_EXTENSION];
+       int orig_priority = chan->priority;
+
        /* Data is unused at the moment but could contain a parking
           lot context eventually */
        int res = 0;
 
+       ast_copy_string(orig_exten, chan->exten, sizeof(orig_exten));
+
        /* Setup the exten/priority to be s/1 since we don't know
           where this call should return */
        strcpy(chan->exten, "s");
@@ -2367,10 +2372,18 @@ static int park_call_exec(struct ast_channel *chan, void *data)
        if (!res)
                res = ast_safe_sleep(chan, 1000);
        /* Park the call */
-       if (!res)
+       if (!res) {
                res = park_call_full(chan, NULL, 0, NULL, orig_chan_name);
+               /* Continue on in the dialplan */
+               if (res == 1) {
+                       ast_copy_string(chan->exten, orig_exten, sizeof(chan->exten));
+                       chan->priority = orig_priority;
+                       res = 0;
+               } else if (!res)
+                       res = AST_PBX_KEEPALIVE;
+       }
 
-       return !res ? AST_PBX_KEEPALIVE : res;
+       return res;
 }
 
 /*! \brief Pickup parked call */