mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	Merge italian "say" support (bug #2840)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4216 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		
							
								
								
									
										230
									
								
								say.c
									
									
									
									
									
								
							
							
						
						
									
										230
									
								
								say.c
									
									
									
									
									
								
							| @@ -442,6 +442,10 @@ int ast_say_digits_full(struct ast_channel *chan, int num, char *ints, char *lan | ||||
|  es-de | ||||
|  es-el | ||||
|  | ||||
|  Italian sound files needed for Time/Date functions: | ||||
|  ore-una | ||||
|  ore-mezzanotte | ||||
|  | ||||
| */ | ||||
|  | ||||
| /* Forward declarations of language specific variants of ast_say_number_full */ | ||||
| @@ -473,6 +477,7 @@ static int ast_say_date_with_format_nl(struct ast_channel *chan, time_t time, ch | ||||
| static int ast_say_date_with_format_pt(struct ast_channel *chan, time_t time, char *ints, char *lang, char *format, char *timezone); | ||||
| static int ast_say_date_with_format_tw(struct ast_channel *chan, time_t time, char *ints, char *lang, char *format, char *timezone); | ||||
| static int ast_say_date_with_format_fr(struct ast_channel *chan, time_t time, char *ints, char *lang, char *format, char *timezone); | ||||
| static int ast_say_date_with_format_it(struct ast_channel *chan, time_t time, char *ints, char *lang, char *format, char *timezone); | ||||
|  | ||||
| static int ast_say_time_en(struct ast_channel *chan, time_t t, char *ints, char *lang); | ||||
| static int ast_say_time_nl(struct ast_channel *chan, time_t t, char *ints, char *lang); | ||||
| @@ -2125,6 +2130,8 @@ int ast_say_date_with_format(struct ast_channel *chan, time_t time, char *ints, | ||||
| 		return(ast_say_date_with_format_de(chan, time, ints, lang, format, timezone)); | ||||
| 	} else if (!strcasecmp(lang, "es") || !strcasecmp(lang, "mx")) {	/* Spanish syntax */ | ||||
| 		return(ast_say_date_with_format_es(chan, time, ints, lang, format, timezone)); | ||||
| 	} else if (!strcasecmp(lang, "it") ) {  /* Italian syntax */ | ||||
| 		return(ast_say_date_with_format_it(chan, time, ints, lang, format, timezone)); | ||||
| 	} else if (!strcasecmp(lang, "nl") ) {	/* Dutch syntax */ | ||||
| 		return(ast_say_date_with_format_nl(chan, time, ints, lang, format, timezone)); | ||||
| 	} else if (!strcasecmp(lang, "pt") ) {	/* Portuguese syntax */ | ||||
| @@ -2880,6 +2887,229 @@ int ast_say_date_with_format_es(struct ast_channel *chan, time_t time, char *int | ||||
| 	return res; | ||||
| } | ||||
|  | ||||
| int ast_say_date_with_format_it(struct ast_channel *chan, time_t time, char *ints, char *lang, char *format, 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; | ||||
|                         case 'd': | ||||
|                         case 'e': | ||||
|                                 /* First day of the month is spelled as ordinal */ | ||||
|                                 if (tm.tm_mday == 1) { | ||||
|                                         snprintf(nextmsg,sizeof(nextmsg), "digits/h-%d", tm.tm_mday); | ||||
|                                         res = wait_file(chan,ints,nextmsg,lang); | ||||
|                                 } else { | ||||
|                                         if (!res) { | ||||
|                                                 res = ast_say_number(chan, tm.tm_mday, ints, lang, (char *) NULL); | ||||
|                                         } | ||||
|                                 } | ||||
|                                 break; | ||||
|                         case 'Y': | ||||
|                                 /* Year */ | ||||
|                                 if (tm.tm_year > 99) { | ||||
|                                         res = wait_file(chan,ints, "digits/ore-2000",lang); | ||||
|                                         if (tm.tm_year > 100) { | ||||
|                                                 if (!res) { | ||||
|                                                         /* This works until the end of 2021 */ | ||||
|                                                         snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_year - 100); | ||||
|                                                         res = wait_file(chan,ints,nextmsg,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/ore-1900",lang); | ||||
|                                                 if ((!res) && (tm.tm_year != 0)) { | ||||
|                                                         if (tm.tm_year <= 21) { | ||||
|                                                                 /* 1910 - 1921 */ | ||||
|                                                                 snprintf(nextmsg,sizeof(nextmsg), "digits/%d", tm.tm_year); | ||||
|                                                                 res = wait_file(chan,ints,nextmsg,lang); | ||||
|                                                         } else { | ||||
|                                                                 /* 1922 - 1999, but sounds badly in 1928, 1931, 1938, etc... */ | ||||
|                                                                 int ten, one; | ||||
|                                                                 ten = tm.tm_year / 10; | ||||
|                                                                 one = tm.tm_year % 10; | ||||
|                                                                 snprintf(nextmsg,sizeof(nextmsg), "digits/%d", ten * 10); | ||||
|                                                                 res = wait_file(chan,ints,nextmsg,lang); | ||||
|                                                                 if (!res) { | ||||
|                                                                         if (one != 0) { | ||||
|                                                                                 snprintf(nextmsg,sizeof(nextmsg), "digits/%d", one); | ||||
|                                                                                 res = wait_file(chan,ints,nextmsg,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); | ||||
|                                 break; | ||||
|                         case 'H': | ||||
|                         case 'k': | ||||
|                                 /* 24-Hour */ | ||||
|  | ||||
|                                 if (tm.tm_hour == 0) { | ||||
|                                         res = wait_file(chan,ints, "digits/ore-mezzanotte",lang); | ||||
|                                 } | ||||
|                                 else if (tm.tm_hour == 1) { | ||||
|                                         res = wait_file(chan,ints, "digits/ore-una",lang); | ||||
|                                 } | ||||
|                                 else { | ||||
|                                         res = ast_say_number(chan, tm.tm_hour, ints, lang, (char *) NULL); | ||||
|                                 } | ||||
|                                 break; | ||||
|                         case 'M': | ||||
|                                 /* Minute */ | ||||
|                                 res = ast_say_number(chan, tm.tm_min, ints, lang, (char *) NULL); | ||||
|                                 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': | ||||
|                                 /* 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 { | ||||
|                                                 res = ast_say_date_with_format(chan, time, ints, lang, "AdB", 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, "AdB", timezone); | ||||
|                                         } | ||||
|                                 } | ||||
|                                 break; | ||||
|                         case 'R': | ||||
|                                 res = ast_say_date_with_format(chan, time, ints, lang, "HM", timezone); | ||||
|                                 break; | ||||
|                         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) { | ||||
|                                         res = wait_file(chan,ints, "digits/oh",lang); | ||||
|                                         if (!res) { | ||||
|                                                 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; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* Dutch syntax */ | ||||
| int ast_say_date_with_format_nl(struct ast_channel *chan, time_t time, char *ints, char *lang, char *format, char *timezone) | ||||
| { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user