Skip to content
Snippets Groups Projects
Commit 5eceb929 authored by Kevin P. Fleming's avatar Kevin P. Fleming
Browse files

issue #5642

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6998 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent 8f536c77
Branches
Tags
No related merge requests found
2005-11-07 Kevin P. Fleming <kpfleming@digium.com> 2005-11-07 Kevin P. Fleming <kpfleming@digium.com>
* apps/app_privacy.c: upgrade to new arg/option API and implement priority jumping control
* apps/app_sendtext.c: upgrade to new arg/option API and implement priority jumping control * apps/app_sendtext.c: upgrade to new arg/option API and implement priority jumping control
* apps/app_transfer.c: upgrade to new arg/option API and implement priority jumping control * apps/app_transfer.c: upgrade to new arg/option API and implement priority jumping control
......
...@@ -53,17 +53,24 @@ static char *app = "PrivacyManager"; ...@@ -53,17 +53,24 @@ static char *app = "PrivacyManager";
static char *synopsis = "Require phone number to be entered, if no CallerID sent"; static char *synopsis = "Require phone number to be entered, if no CallerID sent";
static char *descrip = static char *descrip =
" PrivacyManager: If no Caller*ID is sent, PrivacyManager answers the\n" " PrivacyManager([maxretries[|minlength[|options]]]): If no Caller*ID \n"
"channel and asks the caller to enter their phone number.\n" "is sent, PrivacyManager answers the channel and asks the caller to\n"
"The caller is given 3 attempts. If after 3 attempts, they do not enter\n" "enter their phone number. The caller is given 3 attempts to do so.\n"
"at least a 10 digit phone number, and if there exists a priority n + 101,\n" "The application does nothing if Caller*ID was received on the channel.\n"
"where 'n' is the priority of the current instance, then the\n"
"channel will be setup to continue at that priority level.\n"
"Otherwise, the call is hungup. Does nothing if Caller*ID was received on the\n"
"channel.\n"
" Configuration file privacy.conf contains two variables:\n" " Configuration file privacy.conf contains two variables:\n"
" maxretries default 3 -maximum number of attempts the caller is allowed to input a callerid.\n" " maxretries default 3 -maximum number of attempts the caller is allowed \n"
" to input a callerid.\n"
" minlength default 10 -minimum allowable digits in the input callerid number.\n" " minlength default 10 -minimum allowable digits in the input callerid number.\n"
"If you don't want to use the config file and have an i/o operation with\n"
"every call, you can also specify maxretries and minlength as application\n"
"parameters. Doing so supercedes any values set in privacy.conf.\n"
"The option string may contain the following character: \n"
" 'j' -- jump to n+101 priority after <maxretries> failed attempts to collect\n"
" the minlength number of digits.\n"
"The application sets the following channel variable upon completion: \n"
"PRIVACYMGRSTATUS The status of the privacy manager's attempt to collect \n"
" a phone number from the user. A text string that is either:\n"
" SUCCESS | FAILED \n"
; ;
STANDARD_LOCAL_USER; STANDARD_LOCAL_USER;
...@@ -78,11 +85,18 @@ static int privacy_exec (struct ast_channel *chan, void *data) ...@@ -78,11 +85,18 @@ static int privacy_exec (struct ast_channel *chan, void *data)
int retries; int retries;
int maxretries = 3; int maxretries = 3;
int minlength = 10; int minlength = 10;
int x; int x = 0;
char *s; char *s;
char phone[30]; char phone[30];
struct localuser *u; struct localuser *u;
struct ast_config *cfg; struct ast_config *cfg = NULL;
char *parse = NULL;
int priority_jump = 0;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(maxretries);
AST_APP_ARG(minlength);
AST_APP_ARG(options);
);
LOCAL_USER_ADD (u); LOCAL_USER_ADD (u);
if (!ast_strlen_zero(chan->cid.cid_num)) { if (!ast_strlen_zero(chan->cid.cid_num)) {
...@@ -97,9 +111,55 @@ static int privacy_exec (struct ast_channel *chan, void *data) ...@@ -97,9 +111,55 @@ static int privacy_exec (struct ast_channel *chan, void *data)
return -1; return -1;
} }
} }
/*Read in the config file*/
cfg = ast_config_load(PRIV_CONFIG); if (!ast_strlen_zero((char *)data))
{
parse = ast_strdupa(data);
if (!parse) {
ast_log(LOG_ERROR, "Out of memory!\n");
LOCAL_USER_REMOVE(u);
return -1;
}
AST_STANDARD_APP_ARGS(args, parse);
if (args.maxretries) {
if (sscanf(args.maxretries, "%d", &x) == 1)
maxretries = x;
else
ast_log(LOG_WARNING, "Invalid max retries argument\n");
}
if (args.minlength) {
if (sscanf(args.minlength, "%d", &x) == 1)
minlength = x;
else
ast_log(LOG_WARNING, "Invalid min length argument\n");
}
if (args.options)
if (strchr(args.options, 'j'))
priority_jump = 1;
}
if (!x)
{
/*Read in the config file*/
cfg = ast_config_load(PRIV_CONFIG);
if (cfg && (s = ast_variable_retrieve(cfg, "general", "maxretries"))) {
if (sscanf(s, "%d", &x) == 1)
maxretries = x;
else
ast_log(LOG_WARNING, "Invalid max retries argument\n");
}
if (cfg && (s = ast_variable_retrieve(cfg, "general", "minlength"))) {
if (sscanf(s, "%d", &x) == 1)
minlength = x;
else
ast_log(LOG_WARNING, "Invalid min length argument\n");
}
}
/*Play unidentified call*/ /*Play unidentified call*/
res = ast_safe_sleep(chan, 1000); res = ast_safe_sleep(chan, 1000);
...@@ -108,21 +168,6 @@ static int privacy_exec (struct ast_channel *chan, void *data) ...@@ -108,21 +168,6 @@ static int privacy_exec (struct ast_channel *chan, void *data)
if (!res) if (!res)
res = ast_waitstream(chan, ""); res = ast_waitstream(chan, "");
if (cfg && (s = ast_variable_retrieve(cfg, "general", "maxretries"))) {
if (sscanf(s, "%d", &x) == 1) {
maxretries = x;
} else {
ast_log(LOG_WARNING, "Invalid max retries argument\n");
}
}
if (cfg && (s = ast_variable_retrieve(cfg, "general", "minlength"))) {
if (sscanf(s, "%d", &x) == 1) {
minlength = x;
} else {
ast_log(LOG_WARNING, "Invalid min length argument\n");
}
}
/*Ask for 10 digit number, give 3 attempts*/ /*Ask for 10 digit number, give 3 attempts*/
for (retries = 0; retries < maxretries; retries++) { for (retries = 0; retries < maxretries; retries++) {
if (!res) if (!res)
...@@ -154,9 +199,11 @@ static int privacy_exec (struct ast_channel *chan, void *data) ...@@ -154,9 +199,11 @@ static int privacy_exec (struct ast_channel *chan, void *data)
ast_set_callerid (chan, phone, "Privacy Manager", NULL); ast_set_callerid (chan, phone, "Privacy Manager", NULL);
if (option_verbose > 2) if (option_verbose > 2)
ast_verbose (VERBOSE_PREFIX_3 "Changed Caller*ID to %s\n",phone); ast_verbose (VERBOSE_PREFIX_3 "Changed Caller*ID to %s\n",phone);
pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "SUCCESS");
} else { } else {
/* Send the call to n+101 priority, where n is the current priority */ if (priority_jump || option_priority_jumping)
ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101); ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101);
pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "FAILED");
} }
if (cfg) if (cfg)
ast_config_destroy(cfg); ast_config_destroy(cfg);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment