From 0c3b134da54abb0429201a3a9b37711cf78d8012 Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Sun, 9 Jan 2000 19:58:18 +0000
Subject: [PATCH] Version 0.1.3 from FTP

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@201 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/app_directory.c           | 14 ++++----
 apps/app_playback.c            | 16 +++++----
 apps/app_voicemail.c           | 48 ++++++++++++-------------
 asterisk.c                     |  3 ++
 asterisk.h                     |  2 ++
 configs/adtranvofr.conf.sample |  6 +++-
 configs/modem.conf.sample      |  4 +++
 configs/oss.conf.sample        |  4 +++
 include/asterisk/file.h        |  6 ++--
 include/asterisk/options.h     |  1 +
 include/asterisk/say.h         |  6 ++--
 include/asterisk/vmodem.h      |  1 +
 say.c                          | 66 ++++++++++++++++++----------------
 13 files changed, 103 insertions(+), 74 deletions(-)

diff --git a/apps/app_directory.c b/apps/app_directory.c
index 285f1514b3..be76d4b35b 100755
--- a/apps/app_directory.c
+++ b/apps/app_directory.c
@@ -156,17 +156,17 @@ static int do_directory(struct ast_channel *chan, struct ast_config *cfg, char *
 			if (v) {
 				/* We have a match -- play a greeting if they have it */
 				snprintf(fn, sizeof(fn), "%s/vm/%s/greet", AST_SPOOL_DIR, v->name);
-				if (ast_fileexists(fn, NULL)) {
-					res = ast_streamfile(chan, fn);
+				if (ast_fileexists(fn, NULL, chan->language)) {
+					res = ast_streamfile(chan, fn, chan->language);
 					if (!res)
 						res = ast_waitstream(chan, AST_DIGIT_ANY);
 					ast_stopstream(chan);
 				} else {
-					res = ast_say_digit_str(chan, v->name);
+					res = ast_say_digit_str(chan, v->name, chan->language);
 				}
 ahem:
 				if (!res)
-					res = ast_streamfile(chan, "dir-instr");
+					res = ast_streamfile(chan, "dir-instr", chan->language);
 				if (!res)
 					res = ast_waitstream(chan, AST_DIGIT_ANY);
 				if (!res)
@@ -189,9 +189,9 @@ ahem:
 				}
 			} else {
 				if (found) 
-					res = ast_streamfile(chan, "dir-nomore");
+					res = ast_streamfile(chan, "dir-nomore", chan->language);
 				else
-					res = ast_streamfile(chan, "dir-nomatch");
+					res = ast_streamfile(chan, "dir-nomatch", chan->language);
 				if (!res)
 					res = 1;
 				return res;
@@ -219,7 +219,7 @@ static int directory_exec(struct ast_channel *chan, void *data)
 	LOCAL_USER_ADD(u);
 top:
 	if (!res)
-		res = ast_streamfile(chan, "dir-intro");
+		res = ast_streamfile(chan, "dir-intro", chan->language);
 	if (!res)
 		res = ast_waitstream(chan, AST_DIGIT_ANY);
 	ast_stopstream(chan);
diff --git a/apps/app_playback.c b/apps/app_playback.c
index 31ee069492..be2dfe26e5 100755
--- a/apps/app_playback.c
+++ b/apps/app_playback.c
@@ -31,18 +31,22 @@ LOCAL_USER_DECL;
 
 static int playback_exec(struct ast_channel *chan, void *data)
 {
-	int res;
+	int res = 0;
 	struct localuser *u;
 	if (!data) {
 		ast_log(LOG_WARNING, "Playback requires an argument (filename)\n");
 		return -1;
 	}
 	LOCAL_USER_ADD(u);
-	ast_stopstream(chan);
-	res = ast_streamfile(chan, (char *)data);
-	if (!res)
-		res = ast_waitstream(chan, "");
-	ast_stopstream(chan);
+	if (chan->state != AST_STATE_UP)
+		res = ast_answer(chan);
+	if (!res) {
+		ast_stopstream(chan);
+		res = ast_streamfile(chan, (char *)data, chan->language);
+		if (!res)
+			res = ast_waitstream(chan, "");
+		ast_stopstream(chan);
+	}
 	LOCAL_USER_REMOVE(u);
 	return res;
 }
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 8fc6f500ff..939587ff77 100755
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -81,15 +81,15 @@ static int announce_message(struct ast_channel *chan, char *dir, int msgcnt)
 {
 	char *fn;
 	int res;
-	res = ast_streamfile(chan, "vm-message");
+	res = ast_streamfile(chan, "vm-message", chan->language);
 	if (!res) {
 		res = ast_waitstream(chan, AST_DIGIT_ANY);
 		if (!res) {
-			res = ast_say_number(chan, msgcnt+1);
+			res = ast_say_number(chan, msgcnt+1, chan->language);
 			if (!res) {
 				fn = get_fn(dir, msgcnt);
 				if (fn) {
-					res = ast_streamfile(chan, fn);
+					res = ast_streamfile(chan, fn, chan->language);
 					free(fn);
 				}
 			}
@@ -167,7 +167,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent)
 		if (mkdir(dir, 0700) && (errno != EEXIST))
 			ast_log(LOG_WARNING, "mkdir '%s' failed: %s\n", dir, strerror(errno));
 		/* Stream an info message */
-		if (silent || !ast_streamfile(chan, INTRO)) {
+		if (silent || !ast_streamfile(chan, INTRO, chan->language)) {
 			/* Wait for the message to finish */
 			if (silent || !ast_waitstream(chan, "")) {
 				fmt = ast_variable_retrieve(cfg, "general", "format");
@@ -182,7 +182,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent)
 						snprintf(comment, sizeof(comment), "Voicemail from %s to %s (%s) on %s\n",
 											(chan->callerid ? chan->callerid : "Unknown"), 
 											name, ext, chan->name);
-						if (ast_fileexists(fn, NULL) > 0) {
+						if (ast_fileexists(fn, NULL, chan->language) > 0) {
 							msgnum++;
 							continue;
 						}
@@ -268,7 +268,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent)
 						if (outmsg) {
 							if (outmsg > 1) {
 								/* Let them know it worked */
-								ast_streamfile(chan, "vm-msgsaved");
+								ast_streamfile(chan, "vm-msgsaved", chan->language);
 								ast_waitstream(chan, "");
 							}
 							/* Send e-mail if applicable */
@@ -323,7 +323,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 		ast_log(LOG_WARNING, "No voicemail configuration\n");
 		goto out;
 	}
-	if (ast_streamfile(chan, "vm-login")) {
+	if (ast_streamfile(chan, "vm-login", chan->language)) {
 		ast_log(LOG_WARNING, "Couldn't stream login file\n");
 		goto out;
 	}
@@ -339,7 +339,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 			res = 0;
 			goto out;
 		}
-		if (ast_streamfile(chan, "vm-password")) {
+		if (ast_streamfile(chan, "vm-password", chan->language)) {
 			ast_log(LOG_WARNING, "Unable to stream password file\n");
 			goto out;
 		}
@@ -359,7 +359,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 		} else if (option_verbose > 2)
 			ast_verbose( VERBOSE_PREFIX_3 "No such user '%s' in config file\n", username);
 		if (!valid) {
-			if (ast_streamfile(chan, "vm-incorrect"))
+			if (ast_streamfile(chan, "vm-incorrect", chan->language))
 				break;
 			if (ast_waitstream(chan, ""))
 				break;
@@ -375,13 +375,13 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 		   not deleted. */
 		do {
 			fn = get_fn(dir, maxmsg);
-			if ((res = ast_fileexists(fn, NULL))>0) {
+			if ((res = ast_fileexists(fn, NULL, chan->language))>0) {
 				maxmsg++;
 				deleted[maxmsg] = 0;
 			}
 			free(fn);
 		} while(res > 0);
-		if (ast_streamfile(chan, "vm-youhave"))
+		if (ast_streamfile(chan, "vm-youhave", chan->language))
 			goto out;
 		if ((d=ast_waitstream(chan, AST_DIGIT_ANY)) < 0)
 			goto out;
@@ -389,10 +389,10 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 		if (!d) {
 			/* If they haven't interrupted us, play the message count */
 			if (maxmsg > 0) {
-				if ((d = ast_say_number(chan, maxmsg)) < 0)
+				if ((d = ast_say_number(chan, maxmsg, chan->language)) < 0)
 					goto out;
 			} else {
-				if (ast_streamfile(chan, "vm-no"))
+				if (ast_streamfile(chan, "vm-no", chan->language))
 					goto out;
 				if ((d=ast_waitstream(chan, AST_DIGIT_ANY)) < 0)
 					goto out;
@@ -400,7 +400,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 			}
 			if (!d) {
 				/* And if they still haven't, give them the last word */
-				if (ast_streamfile(chan, ((maxmsg == 1) ? "vm-message" : "vm-messages")))
+				if (ast_streamfile(chan, ((maxmsg == 1) ? "vm-message" : "vm-messages"), chan->language))
 					goto out;
 				if (ast_waitstream(chan, AST_DIGIT_ANY) < 0)
 					goto out;
@@ -416,7 +416,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 		ast_log(LOG_EVENT, "User '%s' logged in on channel '%s' with %d message(s).\n", username, chan->name, maxmsg);
 		if (option_verbose > 2)
 			ast_verbose( VERBOSE_PREFIX_3 "User '%s' logged in on channel %s with %d messages\n", username, chan->name, maxmsg);
-		if (!ast_streamfile(chan, "vm-instructions")) {
+		if (!ast_streamfile(chan, "vm-instructions", chan->language)) {
 			for(;;) {
 				if (chan->stream || (chan->trans && chan->trans->stream)) {
 					d = ast_waitstream(chan, AST_DIGIT_ANY);
@@ -424,7 +424,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 					if (!d && (state == STATE_MESSAGE_PLAYING)) {
 						state  = STATE_MESSAGE;
 						/* If it runs out playing a message, then give directions */
-						if (!(d = ast_streamfile(chan, "vm-msginstruct")))
+						if (!(d = ast_streamfile(chan, "vm-msginstruct", chan->language)))
 							d = ast_waitstream(chan, AST_DIGIT_ANY);
 						ast_stopstream(chan);
 					}
@@ -440,12 +440,12 @@ restart:
 					   best based up on where they are.  Ditto if they press the '*' key. */
 					switch(state) {
 					case STATE_STARTING:
-						if (ast_streamfile(chan, "vm-instructions"))
+						if (ast_streamfile(chan, "vm-instructions", chan->language))
 							goto out;
 						break;
 					case STATE_MESSAGE:
 					case STATE_MESSAGE_PLAYING:
-						if (ast_streamfile(chan, "vm-msginstruct"))
+						if (ast_streamfile(chan, "vm-msginstruct", chan->language))
 							goto out;
 						break;
 					default:
@@ -460,14 +460,14 @@ restart:
 						if (curmsg < maxmsg) {
 							deleted[curmsg] = !deleted[curmsg];
 							if (deleted[curmsg]) {
-								if (ast_streamfile(chan, "vm-deleted"))
+								if (ast_streamfile(chan, "vm-deleted", chan->language))
 									goto out;
 							} else {
-								if (ast_streamfile(chan, "vm-undeleted"))
+								if (ast_streamfile(chan, "vm-undeleted", chan->language))
 									goto out;
 							}
 						} else {
-							if (ast_streamfile(chan, "vm-nomore"))
+							if (ast_streamfile(chan, "vm-nomore", chan->language))
 								goto out;
 						}
 						break;
@@ -480,7 +480,7 @@ restart:
 							else if (d < 0)
 								goto out;
 						} else {
-							if (ast_streamfile(chan, "vm-nomore"))
+							if (ast_streamfile(chan, "vm-nomore", chan->language))
 								goto out;
 						}
 						state = STATE_MESSAGE_PLAYING;
@@ -510,7 +510,7 @@ restart:
 							else if (d < 0)
 								goto out;
 						} else {
-							if (ast_streamfile(chan, "vm-nomore"))
+							if (ast_streamfile(chan, "vm-nomore", chan->language))
 								goto out;
 						}
 						state = STATE_MESSAGE_PLAYING;
@@ -518,7 +518,7 @@ restart:
 					/* XXX Message compose? It's easy!  Just read their # and, assuming it's in the config, 
 					       call the routine as if it were called from the PBX proper XXX */
 					case '#':
-						if (ast_streamfile(chan, "vm-goodbye"))
+						if (ast_streamfile(chan, "vm-goodbye", chan->language))
 							goto out;
 						if (ast_waitstream(chan, ""))
 							goto out;
diff --git a/asterisk.c b/asterisk.c
index bec0894aee..4addf889c9 100755
--- a/asterisk.c
+++ b/asterisk.c
@@ -16,6 +16,7 @@
 #include <asterisk/logger.h>
 #include <asterisk/options.h>
 #include <asterisk/cli.h>
+#include <asterisk/channel.h>
 #include <stdio.h>
 #include <signal.h>
 #include <sched.h>
@@ -32,6 +33,8 @@ int option_console=0;
 int option_highpriority=0;
 int fully_booted = 0;
 
+char defaultlanguage[MAX_LANGUAGE] = DEFAULT_LANGUAGE;
+
 #define HIGH_PRIORITY 1
 #define HIGH_PRIORITY_SCHED SCHED_RR
 
diff --git a/asterisk.h b/asterisk.h
index f1c9fccdaa..c5b3d7eb06 100755
--- a/asterisk.h
+++ b/asterisk.h
@@ -14,6 +14,8 @@
 #ifndef _ASTERISK_H
 #define _ASTERISK_H
 
+#define DEFAULT_LANGUAGE "en"
+
 #define AST_CONFIG_DIR "/etc/asterisk"
 #define AST_MODULE_DIR "/usr/lib/asterisk/modules"
 #define AST_SPOOL_DIR  "/var/spool/asterisk"
diff --git a/configs/adtranvofr.conf.sample b/configs/adtranvofr.conf.sample
index efd6af3f0b..d1589cca7d 100755
--- a/configs/adtranvofr.conf.sample
+++ b/configs/adtranvofr.conf.sample
@@ -2,9 +2,13 @@
 ; Voice over Frame Relay (Adtran style)
 ;
 ; Configuration file
-;
+
 [interfaces]
 ;
+; Default language
+;
+;language=en
+;
 ; Lines for which we are the user termination.  They accept incoming
 ; and outgoing calls.  We use the default context on the first 8 lines
 ; used by internal phones.
diff --git a/configs/modem.conf.sample b/configs/modem.conf.sample
index d5989b4779..7f6de5f345 100755
--- a/configs/modem.conf.sample
+++ b/configs/modem.conf.sample
@@ -13,6 +13,10 @@ context=remote
 ;
 driver=aopen
 ;
+; Default language
+;
+;language=en
+;
 ; We can optionally override the auto detection.  This is necessary
 ; particularly if asterisk does not know about our kind of modem.
 ;
diff --git a/configs/oss.conf.sample b/configs/oss.conf.sample
index 138a7376bd..e90d255404 100755
--- a/configs/oss.conf.sample
+++ b/configs/oss.conf.sample
@@ -16,6 +16,10 @@ autoanswer=yes
 ;
 extension=s
 ;
+; Default language
+;
+;language=en
+;
 ; Silence supression can be enabled when sound is over a certain threshold.
 ; The value for the threshold should probably be between 500 and 2000 or so,
 ; but your mileage may vary.  Use the echo test to evaluate the best setting.
diff --git a/include/asterisk/file.h b/include/asterisk/file.h
index fe0678f672..25e38e29f0 100755
--- a/include/asterisk/file.h
+++ b/include/asterisk/file.h
@@ -43,14 +43,14 @@ int ast_format_register(char *name, char *exts, int format,
 	
 int ast_format_unregister(char *name);
 
-/* Start streaming a file */
-int ast_streamfile(struct ast_channel *c, char *filename);
+/* Start streaming a file, in the preferred language if possible */
+int ast_streamfile(struct ast_channel *c, char *filename, char *preflang);
 
 /* Stop playback of a stream */
 int ast_stopstream(struct ast_channel *c);
 
 /* See if a given file exists in a given format.  If fmt is NULL,  any format is accepted.*/
-int ast_fileexists(char *filename, char *fmt);
+int ast_fileexists(char *filename, char *fmt, char *preflang);
 
 /* Rename a given file in a given format, or if fmt is NULL, then do so for all */
 int ast_filerename(char *oldname, char *newname, char *fmt);
diff --git a/include/asterisk/options.h b/include/asterisk/options.h
index bc7cdbf16e..9cd0b5ef90 100755
--- a/include/asterisk/options.h
+++ b/include/asterisk/options.h
@@ -24,6 +24,7 @@ extern int option_nofork;
 extern int option_quiet;
 extern int option_console;
 extern int fully_booted;
+extern char defaultlanguage[];
 
 #define VERBOSE_PREFIX_1 " "
 #define VERBOSE_PREFIX_2 "  == "
diff --git a/include/asterisk/say.h b/include/asterisk/say.h
index 2d78d2c7d0..cc54a060ae 100755
--- a/include/asterisk/say.h
+++ b/include/asterisk/say.h
@@ -21,9 +21,9 @@
 extern "C" {
 #endif
 
-int ast_say_number(struct ast_channel *chan, int num);
-int ast_say_digits(struct ast_channel *chan, int num);
-int ast_say_digit_str(struct ast_channel *chan, char *num);
+int ast_say_number(struct ast_channel *chan, int num, char *lang);
+int ast_say_digits(struct ast_channel *chan, int num, char *lang);
+int ast_say_digit_str(struct ast_channel *chan, char *num, char *lang);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }
diff --git a/include/asterisk/vmodem.h b/include/asterisk/vmodem.h
index a45fbdf71a..920bd417d0 100755
--- a/include/asterisk/vmodem.h
+++ b/include/asterisk/vmodem.h
@@ -79,6 +79,7 @@ struct ast_modem_pvt {
 	char context[AST_MAX_EXTENSION];
 	char cid[AST_MAX_EXTENSION];	/* Caller ID if available */
 	char initstr[AST_MAX_INIT_STR];	/* Modem initialization String */
+	char language[MAX_LANGUAGE];	/* default language */
 	char response[256];				/* Static response buffer */
 	struct ast_modem_driver *mc;	/* Modem Capability */
 	struct ast_modem_pvt *next;			/* Next channel in list */
diff --git a/say.c b/say.c
index 41b66925e4..fea77dd8cc 100755
--- a/say.c
+++ b/say.c
@@ -17,14 +17,14 @@
 #include <asterisk/say.h>
 #include <stdio.h>
 
-int ast_say_digit_str(struct ast_channel *chan, char *fn2)
+int ast_say_digit_str(struct ast_channel *chan, char *fn2, char *lang)
 {
 	char fn[256] = "";
 	int num = 0;
 	int res = 0;
 	while(fn2[num] && !res) {
 		snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
-		res = ast_streamfile(chan, fn);
+		res = ast_streamfile(chan, fn, lang);
 		if (!res) 
 			res = ast_waitstream(chan, AST_DIGIT_ANY);
 		ast_stopstream(chan);
@@ -33,45 +33,51 @@ int ast_say_digit_str(struct ast_channel *chan, char *fn2)
 	return res;
 }
 
-int ast_say_digits(struct ast_channel *chan, int num)
+int ast_say_digits(struct ast_channel *chan, int num, char *lang)
 {
 	char fn2[256];
 	snprintf(fn2, sizeof(fn2), "%d", num);
-	return ast_say_digit_str(chan, fn2);
+	return ast_say_digit_str(chan, fn2, lang);
 }
-int ast_say_number(struct ast_channel *chan, int num)
+int ast_say_number(struct ast_channel *chan, int num, char *language)
 {
 	int res = 0;
 	int playh = 0;
 	char fn[256] = "";
-	while(num && !res) {
-		if (playh) {
-			snprintf(fn, sizeof(fn), "digits/hundred");
-			playh = 0;
-		} else
-		if (num < 20) {
-			snprintf(fn, sizeof(fn), "digits/%d", num);
-			num = 0;
-		} else
-		if (num < 100) {
-			snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10);
-			num -= ((num / 10) * 10);
-		} else {
-			if (num < 1000){
-				snprintf(fn, sizeof(fn), "digits/%d", (num/100));
-				playh++;
+	if (0) {
+	/* XXX Only works for english XXX */
+	} else {
+		/* Use english numbers */
+		language = "en";
+		while(num && !res) {
+			if (playh) {
+				snprintf(fn, sizeof(fn), "digits/hundred");
+				playh = 0;
+			} else
+			if (num < 20) {
+				snprintf(fn, sizeof(fn), "digits/%d", num);
+				num = 0;
+			} else
+			if (num < 100) {
+				snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10);
+				num -= ((num / 10) * 10);
 			} else {
-				ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num);
-				res = -1;
+				if (num < 1000){
+					snprintf(fn, sizeof(fn), "digits/%d", (num/100));
+					playh++;
+				} else {
+					ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num);
+					res = -1;
+				}
 			}
+			if (!res) {
+				res = ast_streamfile(chan, fn, language);
+				if (!res) 
+					res = ast_waitstream(chan, AST_DIGIT_ANY);
+				ast_stopstream(chan);
+			}
+			
 		}
-		if (!res) {
-			res = ast_streamfile(chan, fn);
-			if (!res) 
-				res = ast_waitstream(chan, AST_DIGIT_ANY);
-			ast_stopstream(chan);
-		}
-		
 	}
 	return res;
 }
-- 
GitLab