<p>N A has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/18034">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">app_mf: Add max digits option to ReceiveMF.<br><br>Adds an option to the ReceiveMF application to allow specifying a<br>maximum number of digits.<br><br>Originally, this capability was not added to ReceiveMF as it was<br>with ReceiveSF because typically a ST digit is used to denote that<br>sending of digits is complete. However, there are certain signaling<br>protocols which simply transmit a digit (such as Expanded In-Band<br>Signaling) and for these, it's necessary to be able to read a<br>certain number of digits, as opposed to until receiving a ST digit.<br><br>This capability is added as an option, as opposed to as a parameter,<br>to remain compatible with existing usage (and not shift the<br>parameters).<br><br>ASTERISK-29877 #close<br><br>Change-Id: I4229167c9aa69b87402c3c2a9065bd8dfa973a0b<br>---<br>M apps/app_mf.c<br>A doc/CHANGES-staging/app_mf_maxdigits.txt<br>2 files changed, 30 insertions(+), 5 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/34/18034/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/apps/app_mf.c b/apps/app_mf.c</span><br><span>index 336e8aa..33c1aaa 100644</span><br><span>--- a/apps/app_mf.c</span><br><span>+++ b/apps/app_mf.c</span><br><span>@@ -71,6 +71,9 @@</span><br><span>                                   <option name="m"></span><br><span>                                            <para>Mute conference.</para></span><br><span>                                    </option></span><br><span style="color: hsl(120, 100%, 40%);">+                                       <option name="n"></span><br><span style="color: hsl(120, 100%, 40%);">+                                             <para>Maximum number of digits, regardless of the sequence.</para></span><br><span style="color: hsl(120, 100%, 40%);">+                                        </option></span><br><span>                                      <option name="o"></span><br><span>                                            <para>Enable override. Repeated KPs will clear all previous digits.</para></span><br><span>                                       </option></span><br><span>@@ -179,6 +182,13 @@</span><br><span>       OPT_NO_KP = (1 << 6),</span><br><span>  OPT_NO_ST = (1 << 7),</span><br><span>  OPT_KP_OVERRIDE = (1 << 8),</span><br><span style="color: hsl(120, 100%, 40%);">+     OPT_MAXDIGITS = (1 << 9),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum {</span><br><span style="color: hsl(120, 100%, 40%);">+ OPT_ARG_MAXDIGITS,</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Must be the last element */</span><br><span style="color: hsl(120, 100%, 40%);">+        OPT_ARG_ARRAY_SIZE,</span><br><span> };</span><br><span> </span><br><span> AST_APP_OPTIONS(read_app_options, {</span><br><span>@@ -186,6 +196,7 @@</span><br><span>   AST_APP_OPTION('l', OPT_LAX_KP),</span><br><span>     AST_APP_OPTION('k', OPT_NO_KP),</span><br><span>      AST_APP_OPTION('m', OPT_MUTE),</span><br><span style="color: hsl(120, 100%, 40%);">+        AST_APP_OPTION_ARG('n', OPT_MAXDIGITS, OPT_ARG_MAXDIGITS),</span><br><span>   AST_APP_OPTION('o', OPT_KP_OVERRIDE),</span><br><span>        AST_APP_OPTION('p', OPT_PROCESS),</span><br><span>    AST_APP_OPTION('q', OPT_QUELCH),</span><br><span>@@ -212,11 +223,12 @@</span><br><span>  * \param override Start over if we receive additional KPs</span><br><span>  * \param no_kp Don't include KP in the output</span><br><span>  * \param no_st Don't include start digits in the output</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param maxdigits If greater than 0, only read this many digits no matter what</span><br><span>  *</span><br><span>  * \retval 0 if successful</span><br><span>  * \retval -1 if unsuccessful.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static int read_mf_digits(struct ast_channel *chan, char *buf, int buflen, int timeout, int features, int laxkp, int override, int no_kp, int no_st) {</span><br><span style="color: hsl(120, 100%, 40%);">+static int read_mf_digits(struct ast_channel *chan, char *buf, int buflen, int timeout, int features, int laxkp, int override, int no_kp, int no_st, int maxdigits) {</span><br><span>     struct ast_dsp *dsp;</span><br><span>         struct ast_frame *frame = NULL;</span><br><span>      struct timeval start;</span><br><span>@@ -245,7 +257,7 @@</span><br><span>                          break;</span><br><span>                       }</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (digits_read >= (buflen - 1)) { /* we don't have room to store any more digits (very unlikely to happen for a legitimate reason) */</span><br><span style="color: hsl(120, 100%, 40%);">+         if ((maxdigits && digits_read >= maxdigits) || digits_read >= (buflen - 1)) { /* we don't have room to store any more digits (very unlikely to happen for a legitimate reason) */</span><br><span>                  /* This result will probably not be usable, so status should not be START */</span><br><span>                         pbx_builtin_setvar_helper(chan, "RECEIVEMFSTATUS", "MAXDIGITS");</span><br><span>                         break;</span><br><span>@@ -320,8 +332,9 @@</span><br><span>         int to = 0;</span><br><span>  double tosec;</span><br><span>        struct ast_flags flags = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+ char *optargs[OPT_ARG_ARRAY_SIZE];</span><br><span>   char *argcopy = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-   int features = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     int features = 0, maxdigits = 0;</span><br><span> </span><br><span>         AST_DECLARE_APP_ARGS(arglist,</span><br><span>                AST_APP_ARG(variable);</span><br><span>@@ -339,7 +352,7 @@</span><br><span>         AST_STANDARD_APP_ARGS(arglist, argcopy);</span><br><span> </span><br><span>         if (!ast_strlen_zero(arglist.options)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ast_app_parse_options(read_app_options, &flags, NULL, arglist.options);</span><br><span style="color: hsl(120, 100%, 40%);">+           ast_app_parse_options(read_app_options, &flags, optargs, arglist.options);</span><br><span>       }</span><br><span> </span><br><span>        if (!ast_strlen_zero(arglist.timeout)) {</span><br><span>@@ -355,6 +368,13 @@</span><br><span>              ast_log(LOG_WARNING, "Invalid! Usage: ReceiveMF(variable[,timeout][,option])\n");</span><br><span>          return -1;</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ast_test_flag(&flags, OPT_MAXDIGITS) && !ast_strlen_zero(optargs[OPT_ARG_MAXDIGITS])) {</span><br><span style="color: hsl(120, 100%, 40%);">+               maxdigits = atoi(optargs[OPT_ARG_MAXDIGITS]);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (maxdigits <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      ast_log(LOG_WARNING, "Invalid maximum number of digits, ignoring: '%s'\n", optargs[OPT_ARG_MAXDIGITS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     maxdigits = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        if (ast_test_flag(&flags, OPT_DELAY)) {</span><br><span>          features |= DSP_DIGITMODE_MUTEMAX;</span><br><span>@@ -373,7 +393,7 @@</span><br><span>     }</span><br><span> </span><br><span>        read_mf_digits(chan, tmp, BUFFER_SIZE, to, features, (ast_test_flag(&flags, OPT_LAX_KP)),</span><br><span style="color: hsl(0, 100%, 40%);">-           (ast_test_flag(&flags, OPT_KP_OVERRIDE)), (ast_test_flag(&flags, OPT_NO_KP)), (ast_test_flag(&flags, OPT_NO_ST)));</span><br><span style="color: hsl(120, 100%, 40%);">+                (ast_test_flag(&flags, OPT_KP_OVERRIDE)), (ast_test_flag(&flags, OPT_NO_KP)), (ast_test_flag(&flags, OPT_NO_ST)), maxdigits);</span><br><span>    pbx_builtin_setvar_helper(chan, arglist.variable, tmp);</span><br><span>      if (!ast_strlen_zero(tmp)) {</span><br><span>                 ast_verb(3, "MF digits received: '%s'\n", tmp);</span><br><span>diff --git a/doc/CHANGES-staging/app_mf_maxdigits.txt b/doc/CHANGES-staging/app_mf_maxdigits.txt</span><br><span>new file mode 100644</span><br><span>index 0000000..4292690</span><br><span>--- /dev/null</span><br><span>+++ b/doc/CHANGES-staging/app_mf_maxdigits.txt</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Subject: app_mf</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Adds an option to ReceiveMF to cap the</span><br><span style="color: hsl(120, 100%, 40%);">+number of digits read at a user-specified</span><br><span style="color: hsl(120, 100%, 40%);">+maximum.</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/18034">change 18034</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/18034"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 19 </div>
<div style="display:none"> Gerrit-Change-Id: I4229167c9aa69b87402c3c2a9065bd8dfa973a0b </div>
<div style="display:none"> Gerrit-Change-Number: 18034 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: N A <mail@interlinked.x10host.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>