From 89e87e32d259c47077889b9ce12815e3a5105341 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Fri, 21 Aug 2009 21:39:51 +0000 Subject: [PATCH] Ensure that realtime mailboxes properly report status on subscription. This patch modifies app_voicemail's response to mailbox status subscriptions (via the internal event system) to ensure that a subscription triggers an explicit poll of the mailbox, so the subscriber can get an immediate cached event with that status. Previously, the cache was only populated with the status of non-realtime mailboxes. (closes issue #15717) Reported by: natmlt git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@213697 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_voicemail.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 0ca60e1fe3..afcafbfd82 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -10113,24 +10113,28 @@ static struct ast_cli_entry cli_voicemail[] = { AST_CLI_DEFINE(handle_voicemail_reload, "Reload voicemail configuration"), }; +static void poll_subscribed_mailbox(struct mwi_sub *mwi_sub) +{ + int new = 0, old = 0, urgent = 0; + + inboxcount2(mwi_sub->mailbox, &urgent, &new, &old); + + if (urgent != mwi_sub->old_urgent || new != mwi_sub->old_new || old != mwi_sub->old_old) { + mwi_sub->old_urgent = urgent; + mwi_sub->old_new = new; + mwi_sub->old_old = old; + queue_mwi_event(mwi_sub->mailbox, urgent, new, old); + } +} + static void poll_subscribed_mailboxes(void) { struct mwi_sub *mwi_sub; AST_RWLIST_RDLOCK(&mwi_subs); AST_RWLIST_TRAVERSE(&mwi_subs, mwi_sub, entry) { - int new = 0, old = 0, urgent = 0; - - if (ast_strlen_zero(mwi_sub->mailbox)) - continue; - - inboxcount2(mwi_sub->mailbox, &urgent, &new, &old); - - if (urgent != mwi_sub->old_urgent || new != mwi_sub->old_new || old != mwi_sub->old_old) { - mwi_sub->old_urgent = urgent; - mwi_sub->old_new = new; - mwi_sub->old_old = old; - queue_mwi_event(mwi_sub->mailbox, urgent, new, old); + if (!ast_strlen_zero(mwi_sub->mailbox)) { + poll_subscribed_mailbox(mwi_sub); } } AST_RWLIST_UNLOCK(&mwi_subs); @@ -10216,7 +10220,8 @@ static int handle_subscribe(void *datap) AST_RWLIST_UNLOCK(&mwi_subs); ast_free((void *) p->mailbox); ast_free((void *) p->context); - ast_free(p); + ast_free(p); + poll_subscribed_mailbox(mwi_sub); return 0; }