mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-18 18:58:22 +00:00
Add the ability to specify multiple prompts to the Read() dialplan application,
similar to Background() and Playback(). (issue #7897, jsmith, with some modifications) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@47408 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -62,10 +62,10 @@ static char *app = "Read";
|
|||||||
static char *synopsis = "Read a variable";
|
static char *synopsis = "Read a variable";
|
||||||
|
|
||||||
static char *descrip =
|
static char *descrip =
|
||||||
" Read(variable[|filename][|maxdigits][|option][|attempts][|timeout])\n\n"
|
" Read(variable[|filename[&filename2...]][|maxdigits][|option][|attempts][|timeout])\n\n"
|
||||||
"Reads a #-terminated string of digits a certain number of times from the\n"
|
"Reads a #-terminated string of digits a certain number of times from the\n"
|
||||||
"user in to the given variable.\n"
|
"user in to the given variable.\n"
|
||||||
" filename -- file to play before reading digits or tone with option i\n"
|
" filename -- file(s) to play before reading digits or tone with option i\n"
|
||||||
" maxdigits -- maximum acceptable number of digits. Stops reading after\n"
|
" maxdigits -- maximum acceptable number of digits. Stops reading after\n"
|
||||||
" maxdigits have been entered (without requiring the user to\n"
|
" maxdigits have been entered (without requiring the user to\n"
|
||||||
" press the '#' key).\n"
|
" press the '#' key).\n"
|
||||||
|
@@ -84,7 +84,9 @@ int ast_ivr_menu_run(struct ast_channel *c, struct ast_ivr_menu *menu, void *cbd
|
|||||||
|
|
||||||
/*! \brief Plays a stream and gets DTMF data from a channel
|
/*! \brief Plays a stream and gets DTMF data from a channel
|
||||||
* \param c Which channel one is interacting with
|
* \param c Which channel one is interacting with
|
||||||
* \param prompt File to pass to ast_streamfile (the one that you wish to play)
|
* \param prompt File to pass to ast_streamfile (the one that you wish to play).
|
||||||
|
* It is also valid for this to be multiple files concatenated by "&".
|
||||||
|
* For example, "file1&file2&file3".
|
||||||
* \param s The location where the DTMF data will be stored
|
* \param s The location where the DTMF data will be stored
|
||||||
* \param maxlen Max Length of the data
|
* \param maxlen Max Length of the data
|
||||||
* \param timeout Timeout length waiting for data(in milliseconds). Set to 0 for standard timeout(six seconds), or -1 for no time out.
|
* \param timeout Timeout length waiting for data(in milliseconds). Set to 0 for standard timeout(six seconds), or -1 for no time out.
|
||||||
@@ -94,7 +96,7 @@ int ast_ivr_menu_run(struct ast_channel *c, struct ast_ivr_menu *menu, void *cbd
|
|||||||
* is pressed during playback, it will immediately break out of the message and continue
|
* is pressed during playback, it will immediately break out of the message and continue
|
||||||
* execution of your code.
|
* execution of your code.
|
||||||
*/
|
*/
|
||||||
int ast_app_getdata(struct ast_channel *c, char *prompt, char *s, int maxlen, int timeout);
|
int ast_app_getdata(struct ast_channel *c, const char *prompt, char *s, int maxlen, int timeout);
|
||||||
|
|
||||||
/*! \brief Full version with audiofd and controlfd. NOTE: returns '2' on ctrlfd available, not '1' like other full functions */
|
/*! \brief Full version with audiofd and controlfd. NOTE: returns '2' on ctrlfd available, not '1' like other full functions */
|
||||||
int ast_app_getdata_full(struct ast_channel *c, char *prompt, char *s, int maxlen, int timeout, int audiofd, int ctrlfd);
|
int ast_app_getdata_full(struct ast_channel *c, char *prompt, char *s, int maxlen, int timeout, int audiofd, int ctrlfd);
|
||||||
|
46
main/app.c
46
main/app.c
@@ -105,25 +105,45 @@ int ast_app_dtget(struct ast_channel *chan, const char *context, char *collect,
|
|||||||
* \param maxlen How many digits to read (maximum)
|
* \param maxlen How many digits to read (maximum)
|
||||||
* \param timeout set timeout to 0 for "standard" timeouts. Set timeout to -1 for
|
* \param timeout set timeout to 0 for "standard" timeouts. Set timeout to -1 for
|
||||||
* "ludicrous time" (essentially never times out) */
|
* "ludicrous time" (essentially never times out) */
|
||||||
int ast_app_getdata(struct ast_channel *c, char *prompt, char *s, int maxlen, int timeout)
|
int ast_app_getdata(struct ast_channel *c, const char *prompt, char *s, int maxlen, int timeout)
|
||||||
{
|
{
|
||||||
int res,to,fto;
|
int res = 0, to, fto;
|
||||||
|
char *front, *filename;
|
||||||
|
|
||||||
/* XXX Merge with full version? XXX */
|
/* XXX Merge with full version? XXX */
|
||||||
|
|
||||||
if (maxlen)
|
if (maxlen)
|
||||||
s[0] = '\0';
|
s[0] = '\0';
|
||||||
if (prompt) {
|
|
||||||
res = ast_streamfile(c, prompt, c->language);
|
if (ast_strlen_zero(prompt))
|
||||||
if (res < 0)
|
return -1;
|
||||||
|
|
||||||
|
filename = ast_strdupa(prompt);
|
||||||
|
while ((front = strsep(&filename, "&"))) {
|
||||||
|
res = ast_streamfile(c, front, c->language);
|
||||||
|
if (res)
|
||||||
|
continue;
|
||||||
|
if (ast_strlen_zero(filename)) {
|
||||||
|
/* set timeouts for the last prompt */
|
||||||
|
fto = c->pbx ? c->pbx->rtimeout * 1000 : 6000;
|
||||||
|
to = c->pbx ? c->pbx->dtimeout * 1000 : 2000;
|
||||||
|
|
||||||
|
if (timeout > 0)
|
||||||
|
fto = to = timeout;
|
||||||
|
if (timeout < 0)
|
||||||
|
fto = to = 1000000000;
|
||||||
|
} else {
|
||||||
|
/* there is more than one prompt, so
|
||||||
|
get rid of the long timeout between
|
||||||
|
prompts, and make it 50ms */
|
||||||
|
fto = 50;
|
||||||
|
to = c->pbx ? c->pbx->dtimeout * 1000 : 2000;
|
||||||
|
}
|
||||||
|
res = ast_readstring(c, s, maxlen, to, fto, "#");
|
||||||
|
if (!ast_strlen_zero(s))
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
fto = c->pbx ? c->pbx->rtimeout * 1000 : 6000;
|
|
||||||
to = c->pbx ? c->pbx->dtimeout * 1000 : 2000;
|
|
||||||
|
|
||||||
if (timeout > 0)
|
|
||||||
fto = to = timeout;
|
|
||||||
if (timeout < 0)
|
|
||||||
fto = to = 1000000000;
|
|
||||||
res = ast_readstring(c, s, maxlen, to, fto, "#");
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user