Thu Apr 28 2011 17:15:29

Asterisk developer's documentation


app_privacy.c File Reference

Block all calls without Caller*ID, require phone # to be entered. More...

#include "asterisk.h"
#include "asterisk/lock.h"
#include "asterisk/file.h"
#include "asterisk/utils.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/translate.h"
#include "asterisk/image.h"
#include "asterisk/callerid.h"
#include "asterisk/app.h"
#include "asterisk/config.h"
Include dependency graph for app_privacy.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int load_module (void)
static int privacy_exec (struct ast_channel *chan, void *data)
static int unload_module (void)

Variables

static struct ast_module_info
__MODULE_INFO_SECTION 
__mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Require phone number to be entered, if no CallerID sent" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, }
static char * app = "PrivacyManager"
static struct ast_module_infoast_module_info = &__mod_info

Detailed Description

Block all calls without Caller*ID, require phone # to be entered.

Author:
Mark Spencer <markster@digium.com>

Definition in file app_privacy.c.


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 212 of file app_privacy.c.

static void __unreg_module ( void  ) [static]

Definition at line 212 of file app_privacy.c.

static int load_module ( void  ) [static]
static int privacy_exec ( struct ast_channel chan,
void *  data 
) [static]

Definition at line 83 of file app_privacy.c.

References ast_channel::_state, ast_answer(), AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_exists_extension(), ast_log(), AST_PRES_UNAVAILABLE, ast_readstring(), ast_safe_sleep(), ast_set_callerid(), AST_STANDARD_APP_ARGS, AST_STATE_UP, ast_strdupa, ast_streamfile(), ast_strlen_zero(), ast_verb, ast_waitstream(), ast_channel::cid, ast_callerid::cid_num, ast_callerid::cid_pres, ast_channel::language, LOG_WARNING, maxretries, parse(), pbx_builtin_setvar_helper(), and phone.

Referenced by load_module().

{
   int res=0;
   int retries;
   int maxretries = 3;
   int minlength = 10;
   int x = 0;
   char phone[30];
   char *parse = NULL;
   AST_DECLARE_APP_ARGS(args,
      AST_APP_ARG(maxretries);
      AST_APP_ARG(minlength);
      AST_APP_ARG(options);
      AST_APP_ARG(checkcontext);
   );

   if (!ast_strlen_zero(chan->cid.cid_num)) {
      ast_verb(3, "CallerID Present: Skipping\n");
   } else {
      /*Answer the channel if it is not already*/
      if (chan->_state != AST_STATE_UP) {
         if ((res = ast_answer(chan))) {
            return -1;
         }
      }

      parse = ast_strdupa(data);

      AST_STANDARD_APP_ARGS(args, parse);

      if (!ast_strlen_zero(args.maxretries)) {
         if (sscanf(args.maxretries, "%30d", &x) == 1 && x > 0) {
            maxretries = x;
         } else {
            ast_log(LOG_WARNING, "Invalid max retries argument: '%s'\n", args.maxretries);
         }
      }
      if (!ast_strlen_zero(args.minlength)) {
         if (sscanf(args.minlength, "%30d", &x) == 1 && x > 0) {
            minlength = x;
         } else {
            ast_log(LOG_WARNING, "Invalid min length argument: '%s'\n", args.minlength);
         }
      }

      /* Play unidentified call */
      res = ast_safe_sleep(chan, 1000);
      if (!res) {
         res = ast_streamfile(chan, "privacy-unident", chan->language);
      }
      if (!res) {
         res = ast_waitstream(chan, "");
      }

      /* Ask for 10 digit number, give 3 attempts */
      for (retries = 0; retries < maxretries; retries++) {
         if (!res) {
            res = ast_streamfile(chan, "privacy-prompt", chan->language);
         }
         if (!res) {
            res = ast_waitstream(chan, "");
         }

         if (!res) {
            res = ast_readstring(chan, phone, sizeof(phone) - 1, /* digit timeout ms */ 3200, /* first digit timeout */ 5000, "#");
         }

         if (res < 0) {
            break;
         }

         /* Make sure we get at least digits */
         if (strlen(phone) >= minlength ) {
            /* if we have a checkcontext argument, do pattern matching */
            if (!ast_strlen_zero(args.checkcontext)) {
               if (!ast_exists_extension(NULL, args.checkcontext, phone, 1, NULL)) {
                  res = ast_streamfile(chan, "privacy-incorrect", chan->language);
                  if (!res) {
                     res = ast_waitstream(chan, "");
                  }
               } else {
                  break;
               }
            } else {
               break;
            }
         } else {
            res = ast_streamfile(chan, "privacy-incorrect", chan->language);
            if (!res) {
               res = ast_waitstream(chan, "");
            }
         }
      }

      /* Got a number, play sounds and send them on their way */
      if ((retries < maxretries) && res >= 0) {
         res = ast_streamfile(chan, "privacy-thankyou", chan->language);
         if (!res) {
            res = ast_waitstream(chan, "");
         }

         ast_set_callerid(chan, phone, "Privacy Manager", NULL);

         /* Clear the unavailable presence bit so if it came in on PRI
          * the caller id will now be passed out to other channels
          */
         chan->cid.cid_pres &= (AST_PRES_UNAVAILABLE ^ 0xFF);

         ast_verb(3, "Changed Caller*ID to '%s', callerpres to %d\n", phone, chan->cid.cid_pres);

         pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "SUCCESS");
      } else {
         pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "FAILED");
      }
   }

   return 0;
}
static int unload_module ( void  ) [static]

Definition at line 202 of file app_privacy.c.

References ast_unregister_application().


Variable Documentation

struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Require phone number to be entered, if no CallerID sent" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static]

Definition at line 212 of file app_privacy.c.

char* app = "PrivacyManager" [static]

Definition at line 81 of file app_privacy.c.

Definition at line 212 of file app_privacy.c.