Newer
Older
ast_localtime(&now.tv_sec,&tmnow,timezone);
/* This might be slightly off, if we transcend a leap second, but never more off than 1 second */
/* In any case, it saves not having to do ast_mktime() */
beg_today = now.tv_sec - (tmnow.tm_hour * 3600) - (tmnow.tm_min * 60) - (tmnow.tm_sec);
if (beg_today < time) {
/* Today */
res = wait_file(chan,ints, "digits/today",lang);
} else if (beg_today - 86400 < time) {
/* Yesterday */
res = wait_file(chan,ints, "digits/yesterday",lang);
} else {
res = ast_say_date_with_format(chan, time, ints, lang, "Ad 'digits/pt-de' B 'digits/pt-de' Y", timezone);
}
}
break;
case 'q':
/* Shorthand for "" (today), "Yesterday", A (weekday), or ABdY */
{
struct timeval now;
struct tm tmnow;
time_t beg_today;
gettimeofday(&now,NULL);
ast_localtime(&now.tv_sec,&tmnow,timezone);
/* This might be slightly off, if we transcend a leap second, but never more off than 1 second */
/* In any case, it saves not having to do ast_mktime() */
beg_today = now.tv_sec - (tmnow.tm_hour * 3600) - (tmnow.tm_min * 60) - (tmnow.tm_sec);
if (beg_today < time) {
/* Today */
} else if ((beg_today - 86400) < time) {
/* Yesterday */
res = wait_file(chan,ints, "digits/yesterday",lang);
} else if (beg_today - 86400 * 6 < time) {
/* Within the last week */
res = ast_say_date_with_format(chan, time, ints, lang, "A", timezone);
} else {
res = ast_say_date_with_format(chan, time, ints, lang, "Ad 'digits/pt-de' B 'digits/pt-de' Y", timezone);
}
}
break;
case 'R':
res = ast_say_date_with_format(chan, time, ints, lang, "H 'digits/pt-e' M", timezone);
case 'S':
/* Seconds */
if (tm.tm_sec == 0) {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_sec);
res = wait_file(chan,ints,nextmsg,lang);
} else if (tm.tm_sec < 10) {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_sec);
res = wait_file(chan,ints,nextmsg,lang);
}
} else if ((tm.tm_sec < 21) || (tm.tm_sec % 10 == 0)) {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_sec);
res = wait_file(chan,ints,nextmsg,lang);
} else {
int ten, one;
ten = (tm.tm_sec / 10) * 10;
one = (tm.tm_sec % 10);
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", ten);
res = wait_file(chan,ints,nextmsg,lang);
if (!res) {
/* Fifty, not fifty-zero */
if (one != 0) {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", one);
res = wait_file(chan,ints,nextmsg,lang);
}
}
}
break;
case 'T':
res = ast_say_date_with_format(chan, time, ints, lang, "HMS", timezone);
break;
case ' ':
case ' ':
/* Just ignore spaces and tabs */
break;
default:
/* Unknown character */
ast_log(LOG_WARNING, "Unknown character in datetime format %s: %c at pos %d\n", format, format[offset], offset);
}
/* Jump out on DTMF */
if (res) {
break;
}
}
return res;
}
/* Taiwanese syntax */
Mark Spencer
committed
int ast_say_date_with_format_tw(struct ast_channel *chan, time_t time, const char *ints, const char *lang, const char *format, const char *timezone)
{
struct tm tm;
int res=0, offset, sndoffset;
char sndfile[256], nextmsg[256];
ast_localtime(&time,&tm,timezone);
for (offset=0 ; format[offset] != '\0' ; offset++) {
ast_log(LOG_DEBUG, "Parsing %c (offset %d) in %s\n", format[offset], offset, format);
switch (format[offset]) {
/* NOTE: if you add more options here, please try to be consistent with strftime(3) */
case '\'':
/* Literal name of a sound file */
sndoffset=0;
for (sndoffset=0 ; (format[++offset] != '\'') && (sndoffset < 256) ; sndoffset++)
sndfile[sndoffset] = format[offset];
sndfile[sndoffset] = '\0';
res = wait_file(chan,ints,sndfile,lang);
break;
case 'A':
case 'a':
/* Sunday - Saturday */
snprintf(nextmsg,sizeof(nextmsg), "digits/day-%d", tm.tm_wday);
res = wait_file(chan,ints,nextmsg,lang);
break;
case 'B':
case 'b':
case 'h':
/* January - December */
snprintf(nextmsg,sizeof(nextmsg), "digits/mon-%d", tm.tm_mon);
res = wait_file(chan,ints,nextmsg,lang);
break;
Mark Spencer
committed
case 'm':
/* First - Twelfth */
snprintf(nextmsg,sizeof(nextmsg), "digits/h-%d", tm.tm_mon +1);
res = wait_file(chan,ints,nextmsg,lang);
break;
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
case 'd':
case 'e':
/* First - Thirtyfirst */
if (!(tm.tm_mday % 10) || (tm.tm_mday < 10)) {
snprintf(nextmsg,sizeof(nextmsg), "digits/h-%d", tm.tm_mday);
res = wait_file(chan,ints,nextmsg,lang);
} else {
snprintf(nextmsg,sizeof(nextmsg), "digits/h-%dh", tm.tm_mday - (tm.tm_mday % 10));
res = wait_file(chan,ints,nextmsg,lang);
if(!res) {
snprintf(nextmsg,sizeof(nextmsg), "digits/h-%d", tm.tm_mday % 10);
res = wait_file(chan,ints,nextmsg,lang);
}
}
break;
case 'Y':
/* Year */
if (tm.tm_year > 99) {
res = wait_file(chan,ints, "digits/2",lang);
if (!res) {
res = wait_file(chan,ints, "digits/thousand",lang);
}
if (tm.tm_year > 100) {
if (!res) {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", (tm.tm_year - 100) / 10);
res = wait_file(chan,ints,nextmsg,lang);
if (!res) {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", (tm.tm_year - 100) % 10);
res = wait_file(chan,ints,nextmsg,lang);
}
}
}
if (!res) {
res = wait_file(chan,ints, "digits/year",lang);
}
} else {
if (tm.tm_year < 1) {
/* I'm not going to handle 1900 and prior */
/* We'll just be silent on the year, instead of bombing out. */
} else {
res = wait_file(chan,ints, "digits/1",lang);
if (!res) {
res = wait_file(chan,ints, "digits/9",lang);
}
if (!res) {
if (tm.tm_year <= 9) {
/* 1901 - 1909 */
res = wait_file(chan,ints, "digits/0",lang);
if (!res) {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_year);
res = wait_file(chan,ints,nextmsg,lang);
}
} else {
/* 1910 - 1999 */
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_year / 10);
res = wait_file(chan,ints,nextmsg,lang);
if (!res) {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_year % 10);
res = wait_file(chan,ints,nextmsg,lang);
}
}
}
}
if (!res) {
res = wait_file(chan,ints, "digits/year",lang);
}
}
break;
case 'I':
case 'l':
/* 12-Hour */
if (tm.tm_hour == 0)
snprintf(nextmsg,sizeof(nextmsg), "digits/12");
else if (tm.tm_hour > 12)
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_hour - 12);
else
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_hour);
res = wait_file(chan,ints,nextmsg,lang);
if (!res) {
res = wait_file(chan,ints, "digits/oclock",lang);
}
break;
case 'H':
case 'k':
/* 24-Hour */
if (!(tm.tm_hour % 10) || tm.tm_hour < 10) {
if (tm.tm_hour < 10) {
res = wait_file(chan, ints, "digits/0", lang);
}
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_hour);
res = wait_file(chan,ints,nextmsg,lang);
} else {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_hour - (tm.tm_hour % 10));
res = wait_file(chan,ints,nextmsg,lang);
if (!res) {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_hour % 10);
res = wait_file(chan,ints,nextmsg,lang);
}
}
if (!res) {
res = wait_file(chan,ints, "digits/oclock",lang);
}
break;
case 'M':
/* Minute */
if (!(tm.tm_min % 10) || tm.tm_min < 10) {
if (tm.tm_min < 10) {
res = wait_file(chan, ints, "digits/0", lang);
}
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_min);
res = wait_file(chan,ints,nextmsg,lang);
} else {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_min - (tm.tm_min % 10));
Mark Spencer
committed
res = wait_file(chan,ints,nextmsg,lang);
if (!res) {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_min % 10);
res = wait_file(chan,ints,nextmsg,lang);
Mark Spencer
committed
if (!res) {
res = wait_file(chan,ints, "digits/minute",lang);
}
break;
case 'P':
case 'p':
/* AM/PM */
if (tm.tm_hour > 11)
snprintf(nextmsg,sizeof(nextmsg), "digits/p-m");
else
snprintf(nextmsg,sizeof(nextmsg), "digits/a-m");
res = wait_file(chan,ints,nextmsg,lang);
break;
case 'Q':
Mark Spencer
committed
/* Shorthand for "Today", "Yesterday", or ABdY */
{
struct timeval now;
struct tm tmnow;
time_t beg_today;
gettimeofday(&now,NULL);
ast_localtime(&now.tv_sec,&tmnow,timezone);
/* This might be slightly off, if we transcend a leap second, but never more off than 1 second */
/* In any case, it saves not having to do ast_mktime() */
beg_today = now.tv_sec - (tmnow.tm_hour * 3600) - (tmnow.tm_min * 60) - (tmnow.tm_sec);
if (beg_today < time) {
/* Today */
res = wait_file(chan,ints, "digits/today",lang);
} else if (beg_today - 86400 < time) {
/* Yesterday */
res = wait_file(chan,ints, "digits/yesterday",lang);
} else {
Mark Spencer
committed
res = ast_say_date_with_format(chan, time, ints, lang, "YBdA", timezone);
Mark Spencer
committed
/* Shorthand for "" (today), "Yesterday", A (weekday), or ABdY */
{
struct timeval now;
struct tm tmnow;
time_t beg_today;
gettimeofday(&now,NULL);
ast_localtime(&now.tv_sec,&tmnow,timezone);
/* This might be slightly off, if we transcend a leap second, but never more off than 1 second */
/* In any case, it saves not having to do ast_mktime() */
beg_today = now.tv_sec - (tmnow.tm_hour * 3600) - (tmnow.tm_min * 60) - (tmnow.tm_sec);
if (beg_today < time) {
/* Today */
} else if ((beg_today - 86400) < time) {
/* Yesterday */
res = wait_file(chan,ints, "digits/yesterday",lang);
} else if (beg_today - 86400 * 6 < time) {
/* Within the last week */
res = ast_say_date_with_format(chan, time, ints, lang, "A", timezone);
} else {
Mark Spencer
committed
res = ast_say_date_with_format(chan, time, ints, lang, "YBdA", timezone);
}
}
break;
case 'R':
res = ast_say_date_with_format(chan, time, ints, lang, "HM", timezone);
break;
case 'S':
/* Seconds */
Mark Spencer
committed
if (!(tm.tm_sec % 10) || tm.tm_sec < 10) {
if (tm.tm_sec < 10) {
res = wait_file(chan, ints, "digits/0", lang);
}
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_sec);
res = wait_file(chan,ints,nextmsg,lang);
} else {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_sec - (tm.tm_sec % 10));
res = wait_file(chan,ints,nextmsg,lang);
if (!res) {
snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_sec % 10);
res = wait_file(chan,ints,nextmsg,lang);
}
}
if (!res) {
res = wait_file(chan,ints, "digits/second",lang);
}
break;
case 'T':
res = ast_say_date_with_format(chan, time, ints, lang, "HMS", timezone);
break;
case ' ':
case ' ':
/* Just ignore spaces and tabs */
Mark Spencer
committed
break;
default:
/* Unknown character */
ast_log(LOG_WARNING, "Unknown character in datetime format %s: %c at pos %d\n", format, format[offset], offset);
}
/* Jump out on DTMF */
if (res) {
break;
}
}
return res;
}
Mark Spencer
committed
int ast_say_time(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
if (!strcasecmp(lang, "en") ) { /* English syntax */
return(ast_say_time_en(chan, t, ints, lang));
Mark Spencer
committed
} else if (!strcasecmp(lang, "de") ) { /* German syntax */
return(ast_say_time_de(chan, t, ints, lang));
} else if (!strcasecmp(lang, "fr") ) { /* French syntax */
return(ast_say_time_fr(chan, t, ints, lang));
} else if (!strcasecmp(lang, "nl") ) { /* Dutch syntax */
return(ast_say_time_nl(chan, t, ints, lang));
} else if (!strcasecmp(lang, "pt") ) { /* Portuguese syntax */
return(ast_say_time_pt(chan, t, ints, lang));
} else if (!strcasecmp(lang, "tw") ) { /* Taiwanese syntax */
return(ast_say_time_tw(chan, t, ints, lang));
} else if (!strcasecmp(lang, "gr") ) { /* Greek syntax */
return(ast_say_time_gr(chan, t, ints, lang));
}
/* Default to English */
return(ast_say_time_en(chan, t, ints, lang));
}
/* English syntax */
Mark Spencer
committed
int ast_say_time_en(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
localtime_r(&t,&tm);
hour = tm.tm_hour;
if (!hour)
hour = 12;
else if (hour == 12)
pm = 1;
else if (hour > 12) {
hour -= 12;
pm = 1;
}
if (!res)
Mark Spencer
committed
res = ast_say_number(chan, hour, ints, lang, (char *) NULL);
Mark Spencer
committed
res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL);
res = ast_streamfile(chan, "digits/oh", lang);
if (!res)
res = ast_waitstream(chan, ints);
if (!res)
Mark Spencer
committed
res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL);
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;
}
Mark Spencer
committed
/* German syntax */
int ast_say_time_de(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
struct tm tm;
int res = 0;
localtime_r(&t,&tm);
if (!res)
Mark Spencer
committed
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
res = ast_say_number(chan, tm.tm_hour, ints, lang, "n");
if (!res)
res = ast_streamfile(chan, "digits/oclock", lang);
if (!res)
res = ast_waitstream(chan, ints);
if (!res)
if (tm.tm_min > 0)
res = ast_say_number(chan, tm.tm_min, ints, lang, "f");
return res;
}
/* French syntax */
int ast_say_time_fr(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
struct tm tm;
int res = 0;
localtime_r(&t,&tm);
res = ast_say_number(chan, tm.tm_hour, ints, lang, "f");
if (!res)
res = ast_streamfile(chan, "digits/oclock", lang);
if (tm.tm_min) {
if (!res)
res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL);
}
return res;
}
Mark Spencer
committed
/* Dutch syntax */
int ast_say_time_nl(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
struct tm tm;
int res = 0;
localtime_r(&t,&tm);
if (!res)
res = ast_say_number(chan, tm.tm_hour, ints, lang, (char *) NULL);
if (!res)
res = ast_streamfile(chan, "digits/nl-uur", lang);
if (!res)
res = ast_waitstream(chan, ints);
if (!res)
if (tm.tm_min > 0)
res = ast_say_number(chan, tm.tm_min, ints, lang, NULL);
return res;
}
/* Portuguese syntax */
Mark Spencer
committed
int ast_say_time_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
{
struct tm tm;
int res = 0;
int hour;
localtime_r(&t,&tm);
hour = tm.tm_hour;
if (!res)
res = ast_say_number(chan, hour, ints, lang, "f");
if (tm.tm_min) {
if (!res)
res = wait_file(chan, ints, "digits/pt-e", lang);
if (!res)
res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL);
} else {
if (!res)
res = wait_file(chan, ints, "digits/pt-hora", lang);
if (tm.tm_hour != 1)
if (!res)
res = wait_file(chan, ints, "digits/pt-sss", lang);
}
if (!res)
res = ast_say_number(chan, hour, ints, lang, (char *) NULL);
return res;
}
/* Taiwanese syntax */
Mark Spencer
committed
int ast_say_time_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
{
struct tm tm;
int res = 0;
int hour, pm=0;
localtime_r(&t,&tm);
hour = tm.tm_hour;
if (!hour)
hour = 12;
else if (hour == 12)
pm = 1;
else if (hour > 12) {
hour -= 12;
pm = 1;
}
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, hour, ints, lang, (char *) NULL);
if (!res)
res = ast_streamfile(chan, "digits/oclock", lang);
if (!res)
res = ast_waitstream(chan, ints);
if (!res)
res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL);
if (!res)
res = ast_streamfile(chan, "digits/minute", lang);
if (!res)
res = ast_waitstream(chan, ints);
return res;
}
Mark Spencer
committed
int ast_say_datetime(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
if (!strcasecmp(lang, "en") ) { /* English syntax */
return(ast_say_datetime_en(chan, t, ints, lang));
Mark Spencer
committed
} else if (!strcasecmp(lang, "de") ) { /* German syntax */
return(ast_say_datetime_de(chan, t, ints, lang));
} else if (!strcasecmp(lang, "fr") ) { /* French syntax */
return(ast_say_datetime_fr(chan, t, ints, lang));
} else if (!strcasecmp(lang, "nl") ) { /* Dutch syntax */
return(ast_say_datetime_nl(chan, t, ints, lang));
} else if (!strcasecmp(lang, "pt") ) { /* Portuguese syntax */
return(ast_say_datetime_pt(chan, t, ints, lang));
} else if (!strcasecmp(lang, "tw") ) { /* Taiwanese syntax */
return(ast_say_datetime_tw(chan, t, ints, lang));
} else if (!strcasecmp(lang, "gr") ) { /* Greek syntax */
return(ast_say_datetime_gr(chan, t, ints, lang));
}
/* Default to English */
return(ast_say_datetime_en(chan, t, ints, lang));
}
/* English syntax */
Mark Spencer
committed
int ast_say_datetime_en(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
{
struct tm tm;
char fn[256];
int res = 0;
int hour, pm=0;
localtime_r(&t,&tm);
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, (char *) NULL);
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, (char *) NULL);
if (tm.tm_min > 9) {
if (!res)
res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL);
} 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, (char *) NULL);
} 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, (char *) NULL);
return res;
}
Mark Spencer
committed
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
/* German syntax */
int ast_say_datetime_de(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
struct tm tm;
int res = 0;
localtime_r(&t,&tm);
res = ast_say_date(chan, t, ints, lang);
if (!res)
ast_say_time(chan, t, ints, lang);
return res;
}
/* French syntax */
int ast_say_datetime_fr(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
struct tm tm;
char fn[256];
int res = 0;
localtime_r(&t,&tm);
if (!res)
res = ast_say_number(chan, tm.tm_mday, ints, lang, (char *) NULL);
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_hour, ints, lang, "f");
if (!res)
res = ast_streamfile(chan, "digits/oclock", lang);
if (tm.tm_min > 0) {
if (!res)
res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL);
}
if (!res)
res = ast_waitstream(chan, ints);
if (!res)
res = ast_say_number(chan, tm.tm_year + 1900, ints, lang, (char *) NULL);
return res;
}
/* Dutch syntax */
Mark Spencer
committed
int ast_say_datetime_nl(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
struct tm tm;
int res = 0;
localtime_r(&t,&tm);
res = ast_say_date(chan, t, ints, lang);
if (!res) {
res = ast_streamfile(chan, "digits/nl-om", lang);
if (!res)
res = ast_waitstream(chan, ints);
}
if (!res)
ast_say_time(chan, t, ints, lang);
return res;
}
/* Portuguese syntax */
Mark Spencer
committed
int ast_say_datetime_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
char fn[256];
int res = 0;
int hour, pm=0;
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)
Mark Spencer
committed
res = ast_say_number(chan, tm.tm_mday, ints, lang, (char *) NULL);
if (!hour)
hour = 12;
else if (hour == 12)
pm = 1;
else if (hour > 12) {
hour -= 12;
pm = 1;
}
if (!res)
Mark Spencer
committed
res = ast_say_number(chan, hour, ints, lang, (char *) NULL);
Mark Spencer
committed
res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL);
if (!res)
res = ast_streamfile(chan, "digits/oh", lang);
if (!res)
res = ast_waitstream(chan, ints);
if (!res)
Mark Spencer
committed
res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL);
} 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)
Mark Spencer
committed
res = ast_say_number(chan, tm.tm_year + 1900, ints, lang, (char *) NULL);
/* Taiwanese syntax */
Mark Spencer
committed
int ast_say_datetime_tw(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
{
struct tm tm;
char fn[256];
int res = 0;
int hour, pm=0;
localtime_r(&t,&tm);
if (!res)
res = ast_say_number(chan, tm.tm_year + 1900, ints, lang, (char *) NULL);
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, (char *) NULL);
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);
}
hour = tm.tm_hour;
if (!hour)
hour = 12;
else if (hour == 12)
pm = 1;
else if (hour > 12) {
hour -= 12;
pm = 1;
}
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, hour, ints, lang, (char *) NULL);
if (!res)
res = ast_streamfile(chan, "digits/oclock", lang);
if (!res)
res = ast_waitstream(chan, ints);
if (!res)
res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL);
if (!res)
res = ast_streamfile(chan, "digits/minute", lang);
if (!res)
res = ast_waitstream(chan, ints);
return res;
}
Mark Spencer
committed
int ast_say_datetime_from_now(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
if (!strcasecmp(lang, "en") ) { /* English syntax */
return(ast_say_datetime_from_now_en(chan, t, ints, lang));
} else if (!strcasecmp(lang, "fr") ) { /* French syntax */
return(ast_say_datetime_from_now_fr(chan, t, ints, lang));
Mark Spencer
committed
} else if (!strcasecmp(lang, "pt") ) { /* Portuguese syntax */
return(ast_say_datetime_from_now_pt(chan, t, ints, lang));
}
/* Default to English */
return(ast_say_datetime_from_now_en(chan, t, ints, lang));
}
/* English syntax */
Mark Spencer
committed
int ast_say_datetime_from_now_en(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
int res=0;
time_t nowt;
int daydiff;
struct tm tm;
struct tm now;
localtime_r(&t,&tm);
localtime_r(&nowt,&now);
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)
Mark Spencer
committed
res = ast_say_number(chan, tm.tm_mday, ints, lang, (char *) NULL);
} 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;
}
Mark Spencer
committed
/* French syntax */
int ast_say_datetime_from_now_fr(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
int res=0;
time_t nowt;
int daydiff;
struct tm tm;
struct tm now;
char fn[256];
time(&nowt);
localtime_r(&t,&tm);
localtime_r(&nowt,&now);
daydiff = now.tm_yday - tm.tm_yday;
if ((daydiff < 0) || (daydiff > 6)) {
/* Day of month and month */
Mark Spencer
committed
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, (char *) NULL);
Mark Spencer
committed
} else if (daydiff) {
/* Just what day of the week */
Mark Spencer
committed
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;
}
Mark Spencer
committed
/* Portuguese syntax */
int ast_say_datetime_from_now_pt(struct ast_channel *chan, time_t t, const char *ints, const char *lang)
{
int res=0;
time_t nowt;
int daydiff;
struct tm tm;
struct tm now;
char fn[256];
time(&nowt);
localtime_r(&t,&tm);
localtime_r(&nowt,&now);
daydiff = now.tm_yday - tm.tm_yday;
if ((daydiff < 0) || (daydiff > 6)) {
/* Day of month and month */
if (!res)
res = ast_say_number(chan, tm.tm_mday, ints, lang, (char *) NULL);
Mark Spencer
committed
if (!res)
res = wait_file(chan, ints, "digits/pt-de", lang);
snprintf(fn, sizeof(fn), "digits/mon-%d", tm.tm_mon);
if (!res)
res = wait_file(chan, ints, fn, lang);
} else if (daydiff) {
/* Just what day of the week */
Mark Spencer
committed
snprintf(fn, sizeof(fn), "digits/day-%d", tm.tm_wday);
if (!res)
res = wait_file(chan, ints, fn, lang);
} /* Otherwise, it was today */
snprintf(fn, sizeof(fn), "digits/pt-ah");
if (!res)
res = wait_file(chan, ints, fn, lang);
if (tm.tm_hour != 1)
if (!res)
res = wait_file(chan, ints, "digits/pt-sss", lang);
if (!res)
res = ast_say_time(chan, t, ints, lang);
return res;
}
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
/*********************************** GREEK SUPPORT ***************************************/
/*
* digits/female-[1..4] : "Mia, dyo , treis, tessereis"
*/
static int gr_say_number_female(int num, struct ast_channel *chan, const char *ints, const char *lang){
int tmp;
int left;
int res;
char fn[256] = "";
//ast_log(LOG_DEBUG, "\n\n Saying number female %s %d \n\n",lang, num);
if (num < 5) {
snprintf(fn, sizeof(fn), "digits/female-%d", num);
res = wait_file(chan, ints, fn, lang);
} else if (num < 13) {
res = ast_say_number(chan, num, ints, lang, (char *) NULL);
} else if (num <100 ) {
tmp = (num/10) * 10;
left = num - tmp;
snprintf(fn, sizeof(fn), "digits/%d", tmp);
res = ast_streamfile(chan, fn, lang);
if (!res)
res = ast_waitstream(chan, ints);
if (left)
gr_say_number_female(left, chan, ints, lang);
} else {
return -1;
}
return res;
}
/*
* A list of the files that you need to create
-> digits/xilia = "xilia"
-> digits/myrio = "ekatomyrio"
-> digits/thousands = "xiliades"
-> digits/millions = "ektatomyria"
-> digits/[1..12] :: A pronunciation of th digits form 1 to 12 e.g. "tria"