Author: mmichelson
Date: Mon Nov 17 10:51:16 2014
New Revision: 428145

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=428145
Log:
Allow for transferer to retry when dialing an invalid extension.

This allows for a configurable number of attempts for a transferer
to dial an extension to transfer the call to. For Asterisk 13, the
default values are such that upgrading between versions will not
cause a behaivour change. For trunk, though, the defaults will be
changed to be more user-friendly.

Review: https://reviewboard.asterisk.org/r/4167


Modified:
    branches/13/CHANGES
    branches/13/configs/samples/features.conf.sample
    branches/13/include/asterisk/features_config.h
    branches/13/main/bridge_basic.c
    branches/13/main/features_config.c

Modified: branches/13/CHANGES
URL: 
http://svnview.digium.com/svn/asterisk/branches/13/CHANGES?view=diff&rev=428145&r1=428144&r2=428145
==============================================================================
--- branches/13/CHANGES (original)
+++ branches/13/CHANGES Mon Nov 17 10:51:16 2014
@@ -7,6 +7,19 @@
 === and the other UPGRADE files for older releases.
 ===
 ==============================================================================
+------------------------------------------------------------------------------
+--- Functionality changes from Asterisk 13.0.0 to Asterisk 13.1.0 ------------
+------------------------------------------------------------------------------
+
+Transfers
+-----------------
+
+The features.conf general section has three new configurable options:
+    * transferdialattempts
+       * transferretrysound
+       * transferinvalidsound
+For more information on what these options do, see the Asterisk wiki:
+       https://wiki.asterisk.org/wiki/x/W4fAAQ
 
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 12 to Asterisk 13 --------------------

Modified: branches/13/configs/samples/features.conf.sample
URL: 
http://svnview.digium.com/svn/asterisk/branches/13/configs/samples/features.conf.sample?view=diff&rev=428145&r1=428144&r2=428145
==============================================================================
--- branches/13/configs/samples/features.conf.sample (original)
+++ branches/13/configs/samples/features.conf.sample Mon Nov 17 10:51:16 2014
@@ -24,6 +24,10 @@
 ;atxferloopdelay = 10           ; Number of seconds to sleep between retries 
(if atxferdropcall = no)
 ;atxfercallbackretries = 2      ; Number of times to attempt to send the call 
back to the transferer.
                                 ; By default, this is 2.
+;transferdialattempts = 3       ; Number of times that a transferer may 
attempt to dial an extension before
+                                ; being kicked back to the original call.
+;transferretrysound = "beep"    ; Sound to play when a transferer fails to 
dial a valid extension.
+;transferinvalidsound = "beeperr" ; Sound to play when a transferer fails to 
dial a valid extension and is out of retries.
 
 
 ; Note that the DTMF features listed below only work when two channels have 
answered and are bridged together.

Modified: branches/13/include/asterisk/features_config.h
URL: 
http://svnview.digium.com/svn/asterisk/branches/13/include/asterisk/features_config.h?view=diff&rev=428145&r1=428144&r2=428145
==============================================================================
--- branches/13/include/asterisk/features_config.h (original)
+++ branches/13/include/asterisk/features_config.h Mon Nov 17 10:51:16 2014
@@ -68,6 +68,10 @@
                AST_STRING_FIELD(atxferthreeway);
                /*! DTMF sequence used to swap which party the transferer is 
talking to */
                AST_STRING_FIELD(atxferswap);
+               /*! Sound played when an invalid extension is dialed, and the 
transferer should retry. */
+               AST_STRING_FIELD(transferretrysound);
+               /*! Sound played when an invalid extension is dialed, and the 
transferer is being returned to the call. */
+               AST_STRING_FIELD(transferinvalidsound);
        );
        /*! Seconds allowed between digit presses when dialing transfer 
destination */
        unsigned int transferdigittimeout;
@@ -79,6 +83,8 @@
        unsigned int atxfercallbackretries;
        /*! Determines if the call is dropped on attended transfer failure */
        unsigned int atxferdropcall;
+       /*! Number of dial attempts allowed for blind/attended transfers */
+       unsigned int transferdialattempts;
 };
 
 /*!

Modified: branches/13/main/bridge_basic.c
URL: 
http://svnview.digium.com/svn/asterisk/branches/13/main/bridge_basic.c?view=diff&rev=428145&r1=428144&r2=428145
==============================================================================
--- branches/13/main/bridge_basic.c (original)
+++ branches/13/main/bridge_basic.c Mon Nov 17 10:51:16 2014
@@ -47,6 +47,7 @@
 #include "asterisk/stasis_bridges.h"
 #include "asterisk/features.h"
 #include "asterisk/format_cache.h"
+#include "asterisk/test.h"
 
 #define NORMAL_FLAGS   (AST_BRIDGE_FLAG_DISSOLVE_HANGUP | 
AST_BRIDGE_FLAG_DISSOLVE_EMPTY \
                        | AST_BRIDGE_FLAG_SMART)
@@ -2977,7 +2978,11 @@
 {
        int res;
        int digit_timeout;
+       int attempts = 0;
+       int max_attempts;
        RAII_VAR(struct ast_features_xfer_config *, xfer_cfg, NULL, 
ao2_cleanup);
+       char *retry_sound;
+       char *invalid_sound;
 
        ast_channel_lock(chan);
        xfer_cfg = ast_get_chan_features_xfer_config(chan);
@@ -2987,6 +2992,9 @@
                return -1;
        }
        digit_timeout = xfer_cfg->transferdigittimeout * 1000;
+       max_attempts = xfer_cfg->transferdialattempts;
+       retry_sound = ast_strdupa(xfer_cfg->transferretrysound);
+       invalid_sound = ast_strdupa(xfer_cfg->transferinvalidsound);
        ast_channel_unlock(chan);
 
        /* Play the simple "transfer" prompt out and wait */
@@ -3002,24 +3010,48 @@
        }
 
        /* Drop to dialtone so they can enter the extension they want to 
transfer to */
-       res = ast_app_dtget(chan, context, exten, exten_len, exten_len - 1, 
digit_timeout);
-       if (res < 0) {
-               /* Hangup or error */
-               res = -1;
-       } else if (!res) {
-               /* 0 for invalid extension dialed. */
-               if (ast_strlen_zero(exten)) {
-                       ast_debug(1, "%s dialed no digits.\n", 
ast_channel_name(chan));
+       do {
+               ++attempts;
+               memset(exten, 0, exten_len);
+               ast_test_suite_event_notify("TRANSFER_BEGIN_DIAL",
+                               "Channel: %s\r\n"
+                               "Attempt: %d",
+                               ast_channel_name(chan), attempts);
+               res = ast_app_dtget(chan, context, exten, exten_len, exten_len 
- 1, digit_timeout);
+               if (res < 0) {
+                       /* Hangup or error */
+                       res = -1;
+               } else if (!res) {
+                       /* 0 for invalid extension dialed. */
+                       if (ast_strlen_zero(exten)) {
+                               ast_debug(1, "%s dialed no digits.\n", 
ast_channel_name(chan));
+                       } else {
+                               ast_debug(1, "%s dialed '%s@%s' does not 
exist.\n",
+                                       ast_channel_name(chan), exten, context);
+                       }
+                       if (attempts < max_attempts) {
+                               ast_stream_and_wait(chan, retry_sound, 
AST_DIGIT_NONE);
+                       } else {
+                               ast_stream_and_wait(chan, invalid_sound, 
AST_DIGIT_NONE);
+                       }
+                       res = -1;
                } else {
-                       ast_debug(1, "%s dialed '%s@%s' does not exist.\n",
-                               ast_channel_name(chan), exten, context);
+                       /* Dialed extension is valid. */
+                       res = 0;
                }
-               ast_stream_and_wait(chan, "pbx-invalid", AST_DIGIT_NONE);
-               res = -1;
-       } else {
-               /* Dialed extension is valid. */
-               res = 0;
-       }
+               ast_test_suite_event_notify("TRANSFER_DIALLED",
+                               "Channel: %s\r\n"
+                               "Attempt: %d\r\n"
+                               "Dialled: %s\r\n"
+                               "Result: %s",
+                               ast_channel_name(chan), attempts, exten, res == 
0 ? "Success" : "Failure");
+       } while (res < 0 && attempts < max_attempts);
+
+       ast_test_suite_event_notify("TRANSFER_DIAL_FINAL",
+                       "Channel: %s\r\n"
+                       "Result: %s",
+                       ast_channel_name(chan), res == 0 ? "Success" : 
"Failure");
+
        return res;
 }
 

Modified: branches/13/main/features_config.c
URL: 
http://svnview.digium.com/svn/asterisk/branches/13/main/features_config.c?view=diff&rev=428145&r1=428144&r2=428145
==============================================================================
--- branches/13/main/features_config.c (original)
+++ branches/13/main/features_config.c Mon Nov 17 10:51:16 2014
@@ -131,6 +131,15 @@
                                </configOption>
                                <configOption name="pickupfailsound">
                                        <synopsis>Sound to play to picker when 
a call cannot be picked up</synopsis>
+                               </configOption>
+                               <configOption name="transferdialattempts" 
default="3">
+                                       <synopsis>Number of dial attempts 
allowed when attempting a transfer</synopsis>
+                               </configOption>
+                               <configOption name="transferretrysound" 
default="pbx-invalid">
+                                       <synopsis>Sound that is played when an 
incorrect extension is dialed and the transferer should try again.</synopsis>
+                               </configOption>
+                               <configOption name="transferinvalidsound" 
default="privacy-incorrect">
+                                       <synopsis>Sound that is played when an 
incorrect extension is dialed and the transferer has no attempts 
remaining.</synopsis>
                                </configOption>
                        </configObject>
                        <configObject name="featuremap">
@@ -306,6 +315,9 @@
                                        <enum 
name="pickupfailsound"><para><xi:include 
xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='pickupfailsound']/synopsis/text())"
 /></para></enum>
                                        <enum 
name="courtesytone"><para><xi:include 
xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='courtesytone']/synopsis/text())"
 /></para></enum>
                                        <enum 
name="recordingfailsound"><para><xi:include 
xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='recordingfailsound']/synopsis/text())"
 /></para></enum>
+                                       <enum 
name="transferdialattempts"><para><xi:include 
xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferdialattempts']/synopsis/text())"
 /></para></enum>
+                                       <enum 
name="transferretrysound"><para><xi:include 
xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferretrysound']/synopsis/text())"
 /></para></enum>
+                                       <enum 
name="transferinvalidsound"><para><xi:include 
xpointer="xpointer(/docs/configInfo[@name='features']/configFile[@name='features.conf']/configObject[@name='globals']/configOption[@name='transferinvalidsound']/synopsis/text())"
 /></para></enum>
                                </enumlist>
                        </parameter>
                </syntax>
@@ -366,6 +378,9 @@
 #define DEFAULT_ATXFER_COMPLETE                     "*2"
 #define DEFAULT_ATXFER_THREEWAY                     "*3"
 #define DEFAULT_ATXFER_SWAP                         "*4"
+#define DEFAULT_TRANSFER_DIAL_ATTEMPTS              1
+#define DEFAULT_TRANSFER_RETRY_SOUND                "pbx-invalid"
+#define DEFAULT_TRANSFER_INVALID_SOUND              "pbx-invalid"
 
 /*! Default pickup options */
 #define DEFAULT_PICKUPEXTEN                         "*8"
@@ -773,6 +788,7 @@
        dest->atxferloopdelay = src->atxferloopdelay;
        dest->atxfercallbackretries = src->atxfercallbackretries;
        dest->atxferdropcall = src->atxferdropcall;
+       dest->transferdialattempts = src->transferdialattempts;
 }
 
 static void pickup_copy(struct ast_features_pickup_config *dest, const struct 
ast_features_pickup_config *src)
@@ -882,6 +898,12 @@
                ast_string_field_set(xfer, atxferthreeway, value);
        } else if (!strcasecmp(name, "atxferswap")) {
                ast_string_field_set(xfer, atxferswap, value);
+       } else if (!strcasecmp(name, "transferdialattempts")) {
+               res = ast_parse_arg(value, PARSE_INT32, 
&xfer->transferdialattempts);
+       } else if (!strcasecmp(name, "transferretrysound")) {
+               ast_string_field_set(xfer, transferretrysound, value);
+       } else if (!strcasecmp(name, "transferinvalidsound")) {
+               ast_string_field_set(xfer, transferinvalidsound, value);
        } else {
                /* Unrecognized option */
                res = -1;
@@ -917,6 +939,12 @@
                ast_copy_string(buf, xfer->atxferthreeway, len);
        } else if (!strcasecmp(field, "atxferswap")) {
                ast_copy_string(buf, xfer->atxferswap, len);
+       } else if (!strcasecmp(field, "transferdialattempts")) {
+               snprintf(buf, len, "%u", xfer->transferdialattempts);
+       } else if (!strcasecmp(field, "transferretrysound")) {
+               ast_copy_string(buf, xfer->transferretrysound, len);
+       } else if (!strcasecmp(field, "transferinvalidsound")) {
+               ast_copy_string(buf, xfer->transferinvalidsound, len);
        } else {
                /* Unrecognized option */
                res = -1;
@@ -1731,6 +1759,12 @@
                        DEFAULT_ATXFER_THREEWAY, xfer_handler, 0);
        aco_option_register_custom(&cfg_info, "atxferswap", ACO_EXACT, 
global_options,
                        DEFAULT_ATXFER_SWAP, xfer_handler, 0);
+       aco_option_register_custom(&cfg_info, "transferdialattempts", 
ACO_EXACT, global_options,
+                       __stringify(DEFAULT_TRANSFER_DIAL_ATTEMPTS), 
xfer_handler, 0);
+       aco_option_register_custom(&cfg_info, "transferretrysound", ACO_EXACT, 
global_options,
+                       DEFAULT_TRANSFER_RETRY_SOUND, xfer_handler, 0);
+       aco_option_register_custom(&cfg_info, "transferinvalidsound", 
ACO_EXACT, global_options,
+                       DEFAULT_TRANSFER_INVALID_SOUND, xfer_handler, 0);
 
        aco_option_register_custom(&cfg_info, "pickupexten", ACO_EXACT, 
global_options,
                        DEFAULT_PICKUPEXTEN, pickup_handler, 0);


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to