From 25d053cbf288fb966526c554bea6158ef5c38202 Mon Sep 17 00:00:00 2001 From: Denis Krjuchkov Date: Sun, 3 Jun 2012 13:00:11 +0600 Subject: Work around incorrect g_file_test() behavior on Win32 g_file_test is redefined to be g_file_test_utf8 and thus can't handle non-ASCII characters. This fix adds simple wrapper (taken from glib) that fixes encoding and calls g_file_test_utf8. All required inclusions of glib_compat.h are added as well. --- NEWS | 1 + src/cmdline.c | 1 + src/decoder/wildmidi_decoder_plugin.c | 1 + src/glib_compat.h | 28 ++++++++++++++++++++++++++++ src/playlist_save.c | 1 + src/update_walk.c | 1 + 6 files changed, 33 insertions(+) diff --git a/NEWS b/NEWS index 00972bab4..091548700 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ ver 0.16.9 (2012/??/??) * decoder: - ffmpeg: support WebM +* WIN32: fix renaming of stored playlists with non-ASCII names ver 0.16.8 (2012/04/04) diff --git a/src/cmdline.c b/src/cmdline.c index d986c8eb8..b1482c350 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -27,6 +27,7 @@ #include "output_list.h" #include "ls.h" #include "mpd_error.h" +#include "glib_compat.h" #ifdef ENABLE_ENCODER #include "encoder_list.h" diff --git a/src/decoder/wildmidi_decoder_plugin.c b/src/decoder/wildmidi_decoder_plugin.c index 66e6c61cf..5eb0638da 100644 --- a/src/decoder/wildmidi_decoder_plugin.c +++ b/src/decoder/wildmidi_decoder_plugin.c @@ -19,6 +19,7 @@ #include "config.h" #include "decoder_api.h" +#include "glib_compat.h" #include diff --git a/src/glib_compat.h b/src/glib_compat.h index 4d0e7040d..0b96a662d 100644 --- a/src/glib_compat.h +++ b/src/glib_compat.h @@ -74,4 +74,32 @@ g_uri_parse_scheme(const char *uri) #endif +#if defined(G_OS_WIN32) && defined(g_file_test) + +/* Modern GLib on Win32 likes to use UTF-8 for file names. +It redefines g_file_test() to be g_file_test_utf8(). +This gives incorrect results for non-ASCII files. +Old g_file_test() is available for *binary compatibility*, +but symbol is hidden from linker, we copy-paste its definition here */ + +#undef g_file_test + +static inline gboolean +g_file_test(const gchar *filename, GFileTest test) +{ + gchar *utf8_filename = g_locale_to_utf8(filename, -1, NULL, NULL, NULL); + gboolean retval; + + if (utf8_filename == NULL) + return FALSE; + + retval = g_file_test_utf8(utf8_filename, test); + + g_free(utf8_filename); + + return retval; +} + +#endif + #endif diff --git a/src/playlist_save.c b/src/playlist_save.c index 8ddc93ec9..d290d889c 100644 --- a/src/playlist_save.c +++ b/src/playlist_save.c @@ -26,6 +26,7 @@ #include "uri.h" #include "database.h" #include "idle.h" +#include "glib_compat.h" #include diff --git a/src/update_walk.c b/src/update_walk.c index 5d2f778ff..b93c9c453 100644 --- a/src/update_walk.c +++ b/src/update_walk.c @@ -29,6 +29,7 @@ #include "decoder_list.h" #include "decoder_plugin.h" #include "playlist_list.h" +#include "glib_compat.h" #include "conf.h" #ifdef ENABLE_ARCHIVE -- cgit v1.2.3