Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv13491/apps

Modified Files:
        app_privacy.c 
Log Message:
issue #5642


Index: app_privacy.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_privacy.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- app_privacy.c       7 Nov 2005 22:01:22 -0000       1.22
+++ app_privacy.c       7 Nov 2005 23:03:28 -0000       1.23
@@ -53,17 +53,24 @@
 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, the call is hungup.  Does nothing if Caller*ID was received on 
the\n"
-  "channel.\n"
+  "  PrivacyManager([maxretries[|minlength[|options]]]): If no Caller*ID \n"
+  "is sent, PrivacyManager answers the channel and asks the caller to\n"
+  "enter their phone number. The caller is given 3 attempts to do so.\n"
+  "The application does nothing if Caller*ID was received on the 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 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;
@@ -78,11 +85,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 +111,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 +168,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 +199,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);

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to