From 2a4ca3a422eeb74b9b48449e5737f813bb3cd913 Mon Sep 17 00:00:00 2001 From: mogorman Date: Thu, 12 Jan 2006 02:20:19 +0000 Subject: Added automatic folder feature described in 6090 with bounds checking. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@7995 f38db490-d61c-443f-a65b-d21fe96a405b --- apps/app_voicemail.c | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'apps/app_voicemail.c') diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 4cf8fca06..41c619225 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -123,11 +123,13 @@ enum { OPT_RECORDGAIN = (1 << 3), OPT_PREPEND_MAILBOX = (1 << 4), OPT_PRIORITY_JUMP = (1 << 5), + OPT_AUTOPLAY = (1 << 6), } vm_option_flags; enum { OPT_ARG_RECORDGAIN = 0, OPT_ARG_ARRAY_SIZE = 1, + OPT_ARG_PLAYFOLDER = 2, } vm_option_args; AST_APP_OPTIONS(vm_app_options, { @@ -137,6 +139,7 @@ AST_APP_OPTIONS(vm_app_options, { AST_APP_OPTION_ARG('g', OPT_RECORDGAIN, OPT_ARG_RECORDGAIN), AST_APP_OPTION('p', OPT_PREPEND_MAILBOX), AST_APP_OPTION('j', OPT_PRIORITY_JUMP), + AST_APP_OPTION_ARG('a', OPT_AUTOPLAY, OPT_ARG_PLAYFOLDER), }); static int load_config(void); @@ -335,7 +338,8 @@ static char *descrip_vmain = " is entered by the caller.\n" " g(#) - Use the specified amount of gain when recording a voicemail\n" " message. The units are whole-number decibels (dB).\n" -" s - Skip checking the passcode for the mailbox.\n"; +" s - Skip checking the passcode for the mailbox.\n" +" a(#) - Skip folder prompt and g directly to folder specified, default 1\n"; static char *synopsis_vm_box_exists = "Check to see if Voicemail mailbox exists"; @@ -5021,6 +5025,8 @@ static int vm_execmain(struct ast_channel *chan, void *data) int silentexit = 0; struct ast_flags flags = { 0 }; signed char record_gain = 0; + int play_auto = 0; + int play_folder = 0; LOCAL_USER_ADD(u); @@ -5056,6 +5062,19 @@ static int vm_execmain(struct ast_channel *chan, void *data) record_gain = (signed char) gain; } } + if (ast_test_flag(&flags, OPT_AUTOPLAY) ) { + play_auto = 1; + if (sscanf(opts[OPT_ARG_PLAYFOLDER], "%d", &play_folder) != 1) { + ast_log(LOG_WARNING, "Invalid value '%s' provided for folder autoplay option\n", opts[OPT_ARG_PLAYFOLDER]); + LOCAL_USER_REMOVE(u); + return -1; + } + else if ( play_folder > 9 || play_folder < 1) { + ast_log(LOG_WARNING, "Invalid value '%d' provided for folder autoplay option\n", play_folder); + LOCAL_USER_REMOVE(u); + return -1; + } + } } else { /* old style options parsing */ while (*argv[0]) { @@ -5126,11 +5145,24 @@ static int vm_execmain(struct ast_channel *chan, void *data) vms.newmessages = vms.lastmsg + 1; /* Select proper mailbox FIRST!! */ - if (!vms.newmessages && vms.oldmessages) { - /* If we only have old messages start here */ - res = open_mailbox(&vms, vmu, 1); + if (play_auto) { + res = open_mailbox(&vms, vmu, play_folder); if (res == ERROR_LOCK_PATH) goto out; + + /* If there are no new messages, inform the user and hangup */ + if (vms.lastmsg == -1) { + cmd = vm_browse_messages(chan, &vms, vmu); + res = 0; + goto out; + } + } else { + if (!vms.newmessages && vms.oldmessages) { + /* If we only have old messages start here */ + res = open_mailbox(&vms, vmu, 1); + if (res == ERROR_LOCK_PATH) + goto out; + } } if (useadsi) @@ -5154,7 +5186,11 @@ static int vm_execmain(struct ast_channel *chan, void *data) } } - cmd = vm_intro(chan, &vms); + if (play_auto) { + cmd = '1'; + } else { + cmd = vm_intro(chan, &vms); + } vms.repeats = 0; vms.starting = 1; -- cgit v1.2.3