Version 0.1.3 from FTP
[asterisk/asterisk.git] / file.c
diff --git a/file.c b/file.c
index 9ee50c5..89ba698 100755 (executable)
--- a/file.c
+++ b/file.c
@@ -3,7 +3,7 @@
  *
  * Generic File Format Support.
  * 
- * Copyright (C) 1999, Adtran Inc. and Linux Support Services, LLC
+ * Copyright (C) 1999, Mark Spencer
  *
  * Mark Spencer <markster@linux-support.net>
  *
@@ -168,14 +168,18 @@ int ast_writestream(struct ast_filestream *fs, struct ast_frame *f)
 {
        struct ast_frame_chain *fc, *f2;
        int res = -1;
-       int count=0;
        if (f->frametype != AST_FRAME_VOICE) {
                ast_log(LOG_WARNING, "Tried to write non-voice frame\n");
                return -1;
        }
-       if ((fs->fmt->format & f->subclass) == f->subclass)
-               return fs->fmt->write(fs, f);
-       else {
+       if ((fs->fmt->format & f->subclass) == f->subclass) {
+               res =  fs->fmt->write(fs, f);
+               if (res < 0) 
+                       ast_log(LOG_WARNING, "Natural write failed\n");
+               if (res > 0)
+                       ast_log(LOG_WARNING, "Huh??\n");
+               return res;
+       } else {
                /* XXX If they try to send us a type of frame that isn't the normal frame, and isn't
                       the one we've setup a translator for, we do the "wrong thing" XXX */
                if (!fs->trans) 
@@ -183,19 +187,17 @@ int ast_writestream(struct ast_filestream *fs, struct ast_frame *f)
                if (!fs->trans)
                        ast_log(LOG_WARNING, "Unable to translate to format %s, source format %d\n", fs->fmt->name, f->subclass);
                else {
+                       res = 0;
                        /* Build a chain of translated frames */
                        fc = ast_translate(fs->trans, f);
                        f2 = fc;
                        while(f2) {
                                res = fs->fmt->write(fs, f2->fr);
                                if (res) {
-                                       ast_log(LOG_WARNING, "Frame write failed\n");
+                                       ast_log(LOG_WARNING, "Translated frame write failed\n");
                                        break;
                                }
                                f2 = f2->next;
-                               count++;
-                               if (count > 1) 
-                                       ast_log(LOG_DEBUG, "Count is %d\n", count);
                        }
                        if (fc)
                                ast_frchain(fc);
@@ -322,9 +324,27 @@ static int ast_filehelper(char *filename, char *filename2, char *fmt, int action
        return res;
 }
 
-int ast_fileexists(char *filename, char *fmt)
+int ast_fileexists(char *filename, char *fmt, char *preflang)
 {
-       return ast_filehelper(filename, NULL, fmt, ACTION_EXISTS);
+       char filename2[256];
+       char lang2[MAX_LANGUAGE];
+       int res = -1;
+       if (preflang && strlen(preflang)) {
+               snprintf(filename2, sizeof(filename2), "%s-%s", filename, preflang);
+               res = ast_filehelper(filename2, NULL, fmt, ACTION_EXISTS);
+               if (res < 1) {
+                       strncpy(lang2, preflang, sizeof(lang2));
+                       strtok(lang2, "_");
+                       if (strcmp(lang2, preflang)) {
+                               snprintf(filename2, sizeof(filename2), "%s-%s", filename, lang2);
+                               res = ast_filehelper(filename2, NULL, fmt, ACTION_EXISTS);
+                       }
+               }
+       }
+       if (res < 1) {
+               res = ast_filehelper(filename, NULL, fmt, ACTION_EXISTS);
+       }
+       return res;
 }
 
 int ast_filedelete(char *filename, char *fmt)
@@ -337,7 +357,7 @@ int ast_filerename(char *filename, char *filename2, char *fmt)
        return ast_filehelper(filename, filename2, fmt, ACTION_RENAME);
 }
 
-int ast_streamfile(struct ast_channel *chan, char *filename)
+int ast_streamfile(struct ast_channel *chan, char *filename, char *preflang)
 {
        /* This is a fairly complex routine.  Essentially we should do 
           the following:
@@ -345,18 +365,31 @@ int ast_streamfile(struct ast_channel *chan, char *filename)
           1) Find which file handlers produce our type of format.
           2) Look for a filename which it can handle.
           3) If we find one, then great.  
-          *4) If not, see what files are there
-          *5) See what we can actually support
-          *6) Choose the one with the least costly translator path and
+          4) If not, see what files are there
+          5) See what we can actually support
+          6) Choose the one with the least costly translator path and
               set it up.
                   
-               XXX * = unimplemented XXX
        */
        int fd = -1;
        struct ast_channel *trans;
-       int fmts;
+       int fmts = -1;
+       char filename2[256];
+       char lang2[MAX_LANGUAGE];
        ast_stopstream(chan);
-       fmts = ast_fileexists(filename, NULL);
+       if (preflang && strlen(preflang)) {
+               snprintf(filename2, sizeof(filename2), "%s-%s", filename, preflang);
+               fmts = ast_fileexists(filename2, NULL, NULL);
+               if (fmts < 1) {
+                       strncpy(lang2, preflang, sizeof(lang2));
+                       snprintf(filename2, sizeof(filename2), "%s-%s", filename, lang2);
+                       fmts = ast_fileexists(filename2, NULL, NULL);
+               }
+       }
+       if (fmts < 1) {
+               strncpy(filename2, filename, sizeof(filename2));
+               fmts = ast_fileexists(filename2, NULL, NULL);
+       }
        if (fmts < 1) {
                ast_log(LOG_WARNING, "File %s does not exist in any format\n", filename);
                return -1;
@@ -378,10 +411,11 @@ int ast_streamfile(struct ast_channel *chan, char *filename)
                        return -1;
                }
        }
-       fd = ast_filehelper(filename, (char *)trans, NULL, ACTION_OPEN);
+       fd = ast_filehelper(filename2, (char *)trans, NULL, ACTION_OPEN);
        if (fd >= 0) {
-#if 0
-               ast_verbose(VERBOSE_PREFIX_3 "Playing '%s'\n", filename);
+#if 1
+               if (option_verbose > 2)
+                       ast_verbose(VERBOSE_PREFIX_3 "Playing '%s'\n", filename2);
 #endif
                return 0;
        }