aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2009-08-21 21:39:51 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2009-08-21 21:39:51 +0000
commitcbd7edb7c8870c9feb2e4380a72a243c4796ddd1 (patch)
tree1774600ceed4fe0dd116b63c8c1c16990d31ead6
parentfc3aabd42e3919b2162b95d46fadc095945fee73 (diff)
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: http://svn.digium.com/svn/asterisk/trunk@213697 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--apps/app_voicemail.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 0ca60e1fe..afcafbfd8 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;
}