Make MWI in chan_skinny event based modeled after chan_zap and chan_mgcp.
(closes issue #12214) Reported by: DEA Patches: chan_skinny-vm-events-v3.txt uploaded by DEA (license 3) Tested by: DEA and me git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@114700 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
parent
2f1f326924
commit
4cd37243ff
|
@ -67,6 +67,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|||
#include "asterisk/abstract_jb.h"
|
||||
#include "asterisk/threadstorage.h"
|
||||
#include "asterisk/devicestate.h"
|
||||
#include "asterisk/event.h"
|
||||
|
||||
/*************************************
|
||||
* Skinny/Asterisk Protocol Settings *
|
||||
|
@ -1170,6 +1171,7 @@ struct skinny_line {
|
|||
int curtone; /* Current tone being played */
|
||||
ast_group_t callgroup;
|
||||
ast_group_t pickupgroup;
|
||||
struct ast_event_sub *mwi_event_sub; /* Event based MWI */
|
||||
int callwaiting;
|
||||
int transfer;
|
||||
int threewaycalling;
|
||||
|
@ -2238,15 +2240,42 @@ static int skinny_extensionstate_cb(char *context, char *exten, int state, void
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void mwi_event_cb(const struct ast_event *event, void *userdata)
|
||||
{
|
||||
/* This module does not handle MWI in an event-based manner. However, it
|
||||
* subscribes to MWI for each mailbox that is configured so that the core
|
||||
* knows that we care about it. Then, chan_zap will get the MWI from the
|
||||
* event cache instead of checking the mailbox directly. */
|
||||
}
|
||||
|
||||
static int has_voicemail(struct skinny_line *l)
|
||||
{
|
||||
return ast_app_has_voicemail(l->mailbox, NULL);
|
||||
int new_msgs;
|
||||
struct ast_event *event;
|
||||
char *mailbox, *context;
|
||||
|
||||
context = mailbox = ast_strdupa(l->mailbox);
|
||||
strsep(&context, "@");
|
||||
if (ast_strlen_zero(context))
|
||||
context = "default";
|
||||
|
||||
event = ast_event_get_cached(AST_EVENT_MWI,
|
||||
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox,
|
||||
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, context,
|
||||
AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
|
||||
AST_EVENT_IE_END);
|
||||
|
||||
if (event) {
|
||||
new_msgs = ast_event_get_ie_uint(event, AST_EVENT_IE_NEWMSGS);
|
||||
ast_event_destroy(event);
|
||||
} else
|
||||
new_msgs = ast_app_has_voicemail(l->mailbox, NULL);
|
||||
|
||||
return new_msgs;
|
||||
}
|
||||
|
||||
static void do_housekeeping(struct skinnysession *s)
|
||||
{
|
||||
int new;
|
||||
int old;
|
||||
int device_lamp = 0;
|
||||
struct skinny_device *d = s->device;
|
||||
struct skinny_line *l;
|
||||
|
@ -2259,7 +2288,6 @@ static void do_housekeeping(struct skinnysession *s)
|
|||
if (has_voicemail(l)) {
|
||||
if (skinnydebug)
|
||||
ast_verb(1, "Checking for voicemail Skinny %s@%s\n", l->name, d->name);
|
||||
ast_app_inboxcount(l->mailbox, &new, &old);
|
||||
if (skinnydebug)
|
||||
ast_verb(1, "Skinny %s@%s has voicemail!\n", l->name, d->name);
|
||||
transmit_lamp_indication(s, STIMULUS_VOICEMAIL, l->instance, l->mwiblink?SKINNY_LAMP_BLINK:SKINNY_LAMP_ON);
|
||||
|
@ -3087,8 +3115,19 @@ static struct skinny_device *build_device(const char *cat, struct ast_variable *
|
|||
ast_copy_string(l->mohsuggest, mohsuggest, sizeof(l->mohsuggest));
|
||||
ast_copy_string(l->regexten, regexten, sizeof(l->regexten));
|
||||
ast_copy_string(l->mailbox, mailbox, sizeof(l->mailbox));
|
||||
if (!ast_strlen_zero(mailbox))
|
||||
ast_verb(3, "Setting mailbox '%s' on %s@%s\n", mailbox, d->name, l->name);
|
||||
if (!ast_strlen_zero(mailbox)) {
|
||||
char *cfg_mailbox, *cfg_context;
|
||||
cfg_context = cfg_mailbox = ast_strdupa(l->mailbox);
|
||||
ast_verb(3, "Setting mailbox '%s' on %s@%s\n", cfg_mailbox, d->name, l->name);
|
||||
strsep(&cfg_context, "@");
|
||||
if (ast_strlen_zero(cfg_context))
|
||||
cfg_context = "default";
|
||||
l->mwi_event_sub = ast_event_subscribe(AST_EVENT_MWI, mwi_event_cb, NULL,
|
||||
AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, cfg_mailbox,
|
||||
AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR, cfg_context,
|
||||
AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_EXISTS,
|
||||
AST_EVENT_IE_END);
|
||||
}
|
||||
ast_copy_string(l->vmexten, device_vmexten, sizeof(vmexten));
|
||||
l->chanvars = chanvars;
|
||||
l->msgstate = -1;
|
||||
|
@ -6108,6 +6147,8 @@ static int unload_module(void)
|
|||
}
|
||||
ast_mutex_unlock(&sub->lock);
|
||||
}
|
||||
if (l->mwi_event_sub)
|
||||
ast_event_unsubscribe(l->mwi_event_sub);
|
||||
ast_mutex_unlock(&l->lock);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue