[Asterisk-code-review] app_mf: Add max digits option to ReceiveMF. (asterisk[19])

N A asteriskteam at digium.com
Thu Feb 17 11:22:19 CST 2022


N A has uploaded this change for review. ( https://gerrit.asterisk.org/c/asterisk/+/18034 )


Change subject: app_mf: Add max digits option to ReceiveMF.
......................................................................

app_mf: Add max digits option to ReceiveMF.

Adds an option to the ReceiveMF application to allow specifying a
maximum number of digits.

Originally, this capability was not added to ReceiveMF as it was
with ReceiveSF because typically a ST digit is used to denote that
sending of digits is complete. However, there are certain signaling
protocols which simply transmit a digit (such as Expanded In-Band
Signaling) and for these, it's necessary to be able to read a
certain number of digits, as opposed to until receiving a ST digit.

This capability is added as an option, as opposed to as a parameter,
to remain compatible with existing usage (and not shift the
parameters).

ASTERISK-29877 #close

Change-Id: I4229167c9aa69b87402c3c2a9065bd8dfa973a0b
---
M apps/app_mf.c
A doc/CHANGES-staging/app_mf_maxdigits.txt
2 files changed, 30 insertions(+), 5 deletions(-)



  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/34/18034/1

diff --git a/apps/app_mf.c b/apps/app_mf.c
index 336e8aa..33c1aaa 100644
--- a/apps/app_mf.c
+++ b/apps/app_mf.c
@@ -71,6 +71,9 @@
 					<option name="m">
 						<para>Mute conference.</para>
 					</option>
+					<option name="n">
+						<para>Maximum number of digits, regardless of the sequence.</para>
+					</option>
 					<option name="o">
 						<para>Enable override. Repeated KPs will clear all previous digits.</para>
 					</option>
@@ -179,6 +182,13 @@
 	OPT_NO_KP = (1 << 6),
 	OPT_NO_ST = (1 << 7),
 	OPT_KP_OVERRIDE = (1 << 8),
+	OPT_MAXDIGITS = (1 << 9),
+};
+
+enum {
+	OPT_ARG_MAXDIGITS,
+	/* Must be the last element */
+	OPT_ARG_ARRAY_SIZE,
 };
 
 AST_APP_OPTIONS(read_app_options, {
@@ -186,6 +196,7 @@
 	AST_APP_OPTION('l', OPT_LAX_KP),
 	AST_APP_OPTION('k', OPT_NO_KP),
 	AST_APP_OPTION('m', OPT_MUTE),
+	AST_APP_OPTION_ARG('n', OPT_MAXDIGITS, OPT_ARG_MAXDIGITS),
 	AST_APP_OPTION('o', OPT_KP_OVERRIDE),
 	AST_APP_OPTION('p', OPT_PROCESS),
 	AST_APP_OPTION('q', OPT_QUELCH),
@@ -212,11 +223,12 @@
  * \param override Start over if we receive additional KPs
  * \param no_kp Don't include KP in the output
  * \param no_st Don't include start digits in the output
+ * \param maxdigits If greater than 0, only read this many digits no matter what
  *
  * \retval 0 if successful
  * \retval -1 if unsuccessful.
  */
-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) {
+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) {
 	struct ast_dsp *dsp;
 	struct ast_frame *frame = NULL;
 	struct timeval start;
@@ -245,7 +257,7 @@
 				break;
 			}
 		}
-		if (digits_read >= (buflen - 1)) { /* we don't have room to store any more digits (very unlikely to happen for a legitimate reason) */
+		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) */
 			/* This result will probably not be usable, so status should not be START */
 			pbx_builtin_setvar_helper(chan, "RECEIVEMFSTATUS", "MAXDIGITS");
 			break;
@@ -320,8 +332,9 @@
 	int to = 0;
 	double tosec;
 	struct ast_flags flags = {0};
+	char *optargs[OPT_ARG_ARRAY_SIZE];
 	char *argcopy = NULL;
-	int features = 0;
+	int features = 0, maxdigits = 0;
 
 	AST_DECLARE_APP_ARGS(arglist,
 		AST_APP_ARG(variable);
@@ -339,7 +352,7 @@
 	AST_STANDARD_APP_ARGS(arglist, argcopy);
 
 	if (!ast_strlen_zero(arglist.options)) {
-		ast_app_parse_options(read_app_options, &flags, NULL, arglist.options);
+		ast_app_parse_options(read_app_options, &flags, optargs, arglist.options);
 	}
 
 	if (!ast_strlen_zero(arglist.timeout)) {
@@ -355,6 +368,13 @@
 		ast_log(LOG_WARNING, "Invalid! Usage: ReceiveMF(variable[,timeout][,option])\n");
 		return -1;
 	}
+	if (ast_test_flag(&flags, OPT_MAXDIGITS) && !ast_strlen_zero(optargs[OPT_ARG_MAXDIGITS])) {
+		maxdigits = atoi(optargs[OPT_ARG_MAXDIGITS]);
+		if (maxdigits <= 0) {
+			ast_log(LOG_WARNING, "Invalid maximum number of digits, ignoring: '%s'\n", optargs[OPT_ARG_MAXDIGITS]);
+			maxdigits = 0;
+		}
+	}
 
 	if (ast_test_flag(&flags, OPT_DELAY)) {
 		features |= DSP_DIGITMODE_MUTEMAX;
@@ -373,7 +393,7 @@
 	}
 
 	read_mf_digits(chan, tmp, BUFFER_SIZE, to, features, (ast_test_flag(&flags, OPT_LAX_KP)),
-		(ast_test_flag(&flags, OPT_KP_OVERRIDE)), (ast_test_flag(&flags, OPT_NO_KP)), (ast_test_flag(&flags, OPT_NO_ST)));
+		(ast_test_flag(&flags, OPT_KP_OVERRIDE)), (ast_test_flag(&flags, OPT_NO_KP)), (ast_test_flag(&flags, OPT_NO_ST)), maxdigits);
 	pbx_builtin_setvar_helper(chan, arglist.variable, tmp);
 	if (!ast_strlen_zero(tmp)) {
 		ast_verb(3, "MF digits received: '%s'\n", tmp);
diff --git a/doc/CHANGES-staging/app_mf_maxdigits.txt b/doc/CHANGES-staging/app_mf_maxdigits.txt
new file mode 100644
index 0000000..4292690
--- /dev/null
+++ b/doc/CHANGES-staging/app_mf_maxdigits.txt
@@ -0,0 +1,5 @@
+Subject: app_mf
+
+Adds an option to ReceiveMF to cap the
+number of digits read at a user-specified
+maximum.

-- 
To view, visit https://gerrit.asterisk.org/c/asterisk/+/18034
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: 19
Gerrit-Change-Id: I4229167c9aa69b87402c3c2a9065bd8dfa973a0b
Gerrit-Change-Number: 18034
Gerrit-PatchSet: 1
Gerrit-Owner: N A <mail at interlinked.x10host.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20220217/0cb4098f/attachment-0001.html>


More information about the asterisk-code-review mailing list