summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorKinsey Moore <kmoore@digium.com>2013-08-22 22:33:48 +0000
committerKinsey Moore <kmoore@digium.com>2013-08-22 22:33:48 +0000
commit7b032c1adb10d79f8610e88d2baf5cacf3ba9f58 (patch)
tree7c10a365fa41daaf9ad9bb1535d6ebad188cb406 /main
parentaefebebd37add82bbea2d3423a5fc5f28feb2c60 (diff)
Add SayAlphaCase and similar functionality for AGI
This adds a new dialplan application, SayAlphaCase, that performs much the same function as SayAlpha except that it takes additional options which allow the user to specify whether the case of each letter should be announced for uppercase, lowercase, or all letters. Similar functionality has been added to the SAY ALPHA AGI command via an optional parameter. Original Patch by: Kevin Scott Adams Reported by: Kevin Scott Adams Review: https://reviewboard.asterisk.org/r/2725/ (closes issue ASTERISK-20782) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@397493 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r--main/channel.c4
-rw-r--r--main/pbx.c94
-rw-r--r--main/say.c39
3 files changed, 129 insertions, 8 deletions
diff --git a/main/channel.c b/main/channel.c
index c5ff77b86..5daf5825e 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -7792,9 +7792,9 @@ int ast_say_digit_str(struct ast_channel *chan, const char *str,
}
int ast_say_character_str(struct ast_channel *chan, const char *str,
- const char *ints, const char *lang)
+ const char *ints, const char *lang, enum ast_say_case_sensitivity sensitivity)
{
- return ast_say_character_str_full(chan, str, ints, lang, -1, -1);
+ return ast_say_character_str_full(chan, str, ints, lang, sensitivity, -1, -1);
}
int ast_say_phonetic_str(struct ast_channel *chan, const char *str,
diff --git a/main/pbx.c b/main/pbx.c
index d5a46a5fd..27a586ef9 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -501,6 +501,46 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
<ref type="function">CHANNEL</ref>
</see-also>
</application>
+ <application name="SayAlphaCase" language="en_US">
+ <synopsis>
+ Say Alpha.
+ </synopsis>
+ <syntax>
+ <parameter name="casetype" required="true" >
+ <enumlist>
+ <enum name="a">
+ <para>Case sensitive (all) pronunciation.
+ (Ex: SayAlphaCase(a,aBc); - lowercase a uppercase b lowercase c).</para>
+ </enum>
+ <enum name="l">
+ <para>Case sensitive (lower) pronunciation.
+ (Ex: SayAlphaCase(l,aBc); - lowercase a b lowercase c).</para>
+ </enum>
+ <enum name="n">
+ <para>Case insensitive pronunciation. Equivalent to SayAlpha.
+ (Ex: SayAlphaCase(n,aBc) - a b c).</para>
+ </enum>
+ <enum name="u">
+ <para>Case sensitive (upper) pronunciation.
+ (Ex: SayAlphaCase(u,aBc); - a uppercase b c).</para>
+ </enum>
+ </enumlist>
+ </parameter>
+ <parameter name="string" required="true" />
+ </syntax>
+ <description>
+ <para>This application will play the sounds that correspond to the letters of the
+ given <replaceable>string</replaceable>. Optionally, a <replaceable>casetype</replaceable> may be
+ specified. This will be used for case-insensitive or case-sensitive pronunciations.</para>
+ </description>
+ <see-also>
+ <ref type="application">SayDigits</ref>
+ <ref type="application">SayNumber</ref>
+ <ref type="application">SayPhonetic</ref>
+ <ref type="application">SayAlpha</ref>
+ <ref type="function">CHANNEL</ref>
+ </see-also>
+ </application>
<application name="SayDigits" language="en_US">
<synopsis>
Say Digits.
@@ -1122,6 +1162,7 @@ static int pbx_builtin_execiftime(struct ast_channel *, const char *);
static int pbx_builtin_saynumber(struct ast_channel *, const char *);
static int pbx_builtin_saydigits(struct ast_channel *, const char *);
static int pbx_builtin_saycharacters(struct ast_channel *, const char *);
+static int pbx_builtin_saycharacters_case(struct ast_channel *, const char *);
static int pbx_builtin_sayphonetic(struct ast_channel *, const char *);
static int matchcid(const char *cidpattern, const char *callerid);
#ifdef NEED_DEBUG
@@ -1297,6 +1338,7 @@ static struct pbx_builtin {
{ "RaiseException", pbx_builtin_raise_exception },
{ "Ringing", pbx_builtin_ringing },
{ "SayAlpha", pbx_builtin_saycharacters },
+ { "SayAlphaCase", pbx_builtin_saycharacters_case },
{ "SayDigits", pbx_builtin_saydigits },
{ "SayNumber", pbx_builtin_saynumber },
{ "SayPhonetic", pbx_builtin_sayphonetic },
@@ -11260,12 +11302,60 @@ static int pbx_builtin_saydigits(struct ast_channel *chan, const char *data)
return res;
}
+static int pbx_builtin_saycharacters_case(struct ast_channel *chan, const char *data)
+{
+ int res = 0;
+ int sensitivity = 0;
+ char *parse;
+ AST_DECLARE_APP_ARGS(args,
+ AST_APP_ARG(options);
+ AST_APP_ARG(characters);
+ );
+
+ if (ast_strlen_zero(data)) {
+ ast_log(LOG_WARNING, "SayAlphaCase requires two arguments (options, characters)\n");
+ return 0;
+ }
+
+ parse = ast_strdupa(data);
+ AST_STANDARD_APP_ARGS(args, parse);
+
+ if (!args.options || strlen(args.options) != 1) {
+ ast_log(LOG_WARNING, "SayAlphaCase options are mutually exclusive and required\n");
+ return 0;
+ }
+
+ switch (args.options[0]) {
+ case 'a':
+ sensitivity = AST_SAY_CASE_ALL;
+ break;
+ case 'l':
+ sensitivity = AST_SAY_CASE_LOWER;
+ break;
+ case 'n':
+ sensitivity = AST_SAY_CASE_NONE;
+ break;
+ case 'u':
+ sensitivity = AST_SAY_CASE_UPPER;
+ break;
+ default:
+ ast_log(LOG_WARNING, "Invalid option: '%s'\n", args.options);
+ return 0;
+ }
+
+ res = ast_say_character_str(chan, args.characters, "", ast_channel_language(chan), sensitivity);
+
+ return res;
+}
+
static int pbx_builtin_saycharacters(struct ast_channel *chan, const char *data)
{
int res = 0;
- if (data)
- res = ast_say_character_str(chan, data, "", ast_channel_language(chan));
+ if (data) {
+ res = ast_say_character_str(chan, data, "", ast_channel_language(chan), AST_SAY_CASE_NONE);
+ }
+
return res;
}
diff --git a/main/say.c b/main/say.c
index 295d4110f..ed0a7b524 100644
--- a/main/say.c
+++ b/main/say.c
@@ -61,13 +61,15 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
static int wait_file(struct ast_channel *chan, const char *ints, const char *file, const char *lang);
-static int say_character_str_full(struct ast_channel *chan, const char *str, const char *ints, const char *lang, int audiofd, int ctrlfd)
+static int say_character_str_full(struct ast_channel *chan, const char *str, const char *ints, const char *lang, enum ast_say_case_sensitivity sensitivity, int audiofd, int ctrlfd)
{
const char *fn;
char fnbuf[10], asciibuf[20] = "letters/ascii";
char ltr;
int num = 0;
int res = 0;
+ int upper = 0;
+ int lower = 0;
while (str[num] && !res) {
fn = NULL;
@@ -121,9 +123,35 @@ static int say_character_str_full(struct ast_channel *chan, const char *str, con
break;
default:
ltr = str[num];
- if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
- strcpy(fnbuf, "letters/X");
- fnbuf[8] = ltr;
+ if ('A' <= ltr && ltr <= 'Z') {
+ ltr += 'a' - 'A'; /* file names are all lower-case */
+ switch (sensitivity) {
+ case AST_SAY_CASE_UPPER:
+ case AST_SAY_CASE_ALL:
+ upper = !upper;
+ case AST_SAY_CASE_LOWER:
+ case AST_SAY_CASE_NONE:
+ break;
+ }
+ } else if ('a' <= ltr && ltr <= 'z') {
+ switch (sensitivity) {
+ case AST_SAY_CASE_LOWER:
+ case AST_SAY_CASE_ALL:
+ lower = !lower;
+ case AST_SAY_CASE_UPPER:
+ case AST_SAY_CASE_NONE:
+ break;
+ }
+ }
+
+ if (upper) {
+ strcpy(fnbuf, "uppercase");
+ } else if (lower) {
+ strcpy(fnbuf, "lowercase");
+ } else {
+ strcpy(fnbuf, "letters/X");
+ fnbuf[8] = ltr;
+ }
fn = fnbuf;
}
if ((fn && ast_fileexists(fn, NULL, lang) > 0) ||
@@ -137,6 +165,9 @@ static int say_character_str_full(struct ast_channel *chan, const char *str, con
}
ast_stopstream(chan);
}
+ if (upper || lower) {
+ continue;
+ }
num++;
}