summaryrefslogtreecommitdiff
path: root/apps/app_voicemail.c
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2007-06-26 19:06:47 +0000
committerMark Michelson <mmichelson@digium.com>2007-06-26 19:06:47 +0000
commite7ca771f95bea6658642396224805877d4fdeaab (patch)
tree430c1a4101fe2509f326dd64c2b7ce9f0799e0d9 /apps/app_voicemail.c
parente3cf86f4b36777624d10f65f04bb2665e2e7f508 (diff)
Merged revisions 71877 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r71877 | mmichelson | 2007-06-26 14:00:05 -0500 (Tue, 26 Jun 2007) | 11 lines A few changes, the ultimate goal of which is to keep better track of the number of messages that a mailbox currently has. A description of the changes: 1. Changed the "updated" field of the vm_state struct to act more as a binary semaphore than a counting semaphore, since its current implementation made the inboxcount function not work properly. This change falls in line with a change made by UPenn with their IMAP setup and helps to sync our changes with theirs. 2. Eliminated some redundant calls to get_vm_state_by_mailbox inside leave_voicemail 3. Use the play_folder variable to keep track of the number of old and new messages in a mailbox as the messages are deleted 4. Added an increment to the number of new messages that was not there previously in the leave_voicemail function ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@71883 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps/app_voicemail.c')
-rw-r--r--apps/app_voicemail.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 386f254d4..665bd4eb3 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -2657,7 +2657,7 @@ static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
return -1;
}
- if (!ret && vms_p->updated == 1) {
+ if (!ret && vms_p->updated > 0) {
if (newmsgs) {
pgm = mail_newsearchpgm();
hdr = mail_newsearchheader("X-Asterisk-VM-Extension", (char *)mailboxnc);
@@ -2688,10 +2688,8 @@ static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
}
}
- if (vms_p->updated == 1) { /* changes, so we did the searches above */
+ if (vms_p->updated > 1) { /* changes, so we did the searches above */
vms_p->updated = 0;
- } else if (vms_p->updated > 1) { /* decrement delay count */
- vms_p->updated--;
} else { /* no changes, so don't search */
mail_ping(vms_p->mailstream);
/* Keep the old data */
@@ -3111,19 +3109,13 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, struct leave_vm_
#ifdef IMAP_STORAGE
/* Is ext a mailbox? */
/* must open stream for this user to get info! */
- vms = get_vm_state_by_mailbox(ext,0);
- if (vms) {
- ast_debug(3, "Using vm_state, interactive set to %d.\n",vms->interactive);
- newmsgs = vms->newmessages++;
- oldmsgs = vms->oldmessages;
- } else {
- res = inboxcount(ext_context, &newmsgs, &oldmsgs);
- if(res < 0) {
- ast_log(LOG_NOTICE,"Can not leave voicemail, unable to count messages\n");
- return -1;
- }
- vms = get_vm_state_by_mailbox(ext,0);
+ res = inboxcount(ext_context, &newmsgs, &oldmsgs);
+ if(res < 0) {
+ ast_log(LOG_NOTICE,"Can not leave voicemail, unable to count messages\n");
+ return -1;
}
+ if((vms = get_vm_state_by_mailbox(ext,0)))
+ vms->newmessages++; /*still need to increment new message count*/
/* here is a big difference! We add one to it later */
msgnum = newmsgs + oldmsgs;
ast_debug(3, "Messagecount set to %d\n",msgnum);
@@ -6623,7 +6615,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
#ifdef IMAP_STORAGE
vms.interactive = 1;
- vms.updated = 2;
+ vms.updated = 1;
vmstate_insert(&vms);
init_vm_state(&vms);
#endif
@@ -6673,6 +6665,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
if (!vms.newmessages && vms.oldmessages) {
/* If we only have old messages start here */
res = open_mailbox(&vms, vmu, 1);
+ play_folder = 1;
if (res == ERROR_LOCK_PATH)
goto out;
}
@@ -6736,6 +6729,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
res = open_mailbox(&vms, vmu, cmd);
if (res == ERROR_LOCK_PATH)
goto out;
+ play_folder = cmd;
cmd = 0;
}
if (useadsi)
@@ -6872,10 +6866,20 @@ static int vm_execmain(struct ast_channel *chan, void *data)
vms.deleted[vms.curmsg] = !vms.deleted[vms.curmsg];
if (useadsi)
adsi_delete(chan, &vms);
- if (vms.deleted[vms.curmsg])
+ if (vms.deleted[vms.curmsg]) {
+ if (play_folder == 0)
+ vms.newmessages--;
+ else if (play_folder == 1)
+ vms.oldmessages--;
cmd = ast_play_and_wait(chan, "vm-deleted");
- else
+ }
+ else {
+ if (play_folder == 0)
+ vms.newmessages++;
+ else if (play_folder == 1)
+ vms.oldmessages++;
cmd = ast_play_and_wait(chan, "vm-undeleted");
+ }
if (ast_test_flag((&globalflags), VM_SKIPAFTERCMD)) {
if (vms.curmsg < vms.lastmsg) {
vms.curmsg++;
@@ -9346,7 +9350,7 @@ static void vmstate_delete(struct vm_state *vms)
ast_debug(3, "Duplicate mailbox %s, copying message info...\n", vms->username);
altvms->newmessages = vms->newmessages;
altvms->oldmessages = vms->oldmessages;
- altvms->updated = 2;
+ altvms->updated = 1;
}
ast_debug(3, "Removing vm_state for user:%s, mailbox %s\n", vms->imapuser, vms->username);
@@ -9381,7 +9385,7 @@ static void set_update(MAILSTREAM * stream)
ast_debug(3, "User %s mailbox set for update.\n", user);
- vms->updated = 2; /* Set updated flag since mailbox changed */
+ vms->updated = 1; /* Set updated flag since mailbox changed */
}
static void init_vm_state(struct vm_state *vms)