diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-07-25 17:26:38 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-07-25 17:26:38 +0000 |
commit | 343381c9f3496701a7315dd25b54cbccc3af665a (patch) | |
tree | c8d76255727178f26f114085640edbb13d811cc3 /channels/chan_agent.c | |
parent | 2db21ac2f49ceb4dabce0b5ad513d214ff1ab145 (diff) |
Merged revisions 133665 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r133665 | tilghman | 2008-07-25 12:24:43 -0500 (Fri, 25 Jul 2008) | 16 lines
Merged revisions 133649 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r133649 | tilghman | 2008-07-25 12:19:39 -0500 (Fri, 25 Jul 2008) | 8 lines
Fix some errant device states by making the devicestate API more strict in
terms of the device argument (only without the unique identifier appended).
(closes issue #12771)
Reported by: davidw
Patches:
20080717__bug12771.diff.txt uploaded by Corydon76 (license 14)
Tested by: davidw, jvandal, murf
........
................
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@133671 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_agent.c')
-rw-r--r-- | channels/chan_agent.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c index 3925c7ea5..5c739234d 100644 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -265,6 +265,18 @@ static void agent_devicestate_cb(const struct ast_event *event, void *unused) const char *device; enum ast_device_state state; + state = ast_event_get_ie_uint(event, AST_EVENT_IE_STATE); + device = ast_event_get_ie_str(event, AST_EVENT_IE_DEVICE); + + if (ast_strlen_zero(device)) { + return; + } + + /* Skip Agent status */ + if (!strncasecmp(device, "Agent/", 6)) { + return; + } + /* Try to be safe, but don't deadlock */ for (i = 0; i < 10; i++) { if ((res = AST_LIST_TRYLOCK(&agents)) == 0) { @@ -275,14 +287,6 @@ static void agent_devicestate_cb(const struct ast_event *event, void *unused) return; } - state = ast_event_get_ie_uint(event, AST_EVENT_IE_STATE); - device = ast_event_get_ie_str(event, AST_EVENT_IE_DEVICE); - - if (ast_strlen_zero(device)) { - AST_LIST_UNLOCK(&agents); - return; - } - AST_LIST_TRAVERSE(&agents, p, list) { ast_mutex_lock(&p->lock); if (p->chan) { @@ -505,6 +509,7 @@ static struct ast_frame *agent_read(struct ast_channel *ast) } p->chan = NULL; p->inherited_devicestate = -1; + ast_device_state_changed("Agent/%s", p->agent); p->acknowledged = 0; } } else { @@ -720,6 +725,7 @@ static int agent_call(struct ast_channel *ast, char *dest, int timeout) /* Agent hung-up */ p->chan = NULL; p->inherited_devicestate = -1; + ast_device_state_changed("Agent/%s", p->agent); } if (!res) { @@ -841,6 +847,7 @@ static int agent_hangup(struct ast_channel *ast) ast_hangup(p->chan); p->chan = NULL; p->inherited_devicestate = -1; + ast_device_state_changed("Agent/%s", p->agent); } ast_debug(1, "Hungup, howlong is %d, autologoff is %d\n", howlong, p->autologoff); if ((p->deferlogoff) || (howlong && p->autologoff && (howlong > p->autologoff))) { |