Index: apps/app_privacy.c =================================================================== RCS file: /usr/cvsroot/asterisk/apps/app_privacy.c,v retrieving revision 1.21 diff -u -r1.21 app_privacy.c --- apps/app_privacy.c 6 Nov 2005 15:09:46 -0000 1.21 +++ apps/app_privacy.c 7 Nov 2005 17:17:44 -0000 @@ -53,18 +53,26 @@ static char *synopsis = "Require phone number to be entered, if no CallerID sent"; static char *descrip = - " PrivacyManager: If no Caller*ID is sent, PrivacyManager answers the\n" - "channel and asks the caller to enter their phone number.\n" - "The caller is given 3 attempts. If after 3 attempts, they do not enter\n" - "at least a 10 digit phone number, and if there exists a priority n + 101,\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, it returns 0. Does nothing if Caller*ID was received on the\n" + " PrivacyManager([maxretries[|minlength[|options]]]): If no Caller*ID \n" + "is sent, PrivacyManager answers the channel and ask the caller to\n" + "enter their phone number. The caller is given 3 attempts to do so.\n" + "The application returns 0 and does nothing if Caller*ID was received on the\n" "channel.\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" -; + " 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 command line\n" + " parameters. Doing so supercedes any values set in privacy.conf and will cause\n" + " the application to forego a read on that config file completely.\n" + " The option string may contain zero or the following character: \n" + " 'j' -- jump to n+101 priority after 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; @@ -78,11 +86,18 @@ int retries; int maxretries = 3; int minlength = 10; - int x; + int x = 0; char *s; char phone[30]; 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); if (!ast_strlen_zero(chan->cid.cid_num)) { @@ -97,9 +112,55 @@ 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*/ res = ast_safe_sleep(chan, 1000); @@ -108,21 +169,6 @@ if (!res) 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*/ for (retries = 0; retries < maxretries; retries++) { if (!res) @@ -154,9 +200,11 @@ ast_set_callerid (chan, phone, "Privacy Manager", NULL); if (option_verbose > 2) ast_verbose (VERBOSE_PREFIX_3 "Changed Caller*ID to %s\n",phone); + pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "SUCCESS"); } else { - /* Send the call to n+101 priority, where n is the current priority */ - ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101); + if (priority_jump || option_priority_jumping) + ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101); + pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "FAILED"); } if (cfg) ast_config_destroy(cfg);