]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix expansion and encoding of sound file names on MS-Windows.
authorEli Zaretskii <eliz@gnu.org>
Sat, 13 Sep 2014 08:26:44 +0000 (11:26 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 13 Sep 2014 08:26:44 +0000 (11:26 +0300)
 src/sound.c (Fplay_sound_internal): Encode the sound file name in
 the ANSI codepage.  Expand it against data-directory, as per docs,
 not against the current directory.  No need to make a local copy
 of the file name; pass the encoded file name directly to
 do_play_sound.  (Bug#18463)
 src/w32.c (ansi_encode_filename): If w32_get_short_filename returns
 NULL, and the file name is not encodable in ANSI codepage, return
 the string with "?" replacement characters, which will fail the
 caller.  This avoids returning a random value in that case.

src/ChangeLog
src/sound.c
src/w32.c

index 0117b83feb137eef52692573a18c6610cf1c70a6..4f851edb0fd2999a63b6ae4c43d5c1a8bd0df44b 100644 (file)
@@ -1,3 +1,16 @@
+2014-09-13  Eli Zaretskii  <eliz@gnu.org>
+
+       * sound.c (Fplay_sound_internal): Encode the sound file name in
+       the ANSI codepage.  Expand it against data-directory, as per docs,
+       not against the current directory.  No need to make a local copy
+       of the file name; pass the encoded file name directly to
+       do_play_sound.  (Bug#18463)
+
+       * w32.c (ansi_encode_filename): If w32_get_short_filename returns
+       NULL, and the file name is not encodable in ANSI codepage, return
+       the string with "?" replacement characters, which will fail the
+       caller.  This avoids returning a random value in that case.
+
 2014-09-11  Martin Rudalics  <rudalics@gmx.at>
 
        * window.c (Fresize_mini_window_internal): Set w->total_lines
index a95678812e1a6ac12e7c06777e567bbc55652fd8..552f75b68e836428aa76ece0a76a502c96135131 100644 (file)
@@ -88,6 +88,9 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include <limits.h>
 #include <windows.h>
 #include <mmsystem.h>
+
+#include "coding.h"
+#include "w32.h"
 /* END: Windows Specific Includes */
 
 #endif /* WINDOWSNT */
@@ -1309,9 +1312,7 @@ Internal use only, use `play-sound' instead.  */)
   struct gcpro gcpro1, gcpro2;
   Lisp_Object args[2];
 #else /* WINDOWSNT */
-  int len = 0;
-  Lisp_Object lo_file = {0};
-  char * psz_file = NULL;
+  Lisp_Object lo_file;
   unsigned long ui_volume_tmp = UINT_MAX;
   unsigned long ui_volume = UINT_MAX;
 #endif /* WINDOWSNT */
@@ -1383,10 +1384,11 @@ Internal use only, use `play-sound' instead.  */)
 
 #else /* WINDOWSNT */
 
-  lo_file = Fexpand_file_name (attrs[SOUND_FILE], Qnil);
-  len = XSTRING (lo_file)->size;
-  psz_file = alloca (len + 1);
-  strcpy (psz_file, XSTRING (lo_file)->data);
+  lo_file = Fexpand_file_name (attrs[SOUND_FILE], Vdata_directory);
+  lo_file = ENCODE_FILE (lo_file);
+  /* Since UNICOWS.DLL includes only a stub for mciSendStringW, we
+     need to encode the file in the ANSI codepage.  */
+  lo_file = ansi_encode_filename (lo_file);
   if (INTEGERP (attrs[SOUND_VOLUME]))
     {
       ui_volume_tmp = XFASTINT (attrs[SOUND_VOLUME]);
@@ -1408,7 +1410,7 @@ Internal use only, use `play-sound' instead.  */)
     {
       ui_volume = ui_volume_tmp * (UINT_MAX / 100);
     }
-  do_play_sound (psz_file, ui_volume);
+  do_play_sound (SDATA (lo_file), ui_volume);
 
 #endif /* WINDOWSNT */
 
index 15e53600d95b9720e9633304693124f662d006af..fee1be227392b01bb7bded6a452969df6196d8ed 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -2387,6 +2387,8 @@ ansi_encode_filename (Lisp_Object filename)
          dostounix_filename (shortname);
          encoded_filename = build_string (shortname);
        }
+      else
+       encoded_filename = build_unibyte_string (fname);
     }
   else
     encoded_filename = build_unibyte_string (fname);