From f129ce3b0901745a0dc672b37dccbef602a1105c Mon Sep 17 00:00:00 2001 From: Jeff Peeler Date: Wed, 15 Sep 2010 20:36:51 +0000 Subject: Merged revisions 287015 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 ................ r287015 | jpeeler | 2010-09-15 15:32:52 -0500 (Wed, 15 Sep 2010) | 21 lines Merged revisions 286998 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.6.2 ................ r286998 | jpeeler | 2010-09-15 15:28:02 -0500 (Wed, 15 Sep 2010) | 14 lines Merged revisions 286941 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r286941 | jpeeler | 2010-09-15 15:08:52 -0500 (Wed, 15 Sep 2010) | 7 lines Ensure mailbox is not filled to capacity before doing message forwarding. Specifically, before prompting to record a prepended message the capacity is checked first. If the mailbox is full the extension will be reprompted. ABE-2517 ........ ................ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@287016 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_voicemail.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) (limited to 'apps/app_voicemail.c') diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 8f0a5bd82..87bfcabfb 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -6906,7 +6906,7 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st AST_LIST_HEAD_NOLOCK_STATIC(extensions, ast_vm_user); char *stringp; const char *s; - int saved_messages = 0, found = 0; + int saved_messages = 0; int valid_extensions = 0; char *dir; int curmsg; @@ -7014,8 +7014,29 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st valid_extensions = 1; while (s) { if ((is_new_message == 1 || strcmp(s, sender->mailbox)) && (receiver = find_user(NULL, context, s))) { + int oldmsgs; + int newmsgs; + int capacity; + if (inboxcount(s, &newmsgs, &oldmsgs)) { + ast_log(LOG_ERROR, "Problem in calculating number of voicemail messages available for extension %s\n", s); + /* Shouldn't happen, but allow trying another extension if it does */ + res = ast_play_and_wait(chan, "pbx-invalid"); + valid_extensions = 0; + break; + } + capacity = receiver->maxmsg - inprocess_count(receiver->mailbox, receiver->context, +1); + if ((newmsgs + oldmsgs) >= capacity) { + ast_log(LOG_NOTICE, "Mailbox '%s' is full with capacity of %d, prompting for another extension.\n", s, capacity); + res = ast_play_and_wait(chan, "vm-mailboxfull"); + valid_extensions = 0; + while ((vmtmp = AST_LIST_REMOVE_HEAD(&extensions, list))) { + inprocess_count(vmtmp->mailbox, vmtmp->context, -1); + free_user(vmtmp); + } + inprocess_count(receiver->mailbox, receiver->context, -1); + break; + } AST_LIST_INSERT_HEAD(&extensions, receiver, list); - found++; } else { /* XXX Optimization for the future. When we encounter a single bad extension, * bailing out on all of the extensions may not be the way to go. We should @@ -7026,6 +7047,8 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st free_user(receiver); } ast_log(LOG_NOTICE, "'%s' is not a valid mailbox\n", s); + /* "I am sorry, that's not a valid extension. Please try again." */ + res = ast_play_and_wait(chan, "pbx-invalid"); valid_extensions = 0; break; } @@ -7049,8 +7072,6 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st /* break from the loop of reading the extensions */ if (valid_extensions) break; - /* "I am sorry, that's not a valid extension. Please try again." */ - res = ast_play_and_wait(chan, "pbx-invalid"); } /* check if we're clear to proceed */ if (AST_LIST_EMPTY(&extensions) || !valid_extensions) @@ -7111,6 +7132,7 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st #endif saved_messages++; AST_LIST_REMOVE_CURRENT(list); + inprocess_count(vmtmp->mailbox, vmtmp->context, -1); free_user(vmtmp); if (res) break; @@ -7154,8 +7176,10 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st } /* If anything failed above, we still have this list to free */ - while ((vmtmp = AST_LIST_REMOVE_HEAD(&extensions, list))) + while ((vmtmp = AST_LIST_REMOVE_HEAD(&extensions, list))) { + inprocess_count(vmtmp->mailbox, vmtmp->context, -1); free_user(vmtmp); + } return res ? res : cmd; } -- cgit v1.2.3