Allow multiple groups (group categories)
authorMark Spencer <markster@digium.com>
Fri, 16 Jul 2004 04:32:17 +0000 (04:32 +0000)
committerMark Spencer <markster@digium.com>
Fri, 16 Jul 2004 04:32:17 +0000 (04:32 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3445 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_groupcount.c

index b97a774..7835d58 100755 (executable)
@@ -29,12 +29,12 @@ static char *app_group_count = "GetGroupCount";
 static char *app_group_set = "SetGroup";
 static char *app_group_check = "CheckGroup";
 
-static char *group_count_synopsis = "GetGroupCount([groupname])";
-static char *group_set_synopsis = "SetGroup([groupname])";
-static char *group_check_synopsis = "CheckGroup(max)";
+static char *group_count_synopsis = "GetGroupCount([groupname][@category])";
+static char *group_set_synopsis = "SetGroup(groupname[@category])";
+static char *group_check_synopsis = "CheckGroup(max[@category])";
 
 static char *group_count_descrip =
-"GetGroupCount([group])\n"
+"GetGroupCount([group][@category])\n"
 "  Calculates the group count for the specified group, or uses\n"
 "the current channel's group if not specifed (and non-empty).\n"
 "Stores result in GROUPCOUNT.  Always returns 0.\n";
@@ -56,7 +56,9 @@ STANDARD_LOCAL_USER;
 
 LOCAL_USER_DECL;
 
-static int group_get_count(char *group)
+#define DEFAULT_CATEGORY "GROUP"
+
+static int group_get_count(char *group, char *category)
 {
        struct ast_channel *chan;
        int count = 0;
@@ -64,7 +66,7 @@ static int group_get_count(char *group)
        if (group && !ast_strlen_zero(group)) {
                chan = ast_channel_walk_locked(NULL);
                while(chan) {
-                       test = pbx_builtin_getvar_helper(chan, "GROUP");
+                       test = pbx_builtin_getvar_helper(chan, category);
                        if (test && !strcasecmp(test, group))
                                count++;
                        ast_mutex_unlock(&chan->lock);
@@ -80,17 +82,31 @@ static int group_count_exec(struct ast_channel *chan, void *data)
        int count;
        struct localuser *u;
        char *group=NULL;
-       char ret[80];
+       char *cat = NULL;
+       char ret[80]="";
+       char tmp[256]="";
 
        LOCAL_USER_ADD(u);
 
        /* Check and parse arguments */
        if (data && !ast_strlen_zero(data)) {
-               group = (char *)data;
-       } else {
-               group = pbx_builtin_getvar_helper(chan, "GROUP");
+               strncpy(tmp, data, sizeof(tmp) - 1);
+               group = tmp;
+               cat = strchr(tmp, '@');
+               if (cat) {
+                       *cat = '\0';
+                       cat++;
+               }
+       }
+       if (cat)
+               snprintf(ret, sizeof(ret), "GROUP_%s", cat);
+       else
+               strncpy(ret, DEFAULT_CATEGORY, sizeof(ret) - 1);
+
+       if (!group || ast_strlen_zero(group)) {
+               group = pbx_builtin_getvar_helper(chan, ret);
        }
-       count = group_get_count(group);
+       count = group_get_count(group, ret);
        snprintf(ret, sizeof(ret), "%d", count);
        pbx_builtin_setvar_helper(chan, "GROUPCOUNT", ret);
        LOCAL_USER_REMOVE(u);
@@ -101,13 +117,31 @@ static int group_set_exec(struct ast_channel *chan, void *data)
 {
        int res=0;
        struct localuser *u;
+       char ret[80] = "";
+       char tmp[256] = "";
+       char *cat=NULL, *group=NULL;
 
        LOCAL_USER_ADD(u);
+
        /* Check and parse arguments */
        if (data && !ast_strlen_zero(data)) {
-               pbx_builtin_setvar_helper(chan, "GROUP", (char *)data);
+               strncpy(tmp, data, sizeof(tmp) - 1);
+               group = tmp;
+               cat = strchr(tmp, '@');
+               if (cat) {
+                       *cat = '\0';
+                       cat++;
+               }
+       }
+       if (cat)
+               snprintf(ret, sizeof(ret), "GROUP_%s", cat);
+       else
+               strncpy(ret, DEFAULT_CATEGORY, sizeof(ret) - 1);
+
+       if (group && !ast_strlen_zero(group)) {
+               pbx_builtin_setvar_helper(chan, ret, group);
        } else
-               ast_log(LOG_WARNING, "GroupSet requires an argument (group name)\n");
+               ast_log(LOG_WARNING, "SetGroup requires an argument (group name)\n");
 
        LOCAL_USER_REMOVE(u);
        return res;
@@ -118,19 +152,37 @@ static int group_check_exec(struct ast_channel *chan, void *data)
        int res=0;
        int max, count;
        struct localuser *u;
+       char ret[80] = "";
+       char tmp[256] = "";
+       char *cat, *group;
 
        LOCAL_USER_ADD(u);
 
-       if (data && (sscanf((char *)data, "%i", &max) == 1) && (max > -1)) {    
-               count = group_get_count(pbx_builtin_getvar_helper(chan, "GROUP"));
-               if (count > max) {
-                       if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
-                               chan->priority += 100;
-                       else
-                               res = -1;
+       if (data && !ast_strlen_zero(data)) {
+               strncpy(tmp, data, sizeof(tmp) - 1);
+               group = tmp;
+               cat = strchr(tmp, '@');
+               if (cat) {
+                       *cat = '\0';
+                       cat++;
                }
+               if ((sscanf((char *)tmp, "%i", &max) == 1) && (max > -1)) {
+                       if (cat)
+                               snprintf(ret, sizeof(ret), "GROUP_%s", cat);
+                       else
+                               strncpy(ret, DEFAULT_CATEGORY, sizeof(ret) - 1);
+                       
+                       count = group_get_count(pbx_builtin_getvar_helper(chan, ret), ret);
+                       if (count > max) {
+                               if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
+                                       chan->priority += 100;
+                               else
+                                       res = -1;
+                       }
+               } else
+                       ast_log(LOG_WARNING, "CheckGroup requires a positive integer argument (max)\n");
        } else
-               ast_log(LOG_WARNING, "GroupCheck requires a positive integer argument (max)\n");
+               ast_log(LOG_WARNING, "CheckGroup requires an argument(max)\n");
        LOCAL_USER_REMOVE(u);
        return res;
 }