]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Update the SLAStation application to account for the case where the SLA thread
authorRussell Bryant <russell@russellbryant.com>
Thu, 15 Nov 2007 17:19:28 +0000 (17:19 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 15 Nov 2007 17:19:28 +0000 (17:19 +0000)
has a call out to the station,  but the user has pressed a line button to answer
the call instead of picking up the handset.  If they do, the phone sends out a
new INVITE.  So, the SLAStation app must check to see if it is picking up a
ringing trunk, and ensure that the other stations stop ringing.

(reported internally, patched by me, tested by mogorman)

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

apps/app_meetme.c

index ef5af4c403dacd7eb1e774417840f0a34b5bf608..63cc0f346b0f978867a979e3ec92fc1c9cd4c94f 100644 (file)
@@ -4171,6 +4171,29 @@ static int sla_station_exec(struct ast_channel *chan, void *data)
                        trunk_ref->state = SLA_TRUNK_STATE_UP;
                        ast_device_state_changed("SLA:%s_%s", station->name, trunk_ref->trunk->name);
                }
+       } else if (trunk_ref->state == SLA_TRUNK_STATE_RINGING) {
+               struct sla_ringing_trunk *ringing_trunk;
+
+               ast_mutex_lock(&sla.lock);
+               AST_LIST_TRAVERSE_SAFE_BEGIN(&sla.ringing_trunks, ringing_trunk, entry) {
+                       if (ringing_trunk->trunk == trunk_ref->trunk) {
+                               AST_LIST_REMOVE_CURRENT(&sla.ringing_trunks, entry);
+                               break;
+                       }
+               }
+               AST_LIST_TRAVERSE_SAFE_END
+               ast_mutex_unlock(&sla.lock);
+
+               if (ringing_trunk) {
+                       ast_answer(ringing_trunk->trunk->chan);
+                       sla_change_trunk_state(ringing_trunk->trunk, SLA_TRUNK_STATE_UP, ALL_TRUNK_REFS, NULL);
+
+                       free(ringing_trunk);
+
+                       /* Queue up reprocessing ringing trunks, and then ringing stations again */
+                       sla_queue_event(SLA_EVENT_RINGING_TRUNK);
+                       sla_queue_event(SLA_EVENT_DIAL_STATE);
+               }
        }
 
        trunk_ref->chan = chan;