aboutsummaryrefslogtreecommitdiffstats
path: root/say.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2002-08-06 13:43:04 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2002-08-06 13:43:04 +0000
commit0c248cdc2fe3977ae51d86c04ffb0a22945f3d2b (patch)
treec03ced07be45830849cdce5063e953383b085872 /say.c
parentca17dbe2df06b4977e616077b7750117e82c86cb (diff)
Version 0.2.0 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@499 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'say.c')
-rwxr-xr-xsay.c199
1 files changed, 198 insertions, 1 deletions
diff --git a/say.c b/say.c
index baa30c7c6..9cfdfc4a8 100755
--- a/say.c
+++ b/say.c
@@ -51,7 +51,7 @@ int ast_say_number(struct ast_channel *chan, int num, char *ints, char *language
} else {
/* Use english numbers */
language = "en";
- while(num && !res) {
+ while(!res && (num || playh)) {
if (playh) {
snprintf(fn, sizeof(fn), "digits/hundred");
playh = 0;
@@ -100,3 +100,200 @@ int ast_say_number(struct ast_channel *chan, int num, char *ints, char *language
}
return res;
}
+
+int ast_say_date(struct ast_channel *chan, time_t t, char *ints, char *lang)
+{
+ struct tm *tm;
+ char fn[256];
+ int res = 0;
+ tm = localtime(&t);
+ if (!tm) {
+ ast_log(LOG_WARNING, "Unable to derive local time\n");
+ return -1;
+ }
+ if (!res) {
+ snprintf(fn, sizeof(fn), "digits/day-%d", tm->tm_wday);
+ res = ast_streamfile(chan, fn, lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ }
+ if (!res) {
+ snprintf(fn, sizeof(fn), "digits/mon-%d", tm->tm_mon);
+ res = ast_streamfile(chan, fn, lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ }
+ if (!res)
+ res = ast_say_number(chan, tm->tm_mday, ints, lang);
+
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ if (!res)
+ res = ast_say_number(chan, tm->tm_year + 1900, ints, lang);
+ return res;
+}
+
+int ast_say_time(struct ast_channel *chan, time_t t, char *ints, char *lang)
+{
+ struct tm *tm;
+ int res = 0;
+ int hour, pm=0;
+ tm = localtime(&t);
+ if (!tm) {
+ ast_log(LOG_WARNING, "Unable to derive local time\n");
+ return -1;
+ }
+ hour = tm->tm_hour;
+ if (!hour)
+ hour = 12;
+ else if (hour == 12)
+ pm = 1;
+ else if (hour > 12) {
+ hour -= 12;
+ pm = 1;
+ }
+ if (!res)
+ res = ast_say_number(chan, hour, ints, lang);
+
+ if (tm->tm_min > 9) {
+ if (!res)
+ res = ast_say_number(chan, tm->tm_min, ints, lang);
+ } else if (tm->tm_min) {
+ if (!res)
+ res = ast_streamfile(chan, "digits/oh", lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ if (!res)
+ res = ast_say_number(chan, tm->tm_min, ints, lang);
+ } else {
+ if (!res)
+ res = ast_streamfile(chan, "digits/oclock", lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ }
+ if (pm) {
+ if (!res)
+ res = ast_streamfile(chan, "digits/p-m", lang);
+ } else {
+ if (!res)
+ res = ast_streamfile(chan, "digits/a-m", lang);
+ }
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ return res;
+}
+
+int ast_say_datetime(struct ast_channel *chan, time_t t, char *ints, char *lang)
+{
+ struct tm *tm;
+ char fn[256];
+ int res = 0;
+ int hour, pm=0;
+ tm = localtime(&t);
+ if (!tm) {
+ ast_log(LOG_WARNING, "Unable to derive local time\n");
+ return -1;
+ }
+ if (!res) {
+ snprintf(fn, sizeof(fn), "digits/day-%d", tm->tm_wday);
+ res = ast_streamfile(chan, fn, lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ }
+ if (!res) {
+ snprintf(fn, sizeof(fn), "digits/mon-%d", tm->tm_mon);
+ res = ast_streamfile(chan, fn, lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ }
+ if (!res)
+ res = ast_say_number(chan, tm->tm_mday, ints, lang);
+
+ hour = tm->tm_hour;
+ if (!hour)
+ hour = 12;
+ else if (hour == 12)
+ pm = 1;
+ else if (hour > 12) {
+ hour -= 12;
+ pm = 1;
+ }
+ if (!res)
+ res = ast_say_number(chan, hour, ints, lang);
+
+ if (tm->tm_min > 9) {
+ if (!res)
+ res = ast_say_number(chan, tm->tm_min, ints, lang);
+ } else if (tm->tm_min) {
+ if (!res)
+ res = ast_streamfile(chan, "digits/oh", lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ if (!res)
+ res = ast_say_number(chan, tm->tm_min, ints, lang);
+ } else {
+ if (!res)
+ res = ast_streamfile(chan, "digits/oclock", lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ }
+ if (pm) {
+ if (!res)
+ res = ast_streamfile(chan, "digits/p-m", lang);
+ } else {
+ if (!res)
+ res = ast_streamfile(chan, "digits/a-m", lang);
+ }
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ if (!res)
+ res = ast_say_number(chan, tm->tm_year + 1900, ints, lang);
+ return res;
+}
+
+int ast_say_datetime_from_now(struct ast_channel *chan, time_t t, char *ints, char *lang)
+{
+ int res=0;
+ time_t nowt;
+ int daydiff;
+ struct tm *tm;
+ struct tm tm2;
+ struct tm *now;
+ char fn[256];
+
+ time(&nowt);
+
+ tm = localtime(&t);
+ if (!tm) {
+ ast_log(LOG_WARNING, "Unable to derive local time\n");
+ return -1;
+ }
+ memcpy(&tm2, tm, sizeof(struct tm));
+ tm = &tm2;
+ now = localtime(&nowt);
+ daydiff = now->tm_yday - tm->tm_yday;
+ if ((daydiff < 0) || (daydiff > 6)) {
+ /* Day of month and month */
+ if (!res) {
+ snprintf(fn, sizeof(fn), "digits/mon-%d", tm->tm_mon);
+ res = ast_streamfile(chan, fn, lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ }
+ if (!res)
+ res = ast_say_number(chan, tm->tm_mday, ints, lang);
+
+ } else if (daydiff) {
+ /* Just what day of the week */
+ if (!res) {
+ snprintf(fn, sizeof(fn), "digits/day-%d", tm->tm_wday);
+ res = ast_streamfile(chan, fn, lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ }
+ } /* Otherwise, it was today */
+ if (!res)
+ res = ast_say_time(chan, t, ints, lang);
+ return res;
+}
+