various devicestate fixes (issue #5081, take two)
authorKevin P. Fleming <kpfleming@digium.com>
Thu, 1 Sep 2005 22:28:33 +0000 (22:28 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Thu, 1 Sep 2005 22:28:33 +0000 (22:28 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6496 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channel.c
channels/chan_iax2.c
devicestate.c

index 7e63bbb..34ae2bf 100755 (executable)
--- a/channel.c
+++ b/channel.c
@@ -2808,34 +2808,25 @@ void ast_set_callerid(struct ast_channel *chan, const char *callerid, const char
 
 int ast_setstate(struct ast_channel *chan, int state)
 {
-       if (chan->_state != state) {
-               int oldstate = chan->_state;
-               chan->_state = state;
-               if (oldstate == AST_STATE_DOWN) {
-                       ast_device_state_changed(chan->name);
-                       manager_event(EVENT_FLAG_CALL, "Newchannel",
-                               "Channel: %s\r\n"
-                               "State: %s\r\n"
-                               "CallerID: %s\r\n"
-                               "CallerIDName: %s\r\n"
-                               "Uniqueid: %s\r\n",
-                               chan->name, ast_state2str(chan->_state), 
-                               chan->cid.cid_num ? chan->cid.cid_num : "<unknown>", 
-                               chan->cid.cid_name ? chan->cid.cid_name : "<unknown>", 
-                               chan->uniqueid);
-               } else {
-                       manager_event(EVENT_FLAG_CALL, "Newstate", 
-                               "Channel: %s\r\n"
-                               "State: %s\r\n"
-                               "CallerID: %s\r\n"
-                               "CallerIDName: %s\r\n"
-                               "Uniqueid: %s\r\n",
-                               chan->name, ast_state2str(chan->_state), 
-                               chan->cid.cid_num ? chan->cid.cid_num : "<unknown>", 
-                               chan->cid.cid_name ? chan->cid.cid_name : "<unknown>", 
-                               chan->uniqueid);
-               }
-       }
+       int oldstate = chan->_state;
+
+       if (oldstate == state)
+               return 0;
+
+       chan->_state = state;
+       ast_device_state_changed(chan->name);
+       manager_event(EVENT_FLAG_CALL,
+                     (oldstate == AST_STATE_DOWN) ? "Newchannel" : "Newstate",
+                     "Channel: %s\r\n"
+                     "State: %s\r\n"
+                     "CallerID: %s\r\n"
+                     "CallerIDName: %s\r\n"
+                     "Uniqueid: %s\r\n",
+                     chan->name, ast_state2str(chan->_state), 
+                     chan->cid.cid_num ? chan->cid.cid_num : "<unknown>", 
+                     chan->cid.cid_name ? chan->cid.cid_name : "<unknown>", 
+                     chan->uniqueid);
+
        return 0;
 }
 
index 4b9e537..562108a 100755 (executable)
@@ -9114,9 +9114,8 @@ static int iax2_devicestate(void *data)
                        /* Peer is registered, or have default IP address
                           and a valid registration */
                        if (p->historicms == 0 || p->historicms <= p->maxms)
-                               res = AST_DEVICE_NOT_INUSE;
-                       else
-                               res = AST_DEVICE_UNKNOWN;       /* Not reachable */
+                               /* let the core figure out whether it is in use or not */
+                               res = AST_DEVICE_UNKNOWN;       
                }
        } else {
                if (option_debug > 2) 
index c3e7c52..6701a80 100755 (executable)
@@ -109,9 +109,16 @@ int ast_device_state(const char *device)
                return ast_parse_device_state(device);  /* No, try the generic function */
        else {
                res = chan_tech->devicestate(number);   /* Ask the channel driver for device state */
-               if (res == AST_DEVICE_UNKNOWN)
-                       return ast_parse_device_state(device);
-               else
+               if (res == AST_DEVICE_UNKNOWN) {
+                       res = ast_parse_device_state(device);
+                       /* at this point we know the device exists, but the channel driver
+                          could not give us a state; if there is no channel state available,
+                          it must be 'not in use'
+                       */
+                       if (res == AST_DEVICE_UNKNOWN)
+                               res = AST_DEVICE_NOT_INUSE;
+                       return res;
+               } else
                        return res;
        }
 }