move a large block related to privacy handling to a separate function.
authorLuigi Rizzo <rizzo@icir.org>
Tue, 19 Dec 2006 09:15:23 +0000 (09:15 +0000)
committerLuigi Rizzo <rizzo@icir.org>
Tue, 19 Dec 2006 09:15:23 +0000 (09:15 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@48573 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_dial.c

index 4cf1133..eba3ff5 100644 (file)
@@ -1054,6 +1054,117 @@ static int do_privacy(struct ast_channel *chan, struct ast_channel *peer,
        }
 }
 
+/*! \brief returns 1 if successful, 0 or <0 if the caller should 'goto out' */
+static int setup_privacy_args(struct privacy_args *pa,
+       struct ast_flags *opts, char *opt_args[], struct ast_channel *chan)
+{
+       char callerid[60];
+       int res;
+       char *l;
+
+       if (!ast_strlen_zero(chan->cid.cid_num)) {
+               l = ast_strdupa(chan->cid.cid_num);
+               ast_shrink_phone_number(l);
+               if (ast_test_flag(opts, OPT_PRIVACY) ) {
+                       if (option_verbose > 2)
+                               ast_verbose(VERBOSE_PREFIX_3  "Privacy DB is '%s', clid is '%s'\n",
+                                            opt_args[OPT_ARG_PRIVACY], l);
+                       pa->privdb_val = ast_privacy_check(opt_args[OPT_ARG_PRIVACY], l);
+               } else {
+                       if (option_verbose > 2)
+                               ast_verbose(VERBOSE_PREFIX_3  "Privacy Screening, clid is '%s'\n", l);
+                       pa->privdb_val = AST_PRIVACY_UNKNOWN;
+               }
+       } else {
+               char *tnam, *tn2;
+
+               tnam = ast_strdupa(chan->name);
+               /* clean the channel name so slashes don't try to end up in disk file name */
+               for (tn2 = tnam; *tn2; tn2++) {
+                       if (*tn2=='/')  /* any other chars to be afraid of? */
+                               *tn2 = '=';
+               }
+               if (option_verbose > 2)
+                       ast_verbose(VERBOSE_PREFIX_3  "Privacy-- callerid is empty\n");
+
+               snprintf(callerid, sizeof(callerid), "NOCALLERID_%s%s", chan->exten, tnam);
+               l = callerid;
+               pa->privdb_val = AST_PRIVACY_UNKNOWN;
+       }
+       
+       ast_copy_string(pa->privcid,l,sizeof(pa->privcid));
+
+       if( strncmp(pa->privcid,"NOCALLERID",10) != 0 && ast_test_flag(opts, OPT_SCREEN_NOCLID) ) { /* if callerid is set, and ast_test_flag(&opts, OPT_SCREEN_NOCLID) is set also */  
+               if (option_verbose > 2)
+                       ast_verbose( VERBOSE_PREFIX_3  "CallerID set (%s); N option set; Screening should be off\n", pa->privcid);
+               pa->privdb_val = AST_PRIVACY_ALLOW;
+       } else if (ast_test_flag(opts, OPT_SCREEN_NOCLID) && strncmp(pa->privcid,"NOCALLERID",10) == 0 ) {
+               if (option_verbose > 2)
+                       ast_verbose( VERBOSE_PREFIX_3  "CallerID blank; N option set; Screening should happen; dbval is %d\n", pa->privdb_val);
+       }
+       
+       if (pa->privdb_val == AST_PRIVACY_DENY ) {
+               ast_copy_string(pa->status, "NOANSWER", sizeof(pa->status));
+               if (option_verbose > 2)
+                       ast_verbose( VERBOSE_PREFIX_3  "Privacy DB reports PRIVACY_DENY for this callerid. Dial reports unavailable\n");
+               return 0;
+       } else if (pa->privdb_val == AST_PRIVACY_KILL ) {
+               ast_copy_string(pa->status, "DONTCALL", sizeof(pa->status));
+               if (ast_opt_priority_jumping || ast_test_flag(opts, OPT_PRIORITY_JUMP)) {
+                       ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 201);
+               }
+               return 0; /* Is this right? */
+       } else if (pa->privdb_val == AST_PRIVACY_TORTURE ) {
+               ast_copy_string(pa->status, "TORTURE", sizeof(pa->status));
+               if (ast_opt_priority_jumping || ast_test_flag(opts, OPT_PRIORITY_JUMP)) {
+                       ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 301);
+               }
+               return 0; /* is this right??? */
+       } else if (pa->privdb_val == AST_PRIVACY_UNKNOWN ) {
+               /* Get the user's intro, store it in priv-callerintros/$CID, 
+                  unless it is already there-- this should be done before the 
+                  call is actually dialed  */
+
+               /* make sure the priv-callerintros dir actually exists */
+               snprintf(pa->privintro, sizeof(pa->privintro), "%s/sounds/priv-callerintros", ast_config_AST_DATA_DIR);
+               if (mkdir(pa->privintro, 0755) && errno != EEXIST) {
+                       ast_log(LOG_WARNING, "privacy: can't create directory priv-callerintros: %s\n", strerror(errno));
+                       return -1;
+               }
+
+               snprintf(pa->privintro,sizeof(pa->privintro), "priv-callerintros/%s", pa->privcid);
+               if (ast_fileexists(pa->privintro,NULL,NULL ) > 0 && strncmp(pa->privcid,"NOCALLERID",10) != 0) {
+                       /* the DELUX version of this code would allow this caller the
+                          option to hear and retape their previously recorded intro.
+                       */
+               } else {
+                       int duration; /* for feedback from play_and_wait */
+                       /* the file doesn't exist yet. Let the caller submit his
+                          vocal intro for posterity */
+                       /* priv-recordintro script:
+
+                          "At the tone, please say your name:"
+
+                       */
+                       res = ast_play_and_record(chan, "priv-recordintro", pa->privintro, 4, "gsm", &duration, 128, 2000, 0);  /* NOTE: I've reduced the total time to 4 sec */
+                                                                       /* don't think we'll need a lock removed, we took care of
+                                                                          conflicts by naming the pa.privintro file */
+                       if (res == -1) {
+                               /* Delete the file regardless since they hung up during recording */
+                               ast_filedelete(pa->privintro, NULL);
+                               if (ast_fileexists(pa->privintro,NULL,NULL ) > 0 )
+                                       ast_log(LOG_NOTICE,"privacy: ast_filedelete didn't do its job on %s\n", pa->privintro);
+                               else if (option_verbose > 2)
+                                       ast_verbose( VERBOSE_PREFIX_3 "Successfully deleted %s intro file\n", pa->privintro);
+                               return -1;
+                       }
+                       if (!ast_streamfile(chan, "vm-dialout", chan->language) )
+                               ast_waitstream(chan, "");
+               }
+       }
+       return 1;       /* success */
+}
+
 static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags *peerflags)
 {
        int res = -1;   /* default: error */
@@ -1141,118 +1252,12 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
                ast_cdr_reset(chan->cdr, NULL);
        if (ast_test_flag(&opts, OPT_PRIVACY) && ast_strlen_zero(opt_args[OPT_ARG_PRIVACY]))
                opt_args[OPT_ARG_PRIVACY] = ast_strdupa(chan->exten);
-       if (ast_test_flag(&opts, OPT_PRIVACY) || ast_test_flag(&opts, OPT_SCREENING)) {
-               char callerid[60];
-               char *l = chan->cid.cid_num;    /* XXX watch out, we are overwriting it */
-               if (!ast_strlen_zero(l)) {
-                       ast_shrink_phone_number(l);
-                       if( ast_test_flag(&opts, OPT_PRIVACY) ) {
-                               if (option_verbose > 2)
-                                       ast_verbose(VERBOSE_PREFIX_3  "Privacy DB is '%s', clid is '%s'\n",
-                                                    opt_args[OPT_ARG_PRIVACY], l);
-                               pa.privdb_val = ast_privacy_check(opt_args[OPT_ARG_PRIVACY], l);
-                       }
-                       else {
-                               if (option_verbose > 2)
-                                       ast_verbose(VERBOSE_PREFIX_3  "Privacy Screening, clid is '%s'\n", l);
-                               pa.privdb_val = AST_PRIVACY_UNKNOWN;
-                       }
-               } else {
-                       char *tnam, *tn2;
-
-                       tnam = ast_strdupa(chan->name);
-                       /* clean the channel name so slashes don't try to end up in disk file name */
-                       for(tn2 = tnam; *tn2; tn2++) {
-                               if( *tn2=='/')
-                                       *tn2 = '=';  /* any other chars to be afraid of? */
-                       }
-                       if (option_verbose > 2)
-                               ast_verbose(VERBOSE_PREFIX_3  "Privacy-- callerid is empty\n");
 
-                       snprintf(callerid, sizeof(callerid), "NOCALLERID_%s%s", chan->exten, tnam);
-                       l = callerid;
-                       pa.privdb_val = AST_PRIVACY_UNKNOWN;
-               }
-               
-               ast_copy_string(pa.privcid,l,sizeof(pa.privcid));
-
-               if( strncmp(pa.privcid,"NOCALLERID",10) != 0 && ast_test_flag(&opts, OPT_SCREEN_NOCLID) ) { /* if callerid is set, and ast_test_flag(&opts, OPT_SCREEN_NOCLID) is set also */  
-                       if (option_verbose > 2)
-                               ast_verbose( VERBOSE_PREFIX_3  "CallerID set (%s); N option set; Screening should be off\n", pa.privcid);
-                       pa.privdb_val = AST_PRIVACY_ALLOW;
-               }
-               else if(ast_test_flag(&opts, OPT_SCREEN_NOCLID) && strncmp(pa.privcid,"NOCALLERID",10) == 0 ) {
-                       if (option_verbose > 2)
-                               ast_verbose( VERBOSE_PREFIX_3  "CallerID blank; N option set; Screening should happen; dbval is %d\n", pa.privdb_val);
-               }
-               
-               if(pa.privdb_val == AST_PRIVACY_DENY ) {
-                       ast_copy_string(pa.status, "NOANSWER", sizeof(pa.status));
-                       if (option_verbose > 2)
-                               ast_verbose( VERBOSE_PREFIX_3  "Privacy DB reports PRIVACY_DENY for this callerid. Dial reports unavailable\n");
-                       res=0;
+       if (ast_test_flag(&opts, OPT_PRIVACY) || ast_test_flag(&opts, OPT_SCREENING)) {
+               res = setup_privacy_args(&pa, &opts, opt_args, chan);
+               if (res <= 0)
                        goto out;
-               }
-               else if(pa.privdb_val == AST_PRIVACY_KILL ) {
-                       ast_copy_string(pa.status, "DONTCALL", sizeof(pa.status));
-                       if (ast_opt_priority_jumping || ast_test_flag(&opts, OPT_PRIORITY_JUMP)) {
-                               ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 201);
-                       }
-                       res = 0;
-                       goto out; /* Is this right? */
-               }
-               else if(pa.privdb_val == AST_PRIVACY_TORTURE ) {
-                       ast_copy_string(pa.status, "TORTURE", sizeof(pa.status));
-                       if (ast_opt_priority_jumping || ast_test_flag(&opts, OPT_PRIORITY_JUMP)) {
-                               ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 301);
-                       }
-                       res = 0;
-                       goto out; /* is this right??? */
-               }
-               else if(pa.privdb_val == AST_PRIVACY_UNKNOWN ) {
-                       /* Get the user's intro, store it in priv-callerintros/$CID, 
-                          unless it is already there-- this should be done before the 
-                          call is actually dialed  */
-
-                       /* make sure the priv-callerintros dir actually exists */
-                       snprintf(pa.privintro, sizeof(pa.privintro), "%s/sounds/priv-callerintros", ast_config_AST_DATA_DIR);
-                       if (mkdir(pa.privintro, 0755) && errno != EEXIST) {
-                               ast_log(LOG_WARNING, "privacy: can't create directory priv-callerintros: %s\n", strerror(errno));
-                               res = -1;
-                               goto out;
-                       }
-
-                       snprintf(pa.privintro,sizeof(pa.privintro), "priv-callerintros/%s", pa.privcid);
-                       if( ast_fileexists(pa.privintro,NULL,NULL ) > 0 && strncmp(pa.privcid,"NOCALLERID",10) != 0) {
-                               /* the DELUX version of this code would allow this caller the
-                                  option to hear and retape their previously recorded intro.
-                               */
-                       }
-                       else {
-                               int duration; /* for feedback from play_and_wait */
-                               /* the file doesn't exist yet. Let the caller submit his
-                                  vocal intro for posterity */
-                               /* priv-recordintro script:
-
-                                  "At the tone, please say your name:"
-
-                               */
-                               res = ast_play_and_record(chan, "priv-recordintro", pa.privintro, 4, "gsm", &duration, 128, 2000, 0);  /* NOTE: I've reduced the total time to 4 sec */
-                                                                               /* don't think we'll need a lock removed, we took care of
-                                                                                  conflicts by naming the pa.privintro file */
-                               if (res == -1) {
-                                       /* Delete the file regardless since they hung up during recording */
-                                        ast_filedelete(pa.privintro, NULL);
-                                        if( ast_fileexists(pa.privintro,NULL,NULL ) > 0 )
-                                                ast_log(LOG_NOTICE,"privacy: ast_filedelete didn't do its job on %s\n", pa.privintro);
-                                        else if (option_verbose > 2)
-                                                ast_verbose( VERBOSE_PREFIX_3 "Successfully deleted %s intro file\n", pa.privintro);
-                                       goto out;
-                               }
-                                if( !ast_streamfile(chan, "vm-dialout", chan->language) )
-                                        ast_waitstream(chan, "");
-                       }
-               }
+               res = -1;       /* reset default */
        }
 
        /* If a channel group has been specified, get it for use when we create peer channels */