mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-30 07:41:39 +00:00
Add "send to voicemail" Digium phone functionality to Asterisk.
This change accommodates two methods by which calls can be directed to a user's voicemail. * Incoming calls can be redirected to any user's voicemail. * Established calls can be blind transferred to any user's voicemail. Digium phones indicate the desire to direct a call to voicemail by using a Diversion header with a reason parameter of "send_to_vm". This patch adds the "send_to_vm" reason as a valid redirecting reason. In addition, chan_sip.c has been modified to update redirecting information on the transferred channel by reading a Diversion header on a REFER request. (closes issue AST-871) Reported by Malcolm Davenport Review: https://reviewboard.asterisk.org/r/1925 git-svn-id: https://origsvn.digium.com/svn/asterisk/certified/branches/1.8.11@367161 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -683,7 +683,8 @@ static const struct sip_reasons {
|
|||||||
{ AST_REDIRECTING_REASON_FOLLOW_ME, "follow-me" },
|
{ AST_REDIRECTING_REASON_FOLLOW_ME, "follow-me" },
|
||||||
{ AST_REDIRECTING_REASON_OUT_OF_ORDER, "out-of-service" },
|
{ AST_REDIRECTING_REASON_OUT_OF_ORDER, "out-of-service" },
|
||||||
{ AST_REDIRECTING_REASON_AWAY, "away" },
|
{ AST_REDIRECTING_REASON_AWAY, "away" },
|
||||||
{ AST_REDIRECTING_REASON_CALL_FWD_DTE, "unknown"}
|
{ AST_REDIRECTING_REASON_CALL_FWD_DTE, "unknown"},
|
||||||
|
{ AST_REDIRECTING_REASON_SEND_TO_VM, "send_to_vm"},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -15390,7 +15391,7 @@ static int get_rdnis(struct sip_pvt *p, struct sip_request *oreq, char **name, c
|
|||||||
}
|
}
|
||||||
/* Remove enclosing double-quotes */
|
/* Remove enclosing double-quotes */
|
||||||
if (*reason_param == '"')
|
if (*reason_param == '"')
|
||||||
ast_strip_quoted(reason_param, "\"", "\"");
|
reason_param = ast_strip_quoted(reason_param, "\"", "\"");
|
||||||
if (!ast_strlen_zero(reason_param)) {
|
if (!ast_strlen_zero(reason_param)) {
|
||||||
sip_set_redirstr(p, reason_param);
|
sip_set_redirstr(p, reason_param);
|
||||||
if (p->owner) {
|
if (p->owner) {
|
||||||
@@ -23673,6 +23674,8 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
|
|||||||
int localtransfer = 0;
|
int localtransfer = 0;
|
||||||
int attendedtransfer = 0;
|
int attendedtransfer = 0;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
struct ast_party_redirecting redirecting;
|
||||||
|
struct ast_set_party_redirecting update_redirecting;
|
||||||
|
|
||||||
if (req->debug) {
|
if (req->debug) {
|
||||||
ast_verbose("Call %s got a SIP call transfer from %s: (REFER)!\n",
|
ast_verbose("Call %s got a SIP call transfer from %s: (REFER)!\n",
|
||||||
@@ -23977,6 +23980,16 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
|
|||||||
}
|
}
|
||||||
ast_set_flag(&p->flags[0], SIP_DEFER_BYE_ON_TRANSFER); /* Delay hangup */
|
ast_set_flag(&p->flags[0], SIP_DEFER_BYE_ON_TRANSFER); /* Delay hangup */
|
||||||
|
|
||||||
|
/* When a call is transferred to voicemail from a Digium phone, there may be
|
||||||
|
* a Diversion header present in the REFER with an appropriate reason parameter
|
||||||
|
* set. We need to update the redirecting information appropriately.
|
||||||
|
*/
|
||||||
|
ast_party_redirecting_init(&redirecting);
|
||||||
|
memset(&update_redirecting, 0, sizeof(update_redirecting));
|
||||||
|
change_redirecting_information(p, req, &redirecting, &update_redirecting, FALSE);
|
||||||
|
ast_channel_update_redirecting(current.chan2, &redirecting, &update_redirecting);
|
||||||
|
ast_party_redirecting_free(&redirecting);
|
||||||
|
|
||||||
/* Do not hold the pvt lock during the indicate and async_goto. Those functions
|
/* Do not hold the pvt lock during the indicate and async_goto. Those functions
|
||||||
* lock channels which will invalidate locking order if the pvt lock is held.*/
|
* lock channels which will invalidate locking order if the pvt lock is held.*/
|
||||||
/* For blind transfers, move the call to the new extensions. For attended transfers on multiple
|
/* For blind transfers, move the call to the new extensions. For attended transfers on multiple
|
||||||
|
|||||||
@@ -400,6 +400,7 @@ enum AST_REDIRECTING_REASON {
|
|||||||
AST_REDIRECTING_REASON_OUT_OF_ORDER,
|
AST_REDIRECTING_REASON_OUT_OF_ORDER,
|
||||||
AST_REDIRECTING_REASON_AWAY,
|
AST_REDIRECTING_REASON_AWAY,
|
||||||
AST_REDIRECTING_REASON_CALL_FWD_DTE, /* This is something defined in Q.931, and no I don't know what it means */
|
AST_REDIRECTING_REASON_CALL_FWD_DTE, /* This is something defined in Q.931, and no I don't know what it means */
|
||||||
|
AST_REDIRECTING_REASON_SEND_TO_VM,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -1203,6 +1203,7 @@ static const struct ast_value_translation redirecting_reason_types[] = {
|
|||||||
{ AST_REDIRECTING_REASON_OUT_OF_ORDER, "out_of_order", "Called DTE Out-Of-Order" },
|
{ AST_REDIRECTING_REASON_OUT_OF_ORDER, "out_of_order", "Called DTE Out-Of-Order" },
|
||||||
{ AST_REDIRECTING_REASON_AWAY, "away", "Callee is Away" },
|
{ AST_REDIRECTING_REASON_AWAY, "away", "Callee is Away" },
|
||||||
{ AST_REDIRECTING_REASON_CALL_FWD_DTE, "cf_dte", "Call Forwarding By The Called DTE" },
|
{ AST_REDIRECTING_REASON_CALL_FWD_DTE, "cf_dte", "Call Forwarding By The Called DTE" },
|
||||||
|
{ AST_REDIRECTING_REASON_SEND_TO_VM, "send_to_vm", "Call is being redirected to user's voicemail"},
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user