Add 'kick all' capability to ConfBridge CLI command
authorMatthew Jordan <mjordan@digium.com>
Tue, 16 Jul 2013 22:33:27 +0000 (22:33 +0000)
committerMatthew Jordan <mjordan@digium.com>
Tue, 16 Jul 2013 22:33:27 +0000 (22:33 +0000)
This patch adds the ability to kick all users out of a conference from the
ConfBridge kick CLI command. It is invoked by passing 'all' as the channel
parameter to the CLI command, i.e., "confbridge kick <conf> all".

Note that this patch was modified slightly to conform to trunk.

(closes issue ASTERISK-21827)
Reported by: dorianlogan
patches:
  kickall-patch_v2.diff uploaded by dorianlogan (License 6504)

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

CHANGES
apps/app_confbridge.c

diff --git a/CHANGES b/CHANGES
index d1dfd5f..56389dc 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -26,6 +26,12 @@ AgentMonitorOutgoing
  * Application removed.  It was a holdover from when AgentCallbackLogin was
    removed.
 
+ConfBridge
+------------------
+ * All participants in a bridge can now be kicked out of a conference room
+   by specifying the channel parameter as 'all' in the ConfBridge kick CLI
+   command, i.e., "confbridge kick <conference> all"
+
 ForkCDR
 ------------------
  * ForkCDR no longer automatically resets the forked CDR. See the 'r' option
index 8919b7e..8dd2686 100644 (file)
@@ -2069,6 +2069,7 @@ int conf_handle_dtmf(struct ast_bridge_channel *bridge_channel,
 
 static int kick_conference_participant(struct confbridge_conference *conference, const char *channel)
 {
+       int res = -1;
        struct confbridge_user *user = NULL;
 
        SCOPED_AO2LOCK(bridge_lock, conference);
@@ -2077,6 +2078,10 @@ static int kick_conference_participant(struct confbridge_conference *conference,
                        user->kicked = 1;
                        ast_bridge_remove(conference->bridge, user->chan);
                        return 0;
+               } else if (!strcasecmp("all", channel)) {
+                       user->kicked = 1;
+                       ast_bridge_remove(conference->bridge, user->chan);
+                       res = 0;
                }
        }
        AST_LIST_TRAVERSE(&conference->waiting_list, user, list) {
@@ -2084,10 +2089,14 @@ static int kick_conference_participant(struct confbridge_conference *conference,
                        user->kicked = 1;
                        ast_bridge_remove(conference->bridge, user->chan);
                        return 0;
+               } else if (!strcasecmp("all", channel)) {
+                       user->kicked = 1;
+                       ast_bridge_remove(conference->bridge, user->chan);
+                       res = 0;
                }
        }
 
-       return -1;
+       return res;
 }
 
 static char *complete_confbridge_name(const char *line, const char *word, int pos, int state)