From 2be3c7ab57ccac9cc2d954083b39fedd7b6f56b7 Mon Sep 17 00:00:00 2001
From: "Kevin P. Fleming" <kpfleming@digium.com>
Date: Wed, 4 May 2005 04:13:31 +0000
Subject: [PATCH] add GROUP_COUNT and GROU_MATCH_COUNT functions, deprecate
 GroupCount and GroupMatchCount apps, remove GROUPCOUNT variable from
 README.variables (bug #4133, with doc update)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5568 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/app_groupcount.c | 87 ++++++++++++++++++++++++++++++++++++++++++-
 doc/README.variables  |  1 -
 2 files changed, 85 insertions(+), 3 deletions(-)

diff --git a/apps/app_groupcount.c b/apps/app_groupcount.c
index f0c86c4d15..1531f90afc 100755
--- a/apps/app_groupcount.c
+++ b/apps/app_groupcount.c
@@ -17,6 +17,7 @@
 #include <string.h>
 #include <sys/types.h>
 #include <regex.h>
+
 #include "asterisk/file.h"
 #include "asterisk/logger.h"
 #include "asterisk/options.h"
@@ -31,6 +32,70 @@ STANDARD_LOCAL_USER;
 
 LOCAL_USER_DECL;
 
+static int deprecation_warning = 0;
+
+static char *group_count_function_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
+{
+	int count;
+	struct localuser *u;
+	char group[80] = "";
+	char category[80] = "";
+	char *grp;
+
+	LOCAL_USER_ADD(u);
+
+	ast_app_group_split_group(data, group, sizeof(group), category, sizeof(category));
+
+	if (ast_strlen_zero(group)) {
+		grp = pbx_builtin_getvar_helper(chan, category);
+		strncpy(group, grp, sizeof(group) - 1);
+	}
+
+	count = ast_app_group_get_count(group, category);
+	snprintf(buf, len, "%d", count);
+
+	LOCAL_USER_REMOVE(u);
+
+	return buf;
+}
+
+static struct ast_custom_function_obj group_count_function_obj = {
+	.name = "GROUP_COUNT",
+	.desc = "Calculates the group count for the specified group, or uses the current channel's group if not specifed (and non-empty).",
+	.syntax = "GROUP_COUNT([groupname][@category])",
+	.read = group_count_function_read,
+	.write = NULL,
+};
+
+static char *group_match_count_function_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
+{
+	int count;
+	struct localuser *u;
+	char group[80] = "";
+	char category[80] = "";
+
+	LOCAL_USER_ADD(u);
+
+	ast_app_group_split_group(data, group, sizeof(group), category, sizeof(category));
+
+	if (!ast_strlen_zero(group)) {
+		count = ast_app_group_match_get_count(group, category);
+		snprintf(buf, len, "%d", count);
+	}
+
+	LOCAL_USER_REMOVE(u);
+
+	return buf;
+}
+
+static struct ast_custom_function_obj group_match_count_function_obj = {
+	.name = "GROUP_MATCH_COUNT",
+	.desc = "Calculates the group count for all groups that match the specified pattern. Uses standard regular expression matching (see regex(7)).",
+	.syntax = "GROUP_MATCH_COUNT(groupmatch[@category])",
+	.read = group_match_count_function_read,
+	.write = NULL,
+};
+
 static int group_count_exec(struct ast_channel *chan, void *data)
 {
 	int res = 0;
@@ -43,6 +108,11 @@ static int group_count_exec(struct ast_channel *chan, void *data)
 
 	LOCAL_USER_ADD(u);
 
+	if (!deprecation_warning) {
+	        ast_log(LOG_WARNING, "The GetGroupCount and GetGroupMatchCount applications have been deprecated, please use the GROUP_COUNT and GROUP_MATCH_COUNT functions.\n");
+		deprecation_warning = 1;
+	}
+
 	ast_app_group_split_group(data, group, sizeof(group), category, sizeof(category));
 
 	if (ast_strlen_zero(group)) {
@@ -70,6 +140,11 @@ static int group_match_count_exec(struct ast_channel *chan, void *data)
 
 	LOCAL_USER_ADD(u);
 
+	if (!deprecation_warning) {
+	        ast_log(LOG_WARNING, "The GetGroupCount and GetGroupMatchCount applications have been deprecated, please use the GROUP_COUNT and GROUP_MATCH_COUNT functions.\n");
+		deprecation_warning = 1;
+	}
+
 	ast_app_group_split_group(data, group, sizeof(group), category, sizeof(category));
 
 	if (!ast_strlen_zero(group)) {
@@ -195,7 +270,9 @@ static char *group_count_descrip =
 "Usage: GetGroupCount([groupname][@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";
+"Stores result in GROUPCOUNT.  Always returns 0.\n"
+"This application has been deprecated, please use the function\n"
+"GroupCount.\n";
 
 static char *group_set_descrip =
 "Usage: SetGroup(groupname[@category])\n"
@@ -214,7 +291,9 @@ static char *group_match_count_descrip =
 "Usage: GetGroupMatchCount(groupmatch[@category])\n"
 "  Calculates the group count for all groups that match the specified\n"
 "pattern. Uses standard regular expression matching (see regex(7)).\n"
-"Stores result in GROUPCOUNT.  Always returns 0.\n";
+"Stores result in GROUPCOUNT.  Always returns 0.\n"
+"This application has been deprecated, please use the function\n"
+"GroupMatchCount.\n";
 
 static char show_channels_usage[] = 
 "Usage: group show channels [pattern]\n"
@@ -232,6 +311,8 @@ int unload_module(void)
 	res |= ast_unregister_application(app_group_set);
 	res |= ast_unregister_application(app_group_check);
 	res |= ast_unregister_application(app_group_match_count);
+	res |= ast_custom_function_unregister(&group_count_function_obj);
+	res |= ast_custom_function_unregister(&group_match_count_function_obj);
 	return res;
 }
 
@@ -242,6 +323,8 @@ int load_module(void)
 	res |= ast_register_application(app_group_set, group_set_exec, group_set_synopsis, group_set_descrip);
 	res |= ast_register_application(app_group_check, group_check_exec, group_check_synopsis, group_check_descrip);
 	res |= ast_register_application(app_group_match_count, group_match_count_exec, group_match_count_synopsis, group_match_count_descrip);
+	res |= ast_custom_function_register(&group_count_function_obj);
+	res |= ast_custom_function_register(&group_match_count_function_obj);
 	ast_cli_register(&cli_show_channels);
 	return res;
 }
diff --git a/doc/README.variables b/doc/README.variables
index 43257f9d6f..68784b1493 100755
--- a/doc/README.variables
+++ b/doc/README.variables
@@ -359,7 +359,6 @@ ${CURL}			* Resulting page content for curl()
 ${ENUM}			* Result of application EnumLookup
 ${EXITCONTEXT}		Context to exit to in IVR menu (app background())
 			or in the RetryDial() application
-${GROUPCOUNT}		* Result from groupcount()
 ${MONITOR}		* Set to "TRUE" if the channel is/has been monitored (app monitor())
 ${MONITOR_EXEC}		Application to execute after monitoring a call
 ${MONITOR_EXEC_ARGS}	Arguments to application
-- 
GitLab