diff options
author | Mark Michelson <mmichelson@digium.com> | 2012-05-21 19:22:25 +0000 |
---|---|---|
committer | Mark Michelson <mmichelson@digium.com> | 2012-05-21 19:22:25 +0000 |
commit | e5f1f0496a0abdf472e81f1f818a2a942635b64a (patch) | |
tree | 3fbeabb7bd1bffd54ba43dc8a8d5afcc003f7ad4 /channels | |
parent | 45149bfdf8e7116e43f2de967a256439872f9e25 (diff) |
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/trunk@367163 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index a84adeb75..d34d2718e 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -671,7 +671,8 @@ static const struct sip_reasons { { AST_REDIRECTING_REASON_FOLLOW_ME, "follow-me" }, { AST_REDIRECTING_REASON_OUT_OF_ORDER, "out-of-service" }, { 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"}, }; @@ -24257,6 +24258,8 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int int localtransfer = 0; int attendedtransfer = 0; int res = 0; + struct ast_party_redirecting redirecting; + struct ast_set_party_redirecting update_redirecting; if (req->debug) { ast_verbose("Call %s got a SIP call transfer from %s: (REFER)!\n", @@ -24561,6 +24564,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 */ + /* 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 * 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 |