Add "send to voicemail" Digium phone functionality to Asterisk.
authorMark Michelson <mmichelson@digium.com>
Mon, 21 May 2012 19:22:25 +0000 (19:22 +0000)
committerMark Michelson <mmichelson@digium.com>
Mon, 21 May 2012 19:22:25 +0000 (19:22 +0000)
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

channels/chan_sip.c
include/asterisk/callerid.h
main/callerid.c

index a84adeb..d34d271 100644 (file)
@@ -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
index c047632..7c4905e 100644 (file)
@@ -400,6 +400,7 @@ enum AST_REDIRECTING_REASON {
        AST_REDIRECTING_REASON_OUT_OF_ORDER,
        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_SEND_TO_VM,
 };
 
 /*!
index dc3a910..37edd99 100644 (file)
@@ -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_AWAY,           "away",         "Callee is Away" },
        { 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* */
 };