diff options
-rwxr-xr-x | apps/app_groupcount.c | 87 | ||||
-rwxr-xr-x | doc/README.variables | 1 |
2 files changed, 85 insertions, 3 deletions
diff --git a/apps/app_groupcount.c b/apps/app_groupcount.c index f0c86c4d1..1531f90af 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 43257f9d6..68784b149 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 |