summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2011-04-18 19:48:00 +0000
committerRichard Mudgett <rmudgett@digium.com>2011-04-18 19:48:00 +0000
commit37274c73eeb5346db6128f8363b50d959f66ea8c (patch)
treeeb44038303115230b95e4913d139e41d01d8715e /channels
parent0a5c2d8391bf591c497f9f112827305fd692b469 (diff)
Problems with ISDN MWI to phones.
The "controlling user number" is always the number of the voice mail box which is identical with the subscriber number itself. This number which is listed in the ISDN phone MWI menu cannot be called back to contact the voice mail box. The controlling user number should be made configurable. JIRA ABE-2738 JIRA SWP-2846 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@314116 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_dahdi.c6
-rw-r--r--channels/sig_pri.c90
-rw-r--r--channels/sig_pri.h20
3 files changed, 99 insertions, 17 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index b11d114af..6b82bb185 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -12457,6 +12457,9 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
ast_copy_string(pris[span].pri.mwi_mailboxes,
conf->pri.pri.mwi_mailboxes,
sizeof(pris[span].pri.mwi_mailboxes));
+ ast_copy_string(pris[span].pri.mwi_vm_numbers,
+ conf->pri.pri.mwi_vm_numbers,
+ sizeof(pris[span].pri.mwi_vm_numbers));
#endif /* defined(HAVE_PRI_MWI) */
ast_copy_string(pris[span].pri.idledial, conf->pri.pri.idledial, sizeof(pris[span].pri.idledial));
ast_copy_string(pris[span].pri.idleext, conf->pri.pri.idleext, sizeof(pris[span].pri.idleext));
@@ -17511,6 +17514,9 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
} else if (!strcasecmp(v->name, "mwi_mailboxes")) {
ast_copy_string(confp->pri.pri.mwi_mailboxes, v->value,
sizeof(confp->pri.pri.mwi_mailboxes));
+ } else if (!strcasecmp(v->name, "mwi_vm_numbers")) {
+ ast_copy_string(confp->pri.pri.mwi_vm_numbers, v->value,
+ sizeof(confp->pri.pri.mwi_vm_numbers));
#endif /* defined(HAVE_PRI_MWI) */
} else if (!strcasecmp(v->name, "append_msn_to_cid_tag")) {
confp->pri.pri.append_msn_to_user_tag = ast_true(v->value);
diff --git a/channels/sig_pri.c b/channels/sig_pri.c
index 308fa5dc8..f3bf64670 100644
--- a/channels/sig_pri.c
+++ b/channels/sig_pri.c
@@ -8145,18 +8145,20 @@ int sig_pri_digit_begin(struct sig_pri_chan *pvt, struct ast_channel *ast, char
* \since 1.8
*
* \param pri PRI span control structure.
+ * \param vm_number Voicemail controlling number (NULL if not present).
* \param mbox_number Mailbox number
* \param mbox_context Mailbox context
* \param num_messages Number of messages waiting.
*
* \return Nothing
*/
-static void sig_pri_send_mwi_indication(struct sig_pri_span *pri, const char *mbox_number, const char *mbox_context, int num_messages)
+static void sig_pri_send_mwi_indication(struct sig_pri_span *pri, const char *vm_number, const char *mbox_number, const char *mbox_context, int num_messages)
{
+ struct pri_party_id voicemail;
struct pri_party_id mailbox;
- ast_debug(1, "Send MWI indication for %s@%s num_messages:%d\n", mbox_number,
- mbox_context, num_messages);
+ ast_debug(1, "Send MWI indication for %s@%s vm_number:%s num_messages:%d\n",
+ mbox_number, mbox_context, S_OR(vm_number, "<not-present>"), num_messages);
memset(&mailbox, 0, sizeof(mailbox));
mailbox.number.valid = 1;
@@ -8164,8 +8166,21 @@ static void sig_pri_send_mwi_indication(struct sig_pri_span *pri, const char *mb
mailbox.number.plan = (PRI_TON_UNKNOWN << 4) | PRI_NPI_UNKNOWN;
ast_copy_string(mailbox.number.str, mbox_number, sizeof(mailbox.number.str));
+ memset(&voicemail, 0, sizeof(voicemail));
+ voicemail.number.valid = 1;
+ voicemail.number.presentation = PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
+ voicemail.number.plan = (PRI_TON_UNKNOWN << 4) | PRI_NPI_UNKNOWN;
+ if (vm_number) {
+ ast_copy_string(voicemail.number.str, vm_number, sizeof(voicemail.number.str));
+ }
+
ast_mutex_lock(&pri->lock);
+#if defined(HAVE_PRI_MWI_V2)
+ pri_mwi_indicate_v2(pri->pri, &mailbox, &voicemail, 1 /* speech */, num_messages,
+ NULL, NULL, -1, 0);
+#else /* !defined(HAVE_PRI_MWI_V2) */
pri_mwi_indicate(pri->pri, &mailbox, 1 /* speech */, num_messages, NULL, NULL, -1, 0);
+#endif /* !defined(HAVE_PRI_MWI_V2) */
ast_mutex_unlock(&pri->lock);
}
#endif /* defined(HAVE_PRI_MWI) */
@@ -8187,6 +8202,7 @@ static void sig_pri_mwi_event_cb(const struct ast_event *event, void *userdata)
const char *mbox_context;
const char *mbox_number;
int num_messages;
+ int idx;
mbox_number = ast_event_get_ie_str(event, AST_EVENT_IE_MAILBOX);
if (ast_strlen_zero(mbox_number)) {
@@ -8197,7 +8213,20 @@ static void sig_pri_mwi_event_cb(const struct ast_event *event, void *userdata)
return;
}
num_messages = ast_event_get_ie_uint(event, AST_EVENT_IE_NEWMSGS);
- sig_pri_send_mwi_indication(pri, mbox_number, mbox_context, num_messages);
+
+ for (idx = 0; idx < ARRAY_LEN(pri->mbox); ++idx) {
+ if (!pri->mbox[idx].sub) {
+ /* Mailbox slot is empty */
+ continue;
+ }
+ if (!strcmp(pri->mbox[idx].number, mbox_number)
+ && !strcmp(pri->mbox[idx].context, mbox_context)) {
+ /* Found the mailbox. */
+ sig_pri_send_mwi_indication(pri, pri->mbox[idx].vm_number, mbox_number,
+ mbox_context, num_messages);
+ break;
+ }
+ }
}
#endif /* defined(HAVE_PRI_MWI) */
@@ -8219,8 +8248,8 @@ static void sig_pri_mwi_cache_update(struct sig_pri_span *pri)
for (idx = 0; idx < ARRAY_LEN(pri->mbox); ++idx) {
if (!pri->mbox[idx].sub) {
- /* There are no more mailboxes on this span. */
- break;
+ /* Mailbox slot is empty */
+ continue;
}
event = ast_event_get_cached(AST_EVENT_MWI,
@@ -8232,8 +8261,8 @@ static void sig_pri_mwi_cache_update(struct sig_pri_span *pri)
continue;
}
num_messages = ast_event_get_ie_uint(event, AST_EVENT_IE_NEWMSGS);
- sig_pri_send_mwi_indication(pri, pri->mbox[idx].number, pri->mbox[idx].context,
- num_messages);
+ sig_pri_send_mwi_indication(pri, pri->mbox[idx].vm_number, pri->mbox[idx].number,
+ pri->mbox[idx].context, num_messages);
ast_event_destroy(event);
}
}
@@ -8318,8 +8347,7 @@ int sig_pri_start_pri(struct sig_pri_span *pri)
int i;
#if defined(HAVE_PRI_MWI)
char *saveptr;
- char *mbox_number;
- char *mbox_context;
+ char *prev_vm_number;
struct ast_str *mwi_description = ast_str_alloca(64);
#endif /* defined(HAVE_PRI_MWI) */
@@ -8337,14 +8365,40 @@ int sig_pri_start_pri(struct sig_pri_span *pri)
#if defined(HAVE_PRI_MWI)
/*
+ * Split the mwi_vm_numbers configuration string into the mbox[].vm_number:
+ * vm_number{,vm_number}
+ */
+ prev_vm_number = NULL;
+ saveptr = pri->mwi_vm_numbers;
+ for (i = 0; i < ARRAY_LEN(pri->mbox); ++i) {
+ char *vm_number;
+
+ vm_number = strsep(&saveptr, ",");
+ if (vm_number) {
+ vm_number = ast_strip(vm_number);
+ }
+ if (ast_strlen_zero(vm_number)) {
+ /* There was no number so reuse the previous number. */
+ vm_number = prev_vm_number;
+ } else {
+ /* We have a new number. */
+ prev_vm_number = vm_number;
+ }
+ pri->mbox[i].vm_number = vm_number;
+ }
+
+ /*
* Split the mwi_mailboxes configuration string into the mbox[]:
* mailbox_number[@context]{,mailbox_number[@context]}
*/
- i = 0;
saveptr = pri->mwi_mailboxes;
- while (i < ARRAY_LEN(pri->mbox)) {
+ for (i = 0; i < ARRAY_LEN(pri->mbox); ++i) {
+ char *mbox_number;
+ char *mbox_context;
+
mbox_number = strsep(&saveptr, ",");
if (!mbox_number) {
+ /* No more defined mailboxes. */
break;
}
/* Split the mailbox_number and context */
@@ -8364,6 +8418,8 @@ int sig_pri_start_pri(struct sig_pri_span *pri)
}
/* Fill the mbox[] element. */
+ pri->mbox[i].number = mbox_number;
+ pri->mbox[i].context = mbox_context;
ast_str_set(&mwi_description, -1, "%s span %d[%d] MWI mailbox %s@%s",
sig_pri_cc_type_name, pri->span, i, mbox_number, mbox_context);
pri->mbox[i].sub = ast_event_subscribe(AST_EVENT_MWI, sig_pri_mwi_event_cb,
@@ -8374,11 +8430,13 @@ int sig_pri_start_pri(struct sig_pri_span *pri)
if (!pri->mbox[i].sub) {
ast_log(LOG_ERROR, "%s span %d could not subscribe to MWI events for %s@%s.",
sig_pri_cc_type_name, pri->span, mbox_number, mbox_context);
- continue;
}
- pri->mbox[i].number = mbox_number;
- pri->mbox[i].context = mbox_context;
- ++i;
+#if defined(HAVE_PRI_MWI_V2)
+ if (ast_strlen_zero(pri->mbox[i].vm_number)) {
+ ast_log(LOG_WARNING, "%s span %d MWI voicemail number for %s@%s is empty.\n",
+ sig_pri_cc_type_name, pri->span, mbox_number, mbox_context);
+ }
+#endif /* defined(HAVE_PRI_MWI_V2) */
}
#endif /* defined(HAVE_PRI_MWI) */
diff --git a/channels/sig_pri.h b/channels/sig_pri.h
index 0c9a5e173..f2eef03d6 100644
--- a/channels/sig_pri.h
+++ b/channels/sig_pri.h
@@ -359,12 +359,22 @@ struct sig_pri_chan {
#if defined(HAVE_PRI_MWI)
/*! Maximum number of mailboxes per span. */
#define SIG_PRI_MAX_MWI_MAILBOXES 8
+/*! Typical maximum length of mwi voicemail controlling number */
+#define SIG_PRI_MAX_MWI_VM_NUMBER_LEN 10 /* digits in number */
/*! Typical maximum length of mwi mailbox number */
#define SIG_PRI_MAX_MWI_MBOX_NUMBER_LEN 10 /* digits in number */
/*! Typical maximum length of mwi mailbox context */
#define SIG_PRI_MAX_MWI_CONTEXT_LEN 10
/*!
- * \brief Maximum mwi_mailbox string length.
+ * \brief Maximum mwi_vm_numbers string length.
+ * \details
+ * max_length = #mailboxes * (vm_number + ',')
+ * The last ',' is a null terminator instead.
+ */
+#define SIG_PRI_MAX_MWI_VM_NUMBER_STR (SIG_PRI_MAX_MWI_MAILBOXES \
+ * (SIG_PRI_MAX_MWI_VM_NUMBER_LEN + 1))
+/*!
+ * \brief Maximum mwi_mailboxs string length.
* \details
* max_length = #mailboxes * (mbox_number + '@' + context + ',')
* The last ',' is a null terminator instead.
@@ -382,6 +392,8 @@ struct sig_pri_mbox {
const char *number;
/*! \brief Mailbox context. */
const char *context;
+ /*! \brief Voicemail controlling number. */
+ const char *vm_number;
};
#endif /* defined(HAVE_PRI_MWI) */
@@ -453,6 +465,12 @@ struct sig_pri_span {
* \note String is split apart when span is started.
*/
char mwi_mailboxes[SIG_PRI_MAX_MWI_MAILBOX_STR];
+ /*!
+ * \brief Comma separated list of voicemail access controlling numbers for MWI.
+ * \note Format: vm_number{,vm_number}
+ * \note String is split apart when span is started.
+ */
+ char mwi_vm_numbers[SIG_PRI_MAX_MWI_VM_NUMBER_STR];
#endif /* defined(HAVE_PRI_MWI) */
/*!
* \brief Initial user tag for party id's sent from this device driver.