]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fixes issue with hints giving unexpected results.
authorDavid Vossel <dvossel@digium.com>
Fri, 5 Jun 2009 21:19:56 +0000 (21:19 +0000)
committerDavid Vossel <dvossel@digium.com>
Fri, 5 Jun 2009 21:19:56 +0000 (21:19 +0000)
Hints with two or more devices that include ONHOLD gave unexpected results.

(closes issue #15057)
Reported by: p_lindheimer
Patches:
      onhold_trunk.diff uploaded by dvossel (license 671)
      pbx.c.1.4.patch uploaded by p (license 558)
      devicestate.c.trunk.patch uploaded by p (license 671)
Tested by: p_lindheimer, dvossel

Review: https://reviewboard.asterisk.org/r/254/

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

main/pbx.c

index 8fa993501db44d7e29636aef04ddc8debab0dfd6..6d2fc7c83750e354b34a9b6919147ea89dec2fdf 100644 (file)
@@ -1920,8 +1920,8 @@ static int ast_extension_state2(struct ast_exten *e)
 {
        char hint[AST_MAX_EXTENSION];
        char *cur, *rest;
-       int allunavailable = 1, allbusy = 1, allfree = 1, allonhold = 1;
-       int busy = 0, inuse = 0, ring = 0;
+       int allunavailable = 1, allbusy = 1, allfree = 1;
+       int busy = 0, inuse = 0, ring = 0, onhold = 0;
 
        if (!e)
                return -1;
@@ -1935,67 +1935,60 @@ static int ast_extension_state2(struct ast_exten *e)
                case AST_DEVICE_NOT_INUSE:
                        allunavailable = 0;
                        allbusy = 0;
-                       allonhold = 0;
                        break;
                case AST_DEVICE_INUSE:
                        inuse = 1;
                        allunavailable = 0;
                        allfree = 0;
-                       allonhold = 0;
                        break;
                case AST_DEVICE_RINGING:
                        ring = 1;
                        allunavailable = 0;
                        allfree = 0;
-                       allonhold = 0;
                        break;
                case AST_DEVICE_RINGINUSE:
                        inuse = 1;
                        ring = 1;
                        allunavailable = 0;
                        allfree = 0;
-                       allonhold = 0;
                        break;
                case AST_DEVICE_ONHOLD:
                        allunavailable = 0;
                        allfree = 0;
+                       onhold = 1;
                        break;
                case AST_DEVICE_BUSY:
                        allunavailable = 0;
                        allfree = 0;
-                       allonhold = 0;
                        busy = 1;
+                       inuse = 1;
                        break;
                case AST_DEVICE_UNAVAILABLE:
                case AST_DEVICE_INVALID:
                        allbusy = 0;
                        allfree = 0;
-                       allonhold = 0;
                        break;
                default:
                        allunavailable = 0;
                        allbusy = 0;
                        allfree = 0;
-                       allonhold = 0;
                }
        }
 
-       if (!inuse && ring)
-               return AST_EXTENSION_RINGING;
-       if (inuse && ring)
-               return (AST_EXTENSION_INUSE | AST_EXTENSION_RINGING);
-       if (inuse)
-               return AST_EXTENSION_INUSE;
        if (allfree)
                return AST_EXTENSION_NOT_INUSE;
-       if (allonhold)
-               return AST_EXTENSION_ONHOLD;
+       if ((inuse || onhold) && ring)
+               return (AST_EXTENSION_INUSE | AST_EXTENSION_RINGING);
        if (allbusy)
                return AST_EXTENSION_BUSY;
+       if (inuse)
+               return AST_EXTENSION_INUSE;
+       if (ring)
+               return AST_EXTENSION_RINGING;
+       if (onhold)
+               return AST_EXTENSION_ONHOLD;
        if (allunavailable)
                return AST_EXTENSION_UNAVAILABLE;
-       if (busy)
-               return AST_EXTENSION_INUSE;
 
        return AST_EXTENSION_NOT_INUSE;
 }