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)
}
} 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;
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);
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;
}
{
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);
}
}
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");
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;
}
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 */
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;
}
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;
}
} 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;
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;
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;
}
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;
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);
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);
}
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:
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;
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;
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;
/* 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;
#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>
int option_highpriority=0;
int fully_booted = 0;
+char defaultlanguage[MAX_LANGUAGE] = DEFAULT_LANGUAGE;
+
#define HIGH_PRIORITY 1
#define HIGH_PRIORITY_SCHED SCHED_RR
#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"
; 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.
;
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.
;
;
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.
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);
extern int option_quiet;
extern int option_console;
extern int fully_booted;
+extern char defaultlanguage[];
#define VERBOSE_PREFIX_1 " "
#define VERBOSE_PREFIX_2 " == "
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)
}
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 */
#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);
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;
}